diff --git a/DEPS b/DEPS index 28e08e9..592731a 100644 --- a/DEPS +++ b/DEPS
@@ -299,19 +299,19 @@ # 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': 'db706fd37874f786e82238b58a4c3799fa430f60', + 'skia_revision': '365d47466356c3666a5319baf262153cf393ab86', # 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': '7d09849bb20b29cc989b14e62e086f1ded0a4134', + 'v8_revision': '0a3957f54665939324a11b9cc932e9d9332eefc9', # 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': '3f7bded1c0334b099461de9b19ecc00d832ebc5a', + 'angle_revision': '4a5e20f2c1478058a27fa578696b262d95a747b6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '96085ee3c6cc7bbb839880279efc85cbf122ec6b', + 'swiftshader_revision': 'f70c1194c1730893f7848cff07ca4ec196269709', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -375,7 +375,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. - 'crossbench_revision': '8f9e09ad773d1e3fbb3021d3ab09246db491df5c', + 'crossbench_revision': '55f89b770f9573fb07765a4975ee586640feaf63', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -391,7 +391,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': 'a606a77310848ca4f22c139777106f9100f8e318', + 'devtools_frontend_revision': '9901bf08fdd7f65bc1561e71331ff10b4df614e5', # 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. @@ -415,7 +415,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': 'f1ac40b54eb53282eff2e587a08fae81de9408ea', + 'dawn_revision': '449c0afbaf08f5e1c1f6e2edfa41ada6bd166c58', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -451,7 +451,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling crabbyavif # and whatever else without interference from each other. - 'crabbyavif_revision': 'b097e11df62db2a6b8561f60aeae0718901122cb', + 'crabbyavif_revision': '91072f337edd69508dbefaf290f01722e228738a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Speedometer main # and whatever else without interference from each other. @@ -495,7 +495,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. - 'libcxxabi_revision': '069652e9cbca8e3b5e2371057a206f91f2f710f6', + 'libcxxabi_revision': '9810fb23f6ba666f017c2b67c67de2bcac2b44bd', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1486,7 +1486,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '968450ab8d1bcffb25acc11625dc295076a5c2d1', + '8940c82382a30562518d86b3476b1d5c668d1d0a', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1948,7 +1948,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' + '@' + 'ac8a9cb56cfff1346e2f2b9b77175e7a748ad10b', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '3808d0167301afd2a0a9c45b0b19dd07f3dce1fc', 'condition': 'checkout_chromeos', }, @@ -2025,7 +2025,7 @@ # Used for embedded builds. CrOS & Linux use the system version. 'src/third_party/fontconfig/src': { - 'url': Var('chromium_git') + '/external/fontconfig.git' + '@' + '14d466b30a8ab4a9d789977ed94f2c30e7209267', + 'url': Var('chromium_git') + '/external/fontconfig.git' + '@' + '24ed9b4d73dc068ed2baeb0da583c51879d5cabc', 'condition': 'checkout_linux', }, @@ -2526,7 +2526,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '99c9ef8102d3770e6d5ba91d9ca400b751b0af9b', + Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'db280603c217b4abb469b09f543f0713f906da5c', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -2894,7 +2894,7 @@ Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'), 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'e30e216756cb9bdee35074b8020a78e26c981d94', + Var('webrtc_git') + '/src.git' + '@' + 'cc46fb91c5f8bd4cba637f6ebfaa5f278efc4458', # 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. @@ -3027,7 +3027,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'wA9PJ2N4w88a9MERsOsukx6ftSzEYGRQ_mRHgJW8l7oC', + 'version': 'cPjkmpV8NlcBLKoJWRkK_B2cXLR-k3aTqbfzY53KJAcC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/OWNERS b/OWNERS index 72c7be7..4a0719b5 100644 --- a/OWNERS +++ b/OWNERS
@@ -20,23 +20,19 @@ per-file .mailmap=* per-file .rustfmt.toml=file://styleguide/rust/OWNERS per-file .vpython3=bpastene@chromium.org -per-file .vpython3=dpranke@google.com per-file .vpython3=tikuta@chromium.org per-file .vpython3=file://third_party/protobuf/OWNERS # For protobuf wheels changes per-file .yapfignore=* per-file AUTHORS=* per-file BUILD.gn=file://build/OWNERS -per-file CODE_OF_CONDUCT.md=dpranke@google.com per-file CODE_OF_CONDUCT.md=ellyjones@chromium.org per-file CPPLINT.cfg=file://styleguide/c++/OWNERS per-file DEPS=* per-file DEPS=bryner@google.com # For new DEPS hook -per-file DEPS=dpranke@google.com # For new DEPS hook per-file DEPS=gatong@chromium.org # For new DEPS hook per-file DEPS=treilly@google.com # For new DEPS hook per-file PRESUBMIT*.py=agrieve@chromium.org # For .pydeps changes per-file PRESUBMIT*.py=dcheng@chromium.org -per-file PRESUBMIT*.py=dpranke@google.com per-file PRESUBMIT*.py=battre@chromium.org per-file PRESUBMIT*.py=wnwen@chromium.org # For .pydeps changes per-file README.md=*
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 698f46ba..5572e4ce2 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -1244,6 +1244,11 @@ # so there are some Chrome-only native dependencies that sneak into WebView. # To fix, we can just remove any uncalled Java->Native methods. remove_uncalled_jni = true + + if (!(defined(testonly) && testonly)) { + configs -= [ "//build/config/compiler:thinlto_optimize_default" ] + configs += [ "//build/config/compiler:thinlto_optimize_max" ] + } } }
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 d76ca19..a4e264d 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
@@ -12,6 +12,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; +import androidx.annotation.WorkerThread; import org.chromium.android_webview.AwBrowserContext; import org.chromium.android_webview.common.Lifetime; @@ -19,6 +20,7 @@ import org.chromium.base.TraceEvent; import java.util.concurrent.Executor; +import java.util.function.Consumer; /** * An abstraction of {@link AwBrowserContext}, this class reflects the state needed for the @@ -75,7 +77,7 @@ public CookieManager getCookieManager() { String traceArgs = String.format("{name: \"%s\"}", mName); try (TraceEvent event = - TraceEvent.scoped("WebView.Profile.GET_COOKIE_MANAGER", traceArgs)) { + TraceEvent.scoped("WebView.Profile.ApiCall.GET_COOKIE_MANAGER", traceArgs)) { return mCookieManager; } } @@ -101,14 +103,8 @@ @Nullable PrefetchParams params, Executor callbackExecutor, PrefetchOperationCallback resultCallback) { - try (TraceEvent event = TraceEvent.scoped("WebView.Profile.Prefetch.PRE_START")) { - if (url == null) { - throw new IllegalArgumentException("URL cannot be null for prefetch."); - } - - if (resultCallback == null) { - throw new IllegalArgumentException("Callback cannot be null for prefetch."); - } + try (TraceEvent event = TraceEvent.scoped("WebView.Profile.ApiCall.Prefetch.PRE_START")) { + validatePrefetchArgs(url, resultCallback); return mBrowserContext .getPrefetchManager() .startPrefetchRequest( @@ -119,6 +115,27 @@ } } + @WorkerThread + public void prefetchUrlAsync( + String url, + @Nullable PrefetchParams params, + Executor callbackExecutor, + PrefetchOperationCallback resultCallback, + Consumer<Integer> prefetchKeyListener) { + try (TraceEvent event = + TraceEvent.scoped("WebView.Profile.ApiCall.Prefetch.PRE_START_ASYNC")) { + validatePrefetchArgs(url, resultCallback); + mBrowserContext + .getPrefetchManager() + .startPrefetchRequestAsync( + url, + params == null ? null : params.toAwPrefetchParams(), + new ProfileWebViewPrefetchCallback(callbackExecutor, resultCallback), + callbackExecutor, + prefetchKeyListener); + } + } + @UiThread public void clearPrefetch(String url, PrefetchOperationCallback resultCallback) { // TODO(334016945): do the actual implementation @@ -140,4 +157,14 @@ mBrowserContext.setMaxPrerenders(speculativeLoadingConfig.maxPrerenders); } } + + private static void validatePrefetchArgs(String url, PrefetchOperationCallback resultCallback) { + if (url == null) { + throw new IllegalArgumentException("URL cannot be null for prefetch."); + } + + if (resultCallback == null) { + throw new IllegalArgumentException("Callback cannot be null for prefetch."); + } + } }
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 8c71cbfd..18a052f 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -996,6 +996,18 @@ mBrowserContextSetExplicitly = true; } try (ScopedSysTraceEvent e1 = ScopedSysTraceEvent.scoped("AwContents.constructor")) { + mBrowserContext = browserContext; + // Immediately drain any prefetch requests that have been queued as soon as we have the + // browser context. + // We will do this again at the end of the constructor in case any + // prefetch requests + // have been queued during this constructor's execution. Longer term, and once the + // prefetch infra + // has been moved off of the UI thread, we will be able to clean this up (see + // crbug.com/363939616), but + // for now we need to attempt to clear the prefetch queue in multiple places. + // TODO (crbug.com/363939616) Clean this up once prefetch infra supports bg thread. + mBrowserContext.getPrefetchManager().executeQueuedPrefetchRequests(); mDisplayModeController = new AwDisplayModeController( new AwDisplayModeController.Delegate() { @@ -1034,8 +1046,6 @@ mSettings = settings; updateDefaultLocale(); - mBrowserContext = browserContext; - // setWillNotDraw(false) is required since WebView draws its own contents using its // container view. If this is ever not the case we should remove this, as it removes // Android's gatherTransparentRegion optimization for the view. @@ -1109,6 +1119,11 @@ onContainerViewChanged(); } + // Drain any scheduled prefetch requests that may have happened during this constructor's + // execution. We will be able to clean this up once the prefetch infra is moved off of the + // UI thread. + // TODO (crbug.com/363939616) Clean this up once prefetch infra supports bg thread. + mBrowserContext.getPrefetchManager().executeQueuedPrefetchRequests(); long delta = SystemClock.uptimeMillis() - startTime; RecordHistogram.recordTimesHistogram(CONSTRUCTOR_HISTOGRAM_NAME, delta); if (mId == 1) { @@ -2458,13 +2473,16 @@ /** * Load url without fixing up the url string. Consumers of ContentView are responsible for - * ensuring the URL passed in is properly formatted (i.e. the scheme has been added if left - * off during user input). + * ensuring the URL passed in is properly formatted (i.e. the scheme has been added if left off + * during user input). * * @param params Parameters for this load. */ @VisibleForTesting public void loadUrl(LoadUrlParams params) { + // Drain any pending prefetch requests from the queue. + // TODO (crbug.com/363939616) Clean this up once prefetch infra supports bg thread. + mBrowserContext.getPrefetchManager().executeQueuedPrefetchRequests(); if (params.getBaseUrl() == null) { // Don't record the URL if this was loaded via loadDataWithBaseURL(). That API is // tracked separately under Android.WebView.LoadDataWithBaseUrl.BaseUrl.
diff --git a/android_webview/java/src/org/chromium/android_webview/AwPrefetchManager.java b/android_webview/java/src/org/chromium/android_webview/AwPrefetchManager.java index 5013b8e..bac4e52 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwPrefetchManager.java +++ b/android_webview/java/src/org/chromium/android_webview/AwPrefetchManager.java
@@ -10,6 +10,7 @@ import androidx.annotation.Nullable; import androidx.annotation.UiThread; import androidx.annotation.VisibleForTesting; +import androidx.annotation.WorkerThread; import org.jni_zero.CalledByNative; import org.jni_zero.JNINamespace; @@ -24,13 +25,31 @@ import org.chromium.content_public.browser.ContentFeatureList; import java.util.Optional; +import java.util.Queue; +import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Executor; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Consumer; @JNINamespace("android_webview") @Lifetime.Profile public class AwPrefetchManager { private final long mNativePrefetchManager; + private final Queue<Runnable> mQueuedPrefetchRequests = new ConcurrentLinkedQueue<>(); + + /** + * A flag to prevent scheduling {@link #executeQueuedPrefetchRequests()} multiple times + * redundantly. + */ + private final AtomicBoolean mIsPrefetchExecutionScheduled = new AtomicBoolean(false); + + @Nullable private CallbackForTesting mCallbackForTesting; + + public interface CallbackForTesting { + void onPrefetchExecuted(); + } + public AwPrefetchManager(long nativePrefetchManager) { mNativePrefetchManager = nativePrefetchManager; } @@ -40,13 +59,35 @@ return new AwPrefetchManager(nativePrefetchManager); } - @UiThread - public int startPrefetchRequest( - @NonNull String url, - @Nullable AwPrefetchParameters prefetchParameters, - @NonNull AwPrefetchCallback callback, - @NonNull Executor callbackExecutor) { - assert ThreadUtils.runningOnUiThread(); + @Nullable + private static Exception getStartPrefetchErrorOrNull( + String url, AwPrefetchParameters prefetchParameters) { + final Exception error; + if (!UrlUtilities.isHttps(url)) { + error = new IllegalArgumentException("URL must have HTTPS scheme for prefetch."); + } else if (!AwFeatureMap.isEnabled( + ContentFeatureList.PREFETCH_BROWSER_INITIATED_TRIGGERS)) { + error = + new IllegalStateException( + "WebView initiated prefetching feature is not" + " enabled."); + } else if (prefetchParameters != null) { + Optional<IllegalArgumentException> exception = + AwBrowserContext.validateAdditionalHeaders( + prefetchParameters.getAdditionalHeaders()); + if (exception.isPresent()) { + error = exception.get(); + } else { + error = null; + } + } else { + error = null; + } + return error; + } + + @NonNull + private static String buildStartPrefetchTraceArgs( + String url, AwPrefetchParameters prefetchParameters) { String traceArgs; if (prefetchParameters != null && prefetchParameters.getExpectedNoVarySearch() != null) { traceArgs = @@ -56,40 +97,74 @@ } else { traceArgs = String.format("{\n url: %s\n}", url); } + return traceArgs; + } + + public void setCallbackForTesting(@Nullable CallbackForTesting callbackForTesting) { + mCallbackForTesting = callbackForTesting; + } + + @UiThread + public int startPrefetchRequest( + @NonNull String url, + @Nullable AwPrefetchParameters prefetchParameters, + @NonNull AwPrefetchCallback callback, + @NonNull Executor callbackExecutor) { + assert ThreadUtils.runningOnUiThread(); + Exception error = getStartPrefetchErrorOrNull(url, prefetchParameters); + if (error != null) { + callbackExecutor.execute(() -> callback.onError(error)); + return AwPrefetchManagerJni.get().getNoPrefetchKey(); + } + String traceArgs = buildStartPrefetchTraceArgs(url, prefetchParameters); try (TraceEvent event = TraceEvent.scoped("WebView.Profile.Prefetch.START", traceArgs)) { - final Exception error; - if (!UrlUtilities.isHttps(url)) { - error = new IllegalArgumentException("URL must have HTTPS scheme for prefetch."); - } else if (!AwFeatureMap.isEnabled( - ContentFeatureList.PREFETCH_BROWSER_INITIATED_TRIGGERS)) { - error = - new IllegalStateException( - "WebView initiated prefetching feature is not" + " enabled."); - } else if (prefetchParameters != null) { - Optional<IllegalArgumentException> exception = - AwBrowserContext.validateAdditionalHeaders( - prefetchParameters.getAdditionalHeaders()); - if (exception.isPresent()) { - error = exception.get(); - } else { - error = null; - } - } else { - error = null; + int prefetchKey = + AwPrefetchManagerJni.get() + .startPrefetchRequest( + mNativePrefetchManager, + url, + prefetchParameters, + callback, + callbackExecutor); + if (mCallbackForTesting != null) { + mCallbackForTesting.onPrefetchExecuted(); } + return prefetchKey; + } + } - if (error != null) { - callbackExecutor.execute(() -> callback.onError(error)); - return AwPrefetchManagerJni.get().getNoPrefetchKey(); + @WorkerThread + public void startPrefetchRequestAsync( + @NonNull String url, + @Nullable AwPrefetchParameters prefetchParameters, + @NonNull AwPrefetchCallback callback, + @NonNull Executor callbackExecutor, + @NonNull Consumer<Integer> prefetchKeyListener) { + assert !ThreadUtils.runningOnUiThread(); + Runnable startPrefetchRunnable = + () -> + prefetchKeyListener.accept( + startPrefetchRequest( + url, prefetchParameters, callback, callbackExecutor)); + mQueuedPrefetchRequests.offer(startPrefetchRunnable); + + // Atomically check if the prefetch execution is scheduled, and if not, set it to true + // and schedule. + if (mIsPrefetchExecutionScheduled.compareAndSet(false, true)) { + ThreadUtils.postOnUiThread(this::executeQueuedPrefetchRequests); + } + } + + @UiThread + public void executeQueuedPrefetchRequests() { + assert ThreadUtils.runningOnUiThread(); + try (TraceEvent event = + TraceEvent.scoped("WebView.Profile.Prefetch.EXECUTE_SCHEDULED_REQUESTS")) { + mIsPrefetchExecutionScheduled.set(false); + Runnable prefetchTask; + while ((prefetchTask = mQueuedPrefetchRequests.poll()) != null) { + prefetchTask.run(); } - - return AwPrefetchManagerJni.get() - .startPrefetchRequest( - mNativePrefetchManager, - url, - prefetchParameters, - callback, - callbackExecutor); } }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwPrefetchTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwPrefetchTest.java index d6f326c..c4c0497 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwPrefetchTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwPrefetchTest.java
@@ -20,6 +20,7 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.UseParametersRunnerFactory; +import org.chromium.android_webview.AwContents; import org.chromium.android_webview.AwNoVarySearchData; import org.chromium.android_webview.AwPrefetchCallback; import org.chromium.android_webview.AwPrefetchManager; @@ -28,6 +29,7 @@ import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.DoNotBatch; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Features; @@ -37,7 +39,11 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; /** * This test should cover all WebView's expectations for Prefetch. Changing any of these tests @@ -52,10 +58,12 @@ // page with different resources in it. private static final String BASIC_PREFETCH_URL = "/android_webview/test/data/hello_world.html"; + private final TestAwContentsClient mContentsClient; private String mPrefetchUrl; public AwPrefetchTest(AwSettingsMutation param) { mActivityTestRule = new AwActivityTestRule(param.getMutation()); + mContentsClient = new TestAwContentsClient(); } @Rule public AwActivityTestRule mActivityTestRule; @@ -321,6 +329,164 @@ }); } + @Test + @LargeTest + @Feature({"AndroidWebView"}) + public void testPrefetchQueueDrainedWhenUiThreadIsFree_VerifyPrefetchExecutionCount() { + AtomicInteger executedPrefetchCount = new AtomicInteger(0); + AwPrefetchManager prefetchManager = + mActivityTestRule.getAwBrowserContext().getPrefetchManager(); + prefetchManager.setCallbackForTesting(executedPrefetchCount::incrementAndGet); + + // Latch for the UI thread to block on. + CountDownLatch uiThreadBlockLatch = new CountDownLatch(1); + + // This ensures the UI thread is waiting BEFORE the drain tasks posted by + // startPrefetchRequestAsync can be processed. + ThreadUtils.runOnUiThread( + () -> { + try { + // The UI thread will stop here and wait until + // uiThreadBlockLatch.countDown() is called + // from another thread. + Assert.assertTrue( + "UI thread timed out waiting for instrumentation thread to finish" + + " queueing prefetch requests.", + uiThreadBlockLatch.await(5, TimeUnit.SECONDS)); + } catch (InterruptedException e) { + throw new RuntimeException("UI thread interrupted while blocked", e); + } + }); + + int numberOfPrefetches = 5; + AwPrefetchParameters prefetchParameters = getAwPrefetchParameters(); + TestAwPrefetchCallback callback = new TestAwPrefetchCallback(); + + for (int i = 0; i < numberOfPrefetches; i++) { + // Call the async start prefetch method from the instrumentation thread. + // This adds a prefetch request to a queue AND + // posts a drain task to the UI thread (non-redundantly). + // The UI thread is currently blocked by uiThreadBlockLatch.await(), + // so the drain task will sit in its message queue until the latch is released. + prefetchManager.startPrefetchRequestAsync( + mPrefetchUrl, prefetchParameters, callback, Runnable::run, integer -> {}); + } + + Assert.assertEquals( + "Prefetches should be blocked from executing while UI thread is blocked.", + 0, + executedPrefetchCount.intValue()); + + // Signal the UI thread latch to unblock it. + uiThreadBlockLatch.countDown(); + + // At this point, the UI thread has been unblocked + // and is now free to process its message queue, including the drain task. + // Wait for the UI thread to process the queue and drain it to 0. + // CriteriaHelper.pollInstrumentationThread runs on the instrumentation thread, + // allowing the UI thread to run concurrently. + CriteriaHelper.pollInstrumentationThread( + () -> executedPrefetchCount.intValue() == numberOfPrefetches, + "Prefetch queue did not drain after UI thread was unblocked."); + prefetchManager.setCallbackForTesting(null); + } + + @Test + @LargeTest + @Feature({"AndroidWebView"}) + public void testPrefetchQueueExplicitlyDrainedDuringAwContentsInitAndLoadUrl() { + // Latch to block `AwContents` creation. + CountDownLatch awContentsCreationLatch = new CountDownLatch(1); + AtomicBoolean prefetchQueueDrainedDuringAwContentsConstructor = new AtomicBoolean(false); + CountDownLatch awContentsConstructorFinishedLatch = new CountDownLatch(1); + + // Latch to block `AwContents#loadUrl` call. + CountDownLatch loadUrlLatch = new CountDownLatch(1); + AtomicBoolean prefetchQueueDrainedDuringLoadUrl = new AtomicBoolean(false); + + AwPrefetchManager prefetchManager = + mActivityTestRule.getAwBrowserContext().getPrefetchManager(); + ThreadUtils.runOnUiThread( + () -> { + try { + // Verify we drain the prefetch queue during `AwContents` constructor. + // Wait on the `AwContents` latch to release. + prefetchManager.setCallbackForTesting( + () -> prefetchQueueDrainedDuringAwContentsConstructor.set(true)); + Assert.assertTrue( + "UI thread timed out waiting for instrumentation thread to finish" + + " queueing prefetch requests before AwContents constructor.", + awContentsCreationLatch.await(5, TimeUnit.SECONDS)); + Assert.assertFalse(prefetchQueueDrainedDuringAwContentsConstructor.get()); + mActivityTestRule.startBrowserProcess(); + AwContents awContents = + mActivityTestRule + .createAwTestContainerViewOnMainSync(mContentsClient) + .getAwContents(); + Assert.assertTrue( + "Queued prefetches were not executed during AwContents" + + " constructor.", + prefetchQueueDrainedDuringAwContentsConstructor.get()); + awContentsConstructorFinishedLatch.countDown(); + + // Verify we drain the prefetch queue after loadUrl() is called. + prefetchManager.setCallbackForTesting( + () -> prefetchQueueDrainedDuringLoadUrl.set(true)); + Assert.assertTrue( + "UI thread timed out waiting for instrumentation thread to finish" + + " queueing prefetch requests before loadUrl() call.", + loadUrlLatch.await(5, TimeUnit.SECONDS)); + Assert.assertFalse(prefetchQueueDrainedDuringLoadUrl.get()); + awContents.loadUrl("about:blank"); + Assert.assertTrue( + "Queued prefetches were not executed during AwContents#loadUrl.", + prefetchQueueDrainedDuringAwContentsConstructor.get()); + + } catch (InterruptedException e) { + throw new RuntimeException("UI thread interrupted while blocked", e); + } + }); + + AwPrefetchParameters prefetchParameters = getAwPrefetchParameters(); + TestAwPrefetchCallback callback = new TestAwPrefetchCallback(); + + // Make a prefetch request on the instrumentation thread then release the `AwContents` + // countdown latch. + prefetchManager.startPrefetchRequestAsync( + mPrefetchUrl, prefetchParameters, callback, Runnable::run, integer -> {}); + awContentsCreationLatch.countDown(); + + // Wait for the `AwContents` constructor to complete and the latch to be released. + try { + Assert.assertTrue( + "Instrumentation thread timed out waiting for UI thread to finish with the" + + " AwContents constructor.", + awContentsConstructorFinishedLatch.await(5, TimeUnit.SECONDS)); + } catch (InterruptedException e) { + throw new RuntimeException( + "Instrumentation thread interrupted waiting for AwContents constructor to" + + " finish.", + e); + } + + // Make another prefetch request on the instrumentation thread then release the + // `AwContents#loadUrl` latch. + prefetchManager.startPrefetchRequestAsync( + mPrefetchUrl, prefetchParameters, callback, Runnable::run, integer -> {}); + loadUrlLatch.countDown(); + } + + private static AwPrefetchParameters getAwPrefetchParameters() { + AwNoVarySearchData expectedNoVarySearch = + new AwNoVarySearchData(false, false, new String[] {"ts", "uid"}, null); + Map<String, String> additionalHeaders = new HashMap<>(); + additionalHeaders.put("foo", "bar"); + additionalHeaders.put("lorem", "ipsum"); + AwPrefetchParameters prefetchParameters = + new AwPrefetchParameters(additionalHeaders, expectedNoVarySearch, true); + return prefetchParameters; + } + private TestAwPrefetchCallback startPrefetchingAndWait( String url, AwPrefetchParameters prefetchParameters) { TestAwPrefetchCallback callback = new TestAwPrefetchCallback();
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 bf189eb..e27cb35 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
@@ -17,10 +17,12 @@ import com.android.webview.chromium.PrefetchOperationCallback; import com.android.webview.chromium.PrefetchOperationStatusCode; +import com.android.webview.chromium.PrefetchParams; import com.android.webview.chromium.Profile; import com.android.webview.chromium.SpeculativeLoadingConfig; import org.chromium.android_webview.common.Lifetime; +import org.chromium.base.ThreadUtils; import org.chromium.support_lib_boundary.PrefetchOperationCallbackBoundaryInterface; import org.chromium.support_lib_boundary.ProfileBoundaryInterface; import org.chromium.support_lib_boundary.SpeculativeLoadingConfigBoundaryInterface; @@ -30,6 +32,7 @@ import java.lang.reflect.InvocationHandler; import java.util.concurrent.Executor; +import java.util.function.Consumer; /** The support-lib glue implementation for Profile, delegates all the calls to {@link Profile}. */ @Lifetime.Profile @@ -82,10 +85,8 @@ Executor callbackExecutor, /* PrefetchOperationCallback */ InvocationHandler callback) { recordApiCall(ApiCall.PREFETCH_URL); - int prefetchKey = - mProfileImpl.prefetchUrl( - url, null, callbackExecutor, createOperationCallback(callback)); - setCancelListener(cancellationSignal, prefetchKey); + prefetchUrlInternal( + url, null, cancellationSignal, callbackExecutor, createOperationCallback(callback)); } @Override @@ -101,16 +102,40 @@ SpeculativeLoadingParametersBoundaryInterface.class, speculativeLoadingParams); - int prefetchKey = - mProfileImpl.prefetchUrl( - url, - SupportLibSpeculativeLoadingParametersAdapter - .fromSpeculativeLoadingParametersBoundaryInterface( - speculativeLoadingParameters), - callbackExecutor, - createOperationCallback(callback)); + assert speculativeLoadingParameters != null; + PrefetchParams prefetchParams = + SupportLibSpeculativeLoadingParametersAdapter + .fromSpeculativeLoadingParametersBoundaryInterface( + speculativeLoadingParameters); + prefetchUrlInternal( + url, + prefetchParams, + cancellationSignal, + callbackExecutor, + createOperationCallback(callback)); + } - setCancelListener(cancellationSignal, prefetchKey); + private void prefetchUrlInternal( + String url, + @Nullable PrefetchParams prefetchParams, + @Nullable CancellationSignal cancellationSignal, + Executor callbackExecutor, + PrefetchOperationCallback callback) { + if (ThreadUtils.runningOnUiThread()) { + int prefetchKey = + mProfileImpl.prefetchUrl(url, prefetchParams, callbackExecutor, callback); + setCancelListener(cancellationSignal, prefetchKey); + } else { + Consumer<Integer> prefetchKeyListener = + new Consumer<Integer>() { + @Override + public void accept(Integer prefetchKey) { + setCancelListener(cancellationSignal, prefetchKey); + } + }; + mProfileImpl.prefetchUrlAsync( + url, prefetchParams, callbackExecutor, callback, prefetchKeyListener); + } } public void setCancelListener(CancellationSignal cancellationSignal, int prefetchKey) {
diff --git a/ash/capture_mode/OWNERS b/ash/capture_mode/OWNERS index db8d6fe..70fb5c84 100644 --- a/ash/capture_mode/OWNERS +++ b/ash/capture_mode/OWNERS
@@ -1,3 +1,2 @@ minch@chromium.org xdai@chromium.org -afakhry@chromium.org #{LAST_RESORT_SUGGESTION}
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 8c5da81..a25a92d 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Druk <ph name="MODIFIER" /> en klik ’n skakel</translation> <translation id="2957159466053076448">Jy kan hierdie kenmerke enige tyd in Instellings afskakel. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Toesteloudio</translation> -<translation id="2960314608273155470">Vasvangmodus; verstek is <ph name="SOURCE" /> <ph name="TYPE" />. Druk Tab vir sleutelbordnavigasie</translation> <translation id="2961963223658824723">Iets het verkeerd gegaan. Probeer oor 'n paar sekondes weer.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Skakel mikrofoontoegang aan?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Skep Google Dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 lêer}other{# lêers}}</translation> <translation id="8936501819958976551">gedeaktiveer</translation> -<translation id="8937312474322077653">In skermskoot, stel op <ph name="SOURCE" /> <ph name="TYPE" />. Druk oortjie om vasvangtipe te kies. Druk spasiebalk om streek te kies. Druk Enter om vas te vang.</translation> <translation id="8938800817013097409">USB C-toestel (regterpoort aan agterkant)</translation> <translation id="8939855324412367560">Invoeroudio is "<ph name="INPUT_DEVICE_NAME" />" en uitvoeroudio is "<ph name="OUTPUT_DEVICE_NAME" />". Gaan na Instellings om te verander.</translation> <translation id="8940956008527784070">Battery laag (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 4b4ede98..1593547 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" />ን ይጫኑ እና አገናኝ ላይ ጠቅ ያድርጉ</translation> <translation id="2957159466053076448">እነዚህን ባህሪያት በማንኛውም ጊዜ ቅንብሮች ውስጥ ማጥፋት ይችላሉ። <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">የመሣሪያ ኦዲዮ</translation> -<translation id="2960314608273155470">የቀረጻ ሁነታ፣ ነባሪው <ph name="SOURCE" /> <ph name="TYPE" /> ነው። ለቁልፍ ሰሌዳ አሰሳ ትርን ይጫኑ።</translation> <translation id="2961963223658824723">የሆነ ስህተት ተከስቷል። በጥቂት ሰከንዶች ውስጥ እንደገና ይሞክሩ።</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">የማይክሮፎን መዳረሻ ይብራ?</translation> @@ -2435,7 +2434,6 @@ <translation id="8934418770423095813">Google ሰነድን ይጫኑ</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ፋይል}one{# ፋይል}other{# ፋይሎች}}</translation> <translation id="8936501819958976551">ቦዝኗል</translation> -<translation id="8937312474322077653">የማያ ገፅ ቀረፃ ውስጥ ወደ <ph name="SOURCE" /> <ph name="TYPE" /> ያቀናብሩ። የቀረጻ ዓይነት ለመምረጥ ትርን መታ ያድርጉ። ክልልን ለመምረጥ ክፍተት ይጫኑ። ለመቅረጽ አስገባን ይጫኑ።</translation> <translation id="8938800817013097409">USB-C መሣሪያ (የቀኝ ወደብ ከኋላ በኩል)</translation> <translation id="8939855324412367560">የግብዓት ኦዲዮው «<ph name="INPUT_DEVICE_NAME" />» ነው እና የውፅዓት ኦዲዮው «<ph name="OUTPUT_DEVICE_NAME" />» ነው። ለመቀየር ወደ ቅንብሮች ይሂዱ።</translation> <translation id="8940956008527784070">ባትሪ ዝቅተኛ ነው (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index 298bb8e..9f1da98 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -580,7 +580,6 @@ <translation id="2949420361496057765">اضغط على <ph name="MODIFIER" /> ثم انقر على الرابط.</translation> <translation id="2957159466053076448">يمكنك إيقاف هذه الميزات في أي وقت من خلال "الإعدادات". <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">صوت الجهاز</translation> -<translation id="2960314608273155470">وضع الالتقاط، الإعداد التلقائي هو <ph name="SOURCE" /> <ph name="TYPE" />. اضغط على مفتاح Tab للتنقّل على لوحة المفاتيح.</translation> <translation id="2961963223658824723">حدث خطأ. يُرجى إعادة المحاولة خلال بضع ثوانٍ.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">هل تريد السماح بالوصول إلى الميكروفون؟</translation> @@ -2432,7 +2431,6 @@ <translation id="8934418770423095813">إنشاء مستند Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{ملف واحد}zero{# ملف}two{ملفان}few{# ملفات}many{# ملفًا}other{# ملف}}</translation> <translation id="8936501819958976551">غير مفعّلة</translation> -<translation id="8937312474322077653">في ميزة "لقطة الشاشة"، عليك ضبط الإعدادات على "<ph name="SOURCE" />" من النوع "<ph name="TYPE" />". يُرجى الضغط على مفتاح التبويب لاختيار نوع الالتقاط. ويُرجى الضغط على مفتاح المسافة لاختيار المنطقة، ثم الضغط على مفتاح Enter لأخذ لقطة شاشة.</translation> <translation id="8938800817013097409">جهاز USB-C (المنفذ الأيمن في الخلف)</translation> <translation id="8939855324412367560">إنّ مصدر إدخال الصوت هو "<ph name="INPUT_DEVICE_NAME" />" ومصدر إخراجه هو "<ph name="OUTPUT_DEVICE_NAME" />". انتقِل إلى "الإعدادات" لتغييرهما.</translation> <translation id="8940956008527784070">طاقة البطارية منخفضة (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 1f65e11..9a54d62 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> টিপক আৰু এটা লিংকত ক্লিক কৰক</translation> <translation id="2957159466053076448">আপুনি যিকোনো সময়তে ছেটিঙত এই সুবিধাসমূহ অফ কৰিব পাৰে। <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">ডিভাইচৰ অডিঅ’</translation> -<translation id="2960314608273155470">কেপচাৰ ম’ড, ডিফ’ল্টটো হৈছে <ph name="SOURCE" /> <ph name="TYPE" />। কীব’ৰ্ড নেভিগেশ্বনৰ বাবে টেব টিপক।</translation> <translation id="2961963223658824723">কিবা এটা ভুল হৈছে। কেই ছেকেণ্ডমানৰ পাছত পুনৰ চেষ্টা কৰক।</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">মাইক্ৰ’ফ’নৰ এক্সেছ অন কৰিবনে?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google Doc সৃষ্টি কৰক</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{১ টা ফাইল}one{# টা ফাইল}other{# টা ফাইল}}</translation> <translation id="8936501819958976551">অক্ষম কৰা হৈছে</translation> -<translation id="8937312474322077653">স্ক্ৰীন কেপচাৰ কৰা ম’ডত, <ph name="SOURCE" /> <ph name="TYPE" />লৈ ছেট কৰক। কেপচাৰ প্ৰকাৰ বাছনি কৰিবলৈ টেবত টিপক। অঞ্চল বাছনি কৰিবলৈ স্পে’চত টিপক। কেপচাৰ কৰিবলৈ এণ্টাৰ টিপক।</translation> <translation id="8938800817013097409">USB-C ডিভাইচ (পিছফালৰ সোঁফালৰ প’র্ট)</translation> <translation id="8939855324412367560">অডিঅ’ ইনপুটটো হৈছে "<ph name="INPUT_DEVICE_NAME" />" আৰু আউটপুট অডিঅ’টো হৈছে "<ph name="OUTPUT_DEVICE_NAME" />"। সলনি কৰিবলৈ ছেটিঙলৈ যাওক।</translation> <translation id="8940956008527784070">বেটাৰীৰ চাৰ্জ কম আছে (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 9778c3f..edb0090 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> üzərinə basıb, keçidə klikləyin</translation> <translation id="2957159466053076448">Ayarlarda bu funksiyaları söndürə bilərsiniz. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Cihaz audiosu</translation> -<translation id="2960314608273155470">Çəkim Rejimi, defolt: <ph name="SOURCE" /> <ph name="TYPE" />. Klaviatura naviqasiyası üçün tab düyməsini basın.</translation> <translation id="2961963223658824723">Xəta baş verdi. Bir neçə dəqiqə sonra yenidən cəhd edin.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Mikrofona giriş aktiv edilsin?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google Sənəd Yaradın</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fayl}other{# fayl}}</translation> <translation id="8936501819958976551">deaktiv</translation> -<translation id="8937312474322077653">Ekran çəkimində <ph name="SOURCE" /> <ph name="TYPE" /> olaraq təyin edin. Çəkim növünü seçmək üçün taba basın. Sahəni seçmək üçün boşluq düyməsinə basın. Çəkmək üçün enter düyməsinə basın.</translation> <translation id="8938800817013097409">USB-C cihazı (arxadakı sağ port)</translation> <translation id="8939855324412367560">Giriş audiosu: "<ph name="INPUT_DEVICE_NAME" />". Çıxış audiosu: "<ph name="OUTPUT_DEVICE_NAME" />". Dəyişmək üçün Ayarlara keçin.</translation> <translation id="8940956008527784070">Enerji Azdır (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index e613091..85c4e990db 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Трымайце <ph name="MODIFIER" /> і націсніце на спасылку</translation> <translation id="2957159466053076448">Гэтыя функцыі можна выключыць у любы час у наладах. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Аўдыя з прылады</translation> -<translation id="2960314608273155470">Рэжым здымання, стандартна гэта <ph name="TYPE" /> (<ph name="SOURCE" />). Для навігацыі з дапамогай клавіятуры выкарыстоўвайце клавішу Tab.</translation> <translation id="2961963223658824723">Нешта пайшло не так. Паўтарыце спробу праз некалькі секунд.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Уключыць доступ да мікрафона?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Стварыць дакумент Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 файл}one{# файл}few{# файлы}many{# файлаў}other{# файла}}</translation> <translation id="8936501819958976551">выключыла</translation> -<translation id="8937312474322077653">Падчас здымання экрана задайце наступны параметр: <ph name="SOURCE" /> <ph name="TYPE" />. Націсніце клавішу Tab, каб выбраць тып здымка. Націсніце клавішу прабелу, каб выбраць вобласць. Націсніце клавішу "Увод", каб зрабіць здымак.</translation> <translation id="8938800817013097409">Прылада USB-C (задні порт справа)</translation> <translation id="8939855324412367560">Аўдыяўваход – "<ph name="INPUT_DEVICE_NAME" />", аўдыявыхад –<ph name="OUTPUT_DEVICE_NAME" />".Каб змяніць іх, перайдзіце ў налады.</translation> <translation id="8940956008527784070">Нізкі зарад акумулятара (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index 19c2dc1..201d072ee 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Натиснете <ph name="MODIFIER" /> и кликнете върху връзка</translation> <translation id="2957159466053076448">Можете да изключите тези функции по всяко време от настройките. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Аудио от устройството</translation> -<translation id="2960314608273155470">Стандартната опция за режима на заснемане е <ph name="SOURCE" /> <ph name="TYPE" />. Натиснете Tab за навигиране с клавиатурата.</translation> <translation id="2961963223658824723">Нещо се обърка. Опитайте отново след няколко секунди.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Да се включи ли достъпът до микрофона?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Създаване на документ в Google Документи</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 файл}other{# файла}}</translation> <translation id="8936501819958976551">деактивирана</translation> -<translation id="8937312474322077653">Във функцията за заснемане на екрана задайте <ph name="SOURCE" /> <ph name="TYPE" />. Натиснете Tab, за да изберете типа на заснемането. Натиснете клавиша за интервал, за да изберете регион. Натиснете Enter за заснемане.</translation> <translation id="8938800817013097409">Устройство с USB-C (десният порт на гърба)</translation> <translation id="8939855324412367560">Аудиовходът е <ph name="INPUT_DEVICE_NAME" />, а аудиоизходът – <ph name="OUTPUT_DEVICE_NAME" />. За промяна отворете „Настройки“.</translation> <translation id="8940956008527784070">Батерията е изтощена (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 844a32d..31f0919 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> প্রেস করুন এবং লিঙ্কে ক্লিক করুন</translation> <translation id="2957159466053076448">আপনি 'সেটিংস' থেকে যেকোনও সময় এইসব ফিচার বন্ধ করতে পারবেন। <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">ডিভাইস অডিও</translation> -<translation id="2960314608273155470">ক্যাপচার মোড, <ph name="SOURCE" /> <ph name="TYPE" /> ডিফল্ট হিসেবে সেট করা হয়েছে। কীবোর্ড ব্যবহার করে নেভিগেট করতে Tab কী প্রেস করুন।</translation> <translation id="2961963223658824723">কিছু সমস্যা হয়েছে। কয়েক সেকেন্ডের মধ্যে আবার চেষ্টা করুন।</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">মাইক্রোফোন অ্যাক্সেস চালু করতে চান?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Google Doc তৈরি করুন</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{১টি ফাইল}one{#টি ফাইল}other{#টি ফাইল}}</translation> <translation id="8936501819958976551">বন্ধ আছে</translation> -<translation id="8937312474322077653">স্ক্রিন ক্যাপচারে, <ph name="SOURCE" /> <ph name="TYPE" />-এ সেট করুন। ক্যাপচার করার ধরন বেছে নিতে ট্যাব প্রেস করুন। অঞ্চল বেছে নিতে স্পেস প্রেস করুন। ক্যাপচার করতে Enter প্রেস করুন।</translation> <translation id="8938800817013097409">USB-C ডিভাইস (পিছনের ডান পোর্ট)</translation> <translation id="8939855324412367560">"<ph name="INPUT_DEVICE_NAME" />" হল ইনপুট অডিও এবং "<ph name="OUTPUT_DEVICE_NAME" />" হল আউটপুট অডিও। পরিবর্তন করতে 'সেটিংস' মেনু দেখুন।</translation> <translation id="8940956008527784070">(<ph name="PERCENTAGE" />%) কম ব্যাটারি</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index a84f933dd..96d4ab35 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -462,6 +462,7 @@ <translation id="2530896289327917474">Uključite ili isključite navigaciju kursorom</translation> <translation id="2531025035050312891">uređaj je spor</translation> <translation id="2531107890083353124">Dok povlačite karticu pritisnite <ph name="KEY_ONE" /></translation> +<translation id="2532199152994248594">Povucite ili pritisnite razmaknicu da biste odabrali područje za snimanje</translation> <translation id="2545334090614121435">Pokušavate upotrijebiti tipku Home? Upotrijebite</translation> <translation id="254900897760075745">Kopiranje odabranog sadržaja u međumemoriju</translation> <translation id="2549711466868162843">Poboljšanje osvjetljenja</translation> @@ -581,7 +582,6 @@ <translation id="2949420361496057765">Pritisnite <ph name="MODIFIER" /> i kliknite na link</translation> <translation id="2957159466053076448">Možete isključiti ove funkcije bilo kada u Postavkama. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Zvuk na uređaju</translation> -<translation id="2960314608273155470">Način rada za snimanje, zadano je <ph name="SOURCE" /> <ph name="TYPE" />. Pritisnite Tab da navigirate tastaturom.</translation> <translation id="2961963223658824723">Nešto nije uredu. Pokušajte ponovo za nekoliko sekundi.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Uključiti pristup mikrofonu?</translation> @@ -1770,6 +1770,7 @@ <translation id="6700713906295497288">IME dugme menija</translation> <translation id="6704073473590541209">Odabrana ručica na desnom rubu; pomicanje pomoću tipki sa strelicom</translation> <translation id="6706742084323792866">Kačenje tastature</translation> +<translation id="6709719156428404245">Povucite ili pritisnite razmaknicu da biste odabrali područje za snimanje</translation> <translation id="6710213216561001401">Nazad</translation> <translation id="6723839937902243910">Uključivanje/isključivanje</translation> <translation id="672609503628871915">Pogledajte šta je novo</translation> @@ -2433,7 +2434,6 @@ <translation id="8934418770423095813">Kreiraj Google dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fajl}one{# fajl}few{# fajla}other{# fajlova}}</translation> <translation id="8936501819958976551">deaktivirano</translation> -<translation id="8937312474322077653">U snimanju ekrana postavite na <ph name="SOURCE" /> <ph name="TYPE" />. Pritisnite Tab da odaberete vrstu snimanja. Pritisnite tipku za razmak da odaberete regiju. Pritisnite Enter da snimite ekran.</translation> <translation id="8938800817013097409">USB-C uređaj (desni priključak na stražnjoj strani)</translation> <translation id="8939855324412367560">Ulazni izvor zvuka je "<ph name="INPUT_DEVICE_NAME" />", a izlazni "<ph name="OUTPUT_DEVICE_NAME" />". Idite u Postavke da promijenite.</translation> <translation id="8940956008527784070">Baterija je slaba (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 85026f6b..ca40ac1 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Prem <ph name="MODIFIER" /> i fes clic en un enllaç</translation> <translation id="2957159466053076448">Pots desactivar aquestes funcions en qualsevol moment a Configuració. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Àudio del dispositiu</translation> -<translation id="2960314608273155470">Mode de captura, l'opció predeterminada és <ph name="TYPE" /> <ph name="SOURCE" />. Prem la tecla de tabulació per navegar amb el teclat.</translation> <translation id="2961963223658824723">S'ha produït un error. Torna-ho a provar d'aquí a uns quants segons.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Vols activar l'accés al micròfon?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Crea un document de Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fitxer}other{# fitxers}}</translation> <translation id="8936501819958976551">desactivada</translation> -<translation id="8937312474322077653">A la captura de pantalla, estableix en <ph name="TYPE" /> <ph name="SOURCE" />. Prem el tabulador per triar el tipus de captura. Prem la barra espaiadora per seleccionar la regió. Prem Retorn per capturar.</translation> <translation id="8938800817013097409">Dispositiu USB-C (port posterior dret)</translation> <translation id="8939855324412367560">L'àudio d'entrada és "<ph name="INPUT_DEVICE_NAME" />" i el de sortida, "<ph name="OUTPUT_DEVICE_NAME" />". Per canviar-ho, ves a Configuració.</translation> <translation id="8940956008527784070">Bateria baixa (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 9ca5d35f..279e0ea 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Stiskněte <ph name="MODIFIER" /> a klikněte na odkaz</translation> <translation id="2957159466053076448">Tyto funkce můžete v Nastavení kdykoli vypnout.<ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Zvuk zařízení</translation> -<translation id="2960314608273155470">Režim nahrávání, výchozí nastavení je <ph name="SOURCE" /> <ph name="TYPE" />. K procházení pomocí klávesnice použijte tabulátor.</translation> <translation id="2961963223658824723">Něco se pokazilo. Zkuste to znovu za několik minut.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Zapnout přístup k mikrofonu?</translation> @@ -2431,7 +2430,6 @@ <translation id="8934418770423095813">Vytvořit Dokument Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 soubor}few{# soubory}many{# souboru}other{# souborů}}</translation> <translation id="8936501819958976551">deaktivovala</translation> -<translation id="8937312474322077653">Je aktivní záznam obrazovky nastavený na <ph name="SOURCE" /> – <ph name="TYPE" />. Stisknutím klávesy Tab vyberete typ záznamu. Stisknutím mezerníku vyberete oblast. Stisknutím klávesy Enter pořídíte záznam.</translation> <translation id="8938800817013097409">Zařízení USB Type-C (pravý zadní port)</translation> <translation id="8939855324412367560">Vstupní zvukové zařízení je <ph name="INPUT_DEVICE_NAME" /> a výstupní zvukové zařízení je <ph name="OUTPUT_DEVICE_NAME" />. Můžete je změnit v nastavení.</translation> <translation id="8940956008527784070">Slabá baterie (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index 3ca2280..26efe677 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Pwyswch <ph name="MODIFIER" /> a chliciwch ddolen</translation> <translation id="2957159466053076448">Gallwch ddiffodd y nodweddion hyn ar unrhyw adeg yn y Gosodiadau. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Sain dyfais</translation> -<translation id="2960314608273155470">Diofyn y Modd Tynnu yw <ph name="SOURCE" /> <ph name="TYPE" />. Pwyswch Tab am lywio bysellfwrdd.</translation> <translation id="2961963223658824723">Aeth rhywbeth o'i le. Rhowch gynnig arall arni mewn ychydig eiliadau.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Troi mynediad meicroffon ymlaen?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Creu Google Doc</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ffeil}zero{# ffeil}two{# ffeil}few{# ffeil}many{# ffeil}other{# ffeil}}</translation> <translation id="8936501819958976551">wedi dadweithredu</translation> -<translation id="8937312474322077653">Yn y gosodiadau tynnu sgrinlun, gosodwch i <ph name="SOURCE" /> <ph name="TYPE" />. Pwyswch Tab i ddewis math o sgrinlun. Pwyswch Space i ddewis ardal. Pwyswch Enter i dynnu sgrinlun.</translation> <translation id="8938800817013097409">Dyfais USB-C (porth de yn y cefn)</translation> <translation id="8939855324412367560">Sain mewnbwn yw "<ph name="INPUT_DEVICE_NAME" />" a sain allbwn yw "<ph name="OUTPUT_DEVICE_NAME" />". Ewch i'r Gosodiadau i newid.</translation> <translation id="8940956008527784070">Mae'r batri'n isel (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 99191de..de7fd19 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Tryk på <ph name="MODIFIER" />, og klik på et link</translation> <translation id="2957159466053076448">Du kan til enhver tid deaktivere disse funktioner under Indstillinger. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Enhedslyd</translation> -<translation id="2960314608273155470">Optagelsestilstand, standard er <ph name="SOURCE" /> <ph name="TYPE" />. Tryk på Tab-tasten for at bruge tastaturnavigation.</translation> <translation id="2961963223658824723">Noget gik galt. Prøv igen om et par sekunder.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Vil du aktivere mikrofonadgangen?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Opret et Google-dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fil}one{# fil}other{# filer}}</translation> <translation id="8936501819958976551">deaktiverede</translation> -<translation id="8937312474322077653">Indstil til <ph name="SOURCE" /> <ph name="TYPE" /> i Screenshot. Tryk på fanen for at vælge registreringstype. Tryk på mellemrumstasten for at vælge område. Tryk på Enter for at registrere.</translation> <translation id="8938800817013097409">USB-C-enhed (porten bagpå i højre side)</translation> <translation id="8939855324412367560">Inputlyden er "<ph name="INPUT_DEVICE_NAME" />", og outputlyden er "<ph name="OUTPUT_DEVICE_NAME" />". Gå til Indstillinger for at ændre det.</translation> <translation id="8940956008527784070">Batteriniveauet er lavt (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index f7efc65..2a2f596 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> drücken und auf einen Link klicken</translation> <translation id="2957159466053076448">Du kannst diese Funktionen jederzeit in den Einstellungen deaktivieren. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio des Geräts</translation> -<translation id="2960314608273155470">Aufnahmemodus – die Standardeinstellung ist <ph name="TYPE" /> (<ph name="SOURCE" />). Drücke für die Navigation über die Tastatur die Tabulatortaste.</translation> <translation id="2961963223658824723">Ein Fehler ist aufgetreten. Bitte versuche es in ein paar Sekunden noch einmal.</translation> <translation id="2963773877003373896">Mod3</translation> <translation id="2965227184985674128">Mikrofonzugriff aktivieren?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google-Dokument erstellen</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 Datei}other{# Dateien}}</translation> <translation id="8936501819958976551">deaktiviert</translation> -<translation id="8937312474322077653">Lege bei der Bildschirmaufnahme Folgendes fest: <ph name="SOURCE" /> <ph name="TYPE" />. Drücke die Tabulatortaste, um die Art der Aufnahme auszuwählen. Drücke die Leertaste, um den Bereich auszuwählen. Drücke die Eingabetaste, um die Aufnahme zu erstellen.</translation> <translation id="8938800817013097409">USB-C-Gerät (rechter Port hinten)</translation> <translation id="8939855324412367560">Die Audioeingabe ist „<ph name="INPUT_DEVICE_NAME" />“ und die Audioausgabe ist „<ph name="OUTPUT_DEVICE_NAME" />“. Du kannst dies in den Einstellungen ändern.</translation> <translation id="8940956008527784070">Niedriger Akkustand (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index 1989ab89..370a906 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Πατήστε <ph name="MODIFIER" /> και έναν σύνδεσμο</translation> <translation id="2957159466053076448">Μπορείτε να απενεργοποιήσετε αυτές τις λειτουργίες ανά πάσα στιγμή στις Ρυθμίσεις. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Ήχος συσκευής</translation> -<translation id="2960314608273155470">Λειτουργία λήψης, η προεπιλογή είναι <ph name="SOURCE" /> <ph name="TYPE" />. Πατήστε Tab για πλοήγηση με το πληκτρολόγιο.</translation> <translation id="2961963223658824723">Δυστυχώς, παρουσιάστηκε κάποιο πρόβλημα. Δοκιμάστε ξανά σε λίγα δευτερόλεπτα.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Ενεργοποίηση πρόσβασης στο μικρόφωνο;</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Δημιουργία Εγγράφου Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 αρχείο}other{# αρχεία}}</translation> <translation id="8936501819958976551">απενεργοποιημένο</translation> -<translation id="8937312474322077653">Στην καταγραφή οθόνης, ορίστε σε <ph name="SOURCE" /> <ph name="TYPE" />. Πατήστε Tab για να επιλέξετε τύπο λήψης. Πατήστε το πλήκτρο διαστήματος για να επιλέξετε περιοχή. Πατήστε Enter για λήψη.</translation> <translation id="8938800817013097409">Συσκευή USB-C (πίσω δεξιά θύρα)</translation> <translation id="8939855324412367560">Ο ήχος εισόδου είναι <ph name="INPUT_DEVICE_NAME" /> και ο ήχος εξόδου είναι <ph name="OUTPUT_DEVICE_NAME" />. Μεταβείτε στις Ρυθμίσεις για αλλαγή.</translation> <translation id="8940956008527784070">Χαμηλή στάθμη μπαταρίας (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 783c564..b4ad34a 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Press <ph name="MODIFIER" /> and click a link</translation> <translation id="2957159466053076448">You can turn off these features at any time in Settings. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Device audio</translation> -<translation id="2960314608273155470">Capture mode, default is <ph name="SOURCE" /> <ph name="TYPE" />. Press tab for keyboard navigation.</translation> <translation id="2961963223658824723">Something went wrong. Try again in a few seconds.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Turn on microphone access?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Create Google Doc</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 file}other{# files}}</translation> <translation id="8936501819958976551">deactivated</translation> -<translation id="8937312474322077653">In Screen Capture, set to <ph name="SOURCE" /> <ph name="TYPE" />. Press Tab to choose capture type. Press Space to select region. Press Enter to capture.</translation> <translation id="8938800817013097409">USB-C device (right port in the back)</translation> <translation id="8939855324412367560">Input audio is '<ph name="INPUT_DEVICE_NAME" />' and output audio is '<ph name="OUTPUT_DEVICE_NAME" />'. Go to Settings to change.</translation> <translation id="8940956008527784070">Battery low (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index d71f8bc..18ef09a 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Presiona <ph name="MODIFIER" /> y haz clic en un vínculo</translation> <translation id="2957159466053076448">Puedes desactivar estas funciones en cualquier momento en Configuración. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio del dispositivo</translation> -<translation id="2960314608273155470">Modo de captura, la configuración predeterminada es <ph name="SOURCE" /> <ph name="TYPE" />. Presiona Tab para navegar con el teclado.</translation> <translation id="2961963223658824723">Se produjo un error. Vuelve a intentarlo en unos segundos.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">¿Quieres activar el acceso al micrófono?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Crear documento de Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 archivo}other{# archivos}}</translation> <translation id="8936501819958976551">desactivada</translation> -<translation id="8937312474322077653">En la captura de pantalla, establece <ph name="SOURCE" /> <ph name="TYPE" />. Presiona Tab para elegir el tipo de captura. Presiona la barra espaciadora para seleccionar la región. Presiona Intro para capturar.</translation> <translation id="8938800817013097409">Dispositivo USB-C (puerto derecho en la parte posterior)</translation> <translation id="8939855324412367560">La entrada de audio es "<ph name="INPUT_DEVICE_NAME" />" y la salida es "<ph name="OUTPUT_DEVICE_NAME" />". Ve a Configuración para cambiarlas.</translation> <translation id="8940956008527784070">Batería baja (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index 64d0b75e4..bfecd46 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Pulsa <ph name="MODIFIER" /> y haz clic en un enlace</translation> <translation id="2957159466053076448">Puedes desactivar estas funciones en cualquier momento en Configuración. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio del dispositivo</translation> -<translation id="2960314608273155470">Modo de captura, establecido en <ph name="TYPE" /> <ph name="SOURCE" />. Pulsa el tabulador para desplazarte por el teclado.</translation> <translation id="2961963223658824723">Se ha producido un error. Vuelve a intentarlo en unos segundos.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">¿Activar acceso al micrófono?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Crear un documento de Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 archivo}other{# archivos}}</translation> <translation id="8936501819958976551">desactivado</translation> -<translation id="8937312474322077653">En la captura de pantalla, configura <ph name="TYPE" /> <ph name="SOURCE" />. Pulsa Tabulador para elegir el tipo de captura. Pulsa la barra espaciadora para seleccionar el territorio. Pulsa Intro para hacer una captura.</translation> <translation id="8938800817013097409">Dispositivo USB tipo C (puerto derecho situado en la parte trasera)</translation> <translation id="8939855324412367560">La entrada de audio es <ph name="INPUT_DEVICE_NAME" />, y la salida de audio, <ph name="OUTPUT_DEVICE_NAME" />. Ve a Configuración para cambiarlas.</translation> <translation id="8940956008527784070">Poca batería (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 9290456d..7dc274ff 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Vajutage klahvi <ph name="MODIFIER" /> ja klõpsake lingil</translation> <translation id="2957159466053076448">Saate need funktsioonid seadetes igal ajal välja lülitada. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Seadme heli</translation> -<translation id="2960314608273155470">Jäädvustusrežiim, vaikeseade on <ph name="SOURCE" /> <ph name="TYPE" />. Klaviatuuriga navigeerimiseks vajutage tabulaatorit.</translation> <translation id="2961963223658824723">Midagi läks valesti. Proovige mõne sekundi pärast uuesti.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Kas lülitada sisse juurdepääs mikrofonile?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Loo Google'i dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fail}other{# faili}}</translation> <translation id="8936501819958976551">inaktiveeritud</translation> -<translation id="8937312474322077653">Määrake ekraanikuva jäädvustamises <ph name="SOURCE" /> <ph name="TYPE" />. Jäädvustamise tüübi valimiseks vajutage tabulaatorit. Piirkonna valimiseks vajutage tühikuklahvi. Jäädvustamiseks vajutage sisestusklahvi.</translation> <translation id="8938800817013097409">C-tüüpi USB-seade (parempoolne port taga)</translation> <translation id="8939855324412367560">Sisendheliks on „<ph name="INPUT_DEVICE_NAME" />“ ja väljundheliks on „<ph name="OUTPUT_DEVICE_NAME" />“. Muutmiseks avage menüü Seaded.</translation> <translation id="8940956008527784070">Aku tühjeneb (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index e81586d..77676d0 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Sakatu <ph name="MODIFIER" /> eta egin klik esteka batean</translation> <translation id="2957159466053076448">Eginbide horiek desaktibatzeko, joan Ezarpenak atalera. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Gailuaren audioa</translation> -<translation id="2960314608273155470">Edukia kapturatzeko modua. Balio lehenetsia <ph name="TYPE" /> <ph name="SOURCE" /> da. Teklatuaren bidez nabigatzeko, sakatu tabuladorea.</translation> <translation id="2961963223658824723">Arazo bat izan da. Saiatu berriro segundo batzuk barru.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Mikrofonoa erabiltzeko baimena aktibatu nahi duzu?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Sortu Google-ko dokumentu bat</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fitxategi}other{# fitxategi}}</translation> <translation id="8936501819958976551">desaktibatuta</translation> -<translation id="8937312474322077653">Pantaila-kapturan, <ph name="TYPE" /> <ph name="SOURCE" />. Kaptura mota aldatzeko, sakatu tabuladorea. Eremua hautatzeko, sakatu zuriune-barra. Kapturatzeko, sakatu Sartu.</translation> <translation id="8938800817013097409">USB-C gailua (eskuinaldeko atzeko ataka)</translation> <translation id="8939855324412367560">Audio-sarrera "<ph name="INPUT_DEVICE_NAME" />" da, eta audio-irteera, berriz, "<ph name="OUTPUT_DEVICE_NAME" />". Aldatzeko, joan Ezarpenak atalera.</translation> <translation id="8940956008527784070">Bateria gutxi (% <ph name="PERCENTAGE" />)</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 3207ead..c4011f3 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> را فشار دهید و روی پیوندی کلیک کنید</translation> <translation id="2957159466053076448">هروقت خواستید میتوانید این ویژگیها را در «تنظیمات» خاموش کنید. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">صدای دستگاه</translation> -<translation id="2960314608273155470">«حالت ضبط»، پیشفرض <ph name="SOURCE" /> <ph name="TYPE" /> است. برای پیمایش با صفحهکلید، کلید جهش را فشار دهید.</translation> <translation id="2961963223658824723">مشکلی پیش آمد. چند ثانیه دیگر دوباره امتحان کنید.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">دسترسی به میکروفون روشن شود؟</translation> @@ -2432,7 +2431,6 @@ <translation id="8934418770423095813">ایجاد «سندنگار Google»</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{یک فایل}one{# فایل}other{# فایل}}</translation> <translation id="8936501819958976551">غیرفعال</translation> -<translation id="8937312474322077653">در حالت ضبط صفحهنمایش، روی <ph name="TYPE" /> <ph name="SOURCE" /> تنظیم شد. برای انتخاب نوع ضبط، کلید «جهش» را فشار دهید. برای انتخاب منطقه، کلید «فاصله» را فشار دهید. برای ضبط کردن، کلید Enter را فشار دهید.</translation> <translation id="8938800817013097409">دستگاه USB-C (درگاه عقب سمت راست)</translation> <translation id="8939855324412367560">صدای ورودی «<ph name="INPUT_DEVICE_NAME" />» و صدای خروجی «<ph name="OUTPUT_DEVICE_NAME" />» است. برای تغییر به «تنظیمات» بروید.</translation> <translation id="8940956008527784070">باتری ضعیف است (<ph name="PERCENTAGE" />٪)</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 601ffce..1a08a46 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Paina <ph name="MODIFIER" /> ja klikkaa linkkiä</translation> <translation id="2957159466053076448">Voit laittaa nämä ominaisuudet pois päältä milloin tahansa asetuksista. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Laitteen audio</translation> -<translation id="2960314608273155470">Tallennustila, oletuksena on <ph name="SOURCE" /> <ph name="TYPE" />. Aloita näppäimistöllä siirtyminen painamalla sarkainta.</translation> <translation id="2961963223658824723">Jotain meni pieleen. Yritä uudelleen parin sekunnin kuluttua.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Laitetaanko mikrofonin käyttölupa päälle?</translation> @@ -2432,7 +2431,6 @@ <translation id="8934418770423095813">Luo Google-dokumentti</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 tiedosto}other{# tiedostoa}}</translation> <translation id="8936501819958976551">poistettu käytöstä</translation> -<translation id="8937312474322077653">Kuvakaappauksessa, <ph name="SOURCE" /> <ph name="TYPE" /> valittu. Valitse tallennustyyppi painamalla välilehteä. Valitse alue painamalla välilyöntiä. Tallenna painamalla Enter.</translation> <translation id="8938800817013097409">C-tyypin USB-laite (oikeanpuoleinen takaportti)</translation> <translation id="8939855324412367560">Äänitulo on "<ph name="INPUT_DEVICE_NAME" />" ja äänentoisto on "<ph name="OUTPUT_DEVICE_NAME" />". Muuta sitä asetuksista.</translation> <translation id="8940956008527784070">Akku vähissä (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index fec80e6..2783bf0d 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Pindutin ang <ph name="MODIFIER" /> at mag-click ng link</translation> <translation id="2957159466053076448">Puwede mong i-off ang mga feature na ito anumang oras sa Mga Setting. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio ng device</translation> -<translation id="2960314608273155470">Capture Mode, <ph name="SOURCE" /> <ph name="TYPE" /> ang default. Pindutin ang tab para mag-navigate gamit ang keyboard.</translation> <translation id="2961963223658824723">Nagkaproblema. Subukang muli sa loob ng ilang segundo.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">I-on ang access sa mikropono?</translation> @@ -2431,7 +2430,6 @@ <translation id="8934418770423095813">Gumawa ng Google Doc</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 file}one{# file}other{# na file}}</translation> <translation id="8936501819958976551">na-deactivate</translation> -<translation id="8937312474322077653">Sa screen capture, itakda sa <ph name="SOURCE" /> <ph name="TYPE" />. Pindutin ang tab para pumili ng uri ng pag-capture. Pindutin ang space para pumili ng rehiyon. Pindutin ang enter para mag-capture.</translation> <translation id="8938800817013097409">USB-C device (kanang port sa likod)</translation> <translation id="8939855324412367560">Ang input audio ay "<ph name="INPUT_DEVICE_NAME" />" at ang output audio ay "<ph name="OUTPUT_DEVICE_NAME" />." Pumunta sa Mga Setting para baguhin.</translation> <translation id="8940956008527784070">Mahina na ang baterya (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index f6c1515..5edaa571 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Appuyez sur <ph name="MODIFIER" />, puis cliquez sur un lien</translation> <translation id="2957159466053076448">Vous pouvez désactiver ces fonctionnalités à tout moment dans les paramètres. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio de l'appareil</translation> -<translation id="2960314608273155470">Mode de capture, la valeur par défaut est <ph name="TYPE" /> <ph name="SOURCE" />. Appuyez sur la touche Tabulation pour utiliser la navigation au clavier.</translation> <translation id="2961963223658824723">Un problème est survenu. Réessayez dans quelques secondes.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Activer l'accès au microphone?</translation> @@ -2431,7 +2430,6 @@ <translation id="8934418770423095813">Créer un document Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fichier}one{# fichier}other{# fichiers}}</translation> <translation id="8936501819958976551">désactivée</translation> -<translation id="8937312474322077653">Dans la capture d'écran, définissez l'option sur <ph name="TYPE" /> <ph name="SOURCE" />. Appuyez sur Tabulation pour choisir le type de capture. Appuyez sur la barre d'espace pour sélectionner la zone. Appuyez sur Entrée pour prendre la capture.</translation> <translation id="8938800817013097409">Appareil USB-C (port arrière-droit)</translation> <translation id="8939855324412367560">L'audio d'entrée est « <ph name="INPUT_DEVICE_NAME" /> » et l'audio de sortie est « <ph name="OUTPUT_DEVICE_NAME" /> ». Accédez aux paramètres pour effectuer des modifications.</translation> <translation id="8940956008527784070">Batterie faible (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index cf4d69f..3db46bd 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Appuyez sur <ph name="MODIFIER" />, puis cliquez sur un lien</translation> <translation id="2957159466053076448">Vous pouvez désactiver ces fonctionnalités à tout moment dans les paramètres. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio de l'appareil</translation> -<translation id="2960314608273155470">Mode de capture, la valeur par défaut est : <ph name="TYPE" /> <ph name="SOURCE" />. Appuyez sur Tab pour la navigation au clavier.</translation> <translation id="2961963223658824723">Une erreur s'est produite. Veuillez réessayer dans quelques secondes.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Activer l'accès au micro ?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Créer un document Google Docs</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fichier}one{# fichier}other{# fichiers}}</translation> <translation id="8936501819958976551">a désactivé</translation> -<translation id="8937312474322077653">Dans Capture d'écran, sélectionner <ph name="SOURCE" /> <ph name="TYPE" />. Appuyer sur Tabulation pour choisir le type de capture. Appuyer sur la barre d'espace pour sélectionner la région. Appuyer sur Entrée pour effectuer une capture.</translation> <translation id="8938800817013097409">Appareil USB de type C (port situé sur l'arrière de l'appareil, à droite)</translation> <translation id="8939855324412367560">L'entrée audio est "<ph name="INPUT_DEVICE_NAME" />" et la sortie audio est "<ph name="OUTPUT_DEVICE_NAME" />". Pour les modifier, accédez aux paramètres.</translation> <translation id="8940956008527784070">Batterie faible (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 3c16446..3e6c4113 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Preme <ph name="MODIFIER" /> e fai clic nunha ligazón</translation> <translation id="2957159466053076448">Podes desactivar estas funcións cando queiras en Configuración. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio do dispositivo</translation> -<translation id="2960314608273155470">Modo de captura. A configuración predeterminada é <ph name="TYPE" /> <ph name="SOURCE" />. Premer o tabulador para navegar polo teclado.</translation> <translation id="2961963223658824723">Produciuse un erro. Téntao de novo nuns segundos.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Queres activar o acceso ao micrófono?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Crear documento de Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ficheiro}other{# ficheiros}}</translation> <translation id="8936501819958976551">desactivou</translation> -<translation id="8937312474322077653">En Captura de pantalla, establece o <ph name="TYPE" /> de <ph name="SOURCE" />. Preme a pestana para elixir o tipo de captura. Preme Espazo para seleccionar a área. Preme Introducir para facer a captura.</translation> <translation id="8938800817013097409">Dispositivo USB‑C (porto dereito posterior)</translation> <translation id="8939855324412367560">O dispositivo de entrada de audio é <ph name="INPUT_DEVICE_NAME" /> e o de saída, <ph name="OUTPUT_DEVICE_NAME" />. Vai a Configuración para cambialos.</translation> <translation id="8940956008527784070">Batería baixa (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 4722f4c..efc8738 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> દબાવો અને લિંક પર ક્લિક કરો</translation> <translation id="2957159466053076448">તમે કોઈપણ સમયે આ સુવિધાઓને સેટિંગમાં જઈને બંધ કરી શકો છો. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">ડિવાઇસનો ઑડિયો</translation> -<translation id="2960314608273155470">કૅપ્ચર મોડ, ડિફૉલ્ટ તરીકે <ph name="SOURCE" /> <ph name="TYPE" /> છે. કીબોર્ડ નૅવિગેશન માટે ટૅબ દબાવો.</translation> <translation id="2961963223658824723">કંઈક ખોટું થયું. થોડીવારમાં ફરીથી પ્રયાસ કરો.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">શું માઇક્રોફોનનો ઍક્સેસ ચાલુ કરીએ?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google Doc બનાવો</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ફાઇલ}one{# ફાઇલ}other{# ફાઇલ}}</translation> <translation id="8936501819958976551">નિષ્ક્રિય કરેલું</translation> -<translation id="8937312474322077653">સ્ક્રીન કૅપ્ચરમાં, <ph name="SOURCE" /> <ph name="TYPE" /> પર સેટ કરો. કૅપ્ચરનો પ્રકાર પસંદ કરવા માટે, Tab દબાવો. પ્રદેશ પસંદ કરવા માટે સ્પેસ બાર દબાવો. કૅપ્ચર કરવા માટે Enter દબાવો.</translation> <translation id="8938800817013097409">USB-C ડિવાઇસ (પાછળની બાજુએ જમણું પોર્ટ)</translation> <translation id="8939855324412367560">"<ph name="INPUT_DEVICE_NAME" />" ઑડિયો ઇનપુટ છે અને "<ph name="OUTPUT_DEVICE_NAME" />" ઑડિયો આઉટપુટ છે. બદલવા માટે સેટિંગ પર જાઓ.</translation> <translation id="8940956008527784070">બૅટરી ઓછી (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 4d547dc..a7df523 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> दबाएं और किसी लिंक पर क्लिक करें</translation> <translation id="2957159466053076448">सेटिंग में जाकर, इन सुविधाओं को किसी भी समय बंद किया जा सकता है. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">डिवाइस का ऑडियो</translation> -<translation id="2960314608273155470">कैप्चर मोड में, <ph name="SOURCE" /> <ph name="TYPE" /> डिफ़ॉल्ट के तौर पर सेट है. कीबोर्ड नेविगेशन के लिए, Tab दबाएं.</translation> <translation id="2961963223658824723">कुछ गड़बड़ी हो गई. कुछ सेकंड में फिर से कोशिश करें.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">माइक्रोफ़ोन का ऐक्सेस देना है?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Google दस्तावेज़ बनाएं</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 फ़ाइल}one{# फ़ाइल}other{# फ़ाइलें}}</translation> <translation id="8936501819958976551">बंद की गई</translation> -<translation id="8937312474322077653">स्क्रीन कैप्चर में, <ph name="SOURCE" /> <ph name="TYPE" /> पर सेट करें. कैप्चर का टाइप चुनने के लिए, tab दबाएं. देश/इलाका चुनने के लिए space दबाएं. कैप्चर करने के लिए enter दबाएं.</translation> <translation id="8938800817013097409">USB-C डिवाइस (पीछे की ओर दायां पोर्ट)</translation> <translation id="8939855324412367560">इनपुट ऑडियो "<ph name="INPUT_DEVICE_NAME" />" है और आउटपुट ऑडियो "<ph name="OUTPUT_DEVICE_NAME" />" है. इन्हें बदलने के लिए सेटिंग पर जाएं.</translation> <translation id="8940956008527784070">बैटरी कम (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 669908f..4f6033f 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -462,6 +462,7 @@ <translation id="2530896289327917474">Uključivanje ili isključivanje pregledavanja kursorom</translation> <translation id="2531025035050312891">uređaj je spor</translation> <translation id="2531107890083353124">Dok povlačite karticu, pritisnite <ph name="KEY_ONE" /></translation> +<translation id="2532199152994248594">Povucite ili pritisnite razmaknicu da biste odabrali područje za snimanje</translation> <translation id="2545334090614121435">Pokušavate li upotrijebiti tipku Home? Upotrijebite</translation> <translation id="254900897760075745">Kopiranje odabranog sadržaja u međuspremnik</translation> <translation id="2549711466868162843">Poboljšanje osvjetljenja</translation> @@ -581,7 +582,6 @@ <translation id="2949420361496057765">Pritisnite <ph name="MODIFIER" /> i kliknite vezu</translation> <translation id="2957159466053076448">Te značajke uvijek možete isključiti u postavkama. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Zvuk na uređaju</translation> -<translation id="2960314608273155470">Način snimanja, zadano je <ph name="SOURCE" /> <ph name="TYPE" />. Pritisnite Tab da biste se kretali pomoću tipkovnice.</translation> <translation id="2961963223658824723">Nešto nije u redu. Pokušajte ponovno za nekoliko sekundi.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Uključiti pristup mikrofonu?</translation> @@ -1770,6 +1770,7 @@ <translation id="6700713906295497288">Gumb izbornika IME-a</translation> <translation id="6704073473590541209">Odabran je marker za desni rub, upotrijebite tipke sa strelicama za pomicanje</translation> <translation id="6706742084323792866">Tipkovnica za unos PIN-a</translation> +<translation id="6709719156428404245">Povucite ili pritisnite razmaknicu da biste odabrali područje za snimanje</translation> <translation id="6710213216561001401">Prethodno</translation> <translation id="6723839937902243910">Napajanje</translation> <translation id="672609503628871915">Pogledajte što je novo</translation> @@ -2433,7 +2434,6 @@ <translation id="8934418770423095813">Izradi Google dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 datoteka}one{# datoteka}few{# datoteke}other{# datoteka}}</translation> <translation id="8936501819958976551">deaktivirano</translation> -<translation id="8937312474322077653">U snimci zaslona postavite na <ph name="SOURCE" /> <ph name="TYPE" />. Pritisnite Tab da biste odabrali vrstu snimanja. Pritisnite razmaknicu da biste odabrali regiju. Pritisnite Enter da biste snimili.</translation> <translation id="8938800817013097409">USB-C uređaj (desni priključak sa stražnje strane)</translation> <translation id="8939855324412367560">Audioulaz je <ph name="INPUT_DEVICE_NAME" />, a audioizlaz <ph name="OUTPUT_DEVICE_NAME" />. Otvorite Postavke da biste ih promijenili.</translation> <translation id="8940956008527784070">Baterija je skoro prazna (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index e618e42..c0003e1 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Nyomja le a(z) <ph name="MODIFIER" /> billentyűt, majd kattintson a kívánt linkre</translation> <translation id="2957159466053076448">Ezeket a funkciókat bármikor kikapcsolhatja a Beállításokban. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Eszköz hangja</translation> -<translation id="2960314608273155470">Rögzítés mód, alapértelmezett beállítás: <ph name="SOURCE" /> <ph name="TYPE" />. A billentyűzettel való navigációhoz nyomja le a Tab billentyűt.</translation> <translation id="2961963223658824723">Valami nem sikerült. Próbálja újra néhány másodperc múlva.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Aktiválja a mikrofon-hozzáférést?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Google-dokumentum létrehozása</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fájl}other{# fájl}}</translation> <translation id="8936501819958976551">deaktiválva</translation> -<translation id="8937312474322077653">A képernyőfelvételnél állítsa be a következőre: <ph name="SOURCE" />, <ph name="TYPE" />. A felvétel típusának kiválasztásához nyomja meg a Tab billentyűt. A régió kiválasztásához nyomja le a szóköz billentyűt. A felvétel elkészítéséhez nyomja meg az Enter billentyűt.</translation> <translation id="8938800817013097409">C típusú USB-vel kompatibilis eszköz (jobb hátsó port)</translation> <translation id="8939855324412367560">A hangbemenet a következőre van állítva: „<ph name="INPUT_DEVICE_NAME" />”, a hangkimenet pedig a következőre: „<ph name="OUTPUT_DEVICE_NAME" />”. Ezeket a beállításoknál módosíthatja.</translation> <translation id="8940956008527784070">Alacsony akkumulátortöltöttség (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index b91e50f..4e6d887 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Սեղմեք <ph name="MODIFIER" />, ապա սեղմեք հղման վրա</translation> <translation id="2957159466053076448">Դուք ցանկացած ժամանակ կարող եք անջատել այս գործառույթները Կարգավորումներում։ Իմանալ ավելին՝ <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Սարքի ձայները</translation> -<translation id="2960314608273155470">Տեսագրման կանխադրված ռեժիմը՝ <ph name="SOURCE" /> <ph name="TYPE" />։ Սեղմեք Tab՝ ստեղնաշարի միջոցով նավիգացիայի համար։</translation> <translation id="2961963223658824723">Սխալ առաջացավ: Փորձեք ավելի ուշ:</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Միացնե՞լ խոսափողի օգտագործման թույլտվությունը</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Ստեղծել Google փաստաթուղթ</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ֆայլ}one{# ֆայլ}other{# ֆայլ}}</translation> <translation id="8936501819958976551">անջատվեց</translation> -<translation id="8937312474322077653">Էկրանի տեսագրման պարամետրեր՝ <ph name="SOURCE" />, <ph name="TYPE" />։ Տեսագրման տեսակն ընտրելու համար սեղմեք Tab։ Էկրանի հատվածն ընտրելու համար սեղմեք բացատի ստեղնը։ Տեսագրումը սկսելու համար սեղմեք Enter։</translation> <translation id="8938800817013097409">USB-C սարք (հետևի աջ միացք)</translation> <translation id="8939855324412367560">Աուդիոյի ներածման համար ընտրված է «<ph name="INPUT_DEVICE_NAME" />» սարքը, իսկ արտածման համար՝ «<ph name="OUTPUT_DEVICE_NAME" />» սարքը։ Փոխելու համար անցեք Կարգավորումներ։</translation> <translation id="8940956008527784070">Մարտկոցի լիցքն սպառվում է (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 8274d6a..b4992aa 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Tekan <ph name="MODIFIER" />, lalu klik link</translation> <translation id="2957159466053076448">Anda dapat menonaktifkan fitur ini kapan saja di Setelan. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio perangkat</translation> -<translation id="2960314608273155470">Mode Tangkapan Layar, opsi defaultnya adalah <ph name="TYPE" /> <ph name="SOURCE" />. Tekan tab untuk menavigasi dengan keyboard.</translation> <translation id="2961963223658824723">Terjadi error. Coba lagi dalam beberapa detik.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Aktifkan akses mikrofon?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Buat Dokumen Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 file}other{# file}}</translation> <translation id="8936501819958976551">dinonaktifkan</translation> -<translation id="8937312474322077653">Di screenshot, setel ke <ph name="TYPE" /> <ph name="SOURCE" />. Tekan tab untuk memilih jenis pengambilan screenshot. Tekan spasi untuk memilih wilayah. Tekan enter untuk mengambil screenshot.</translation> <translation id="8938800817013097409">Perangkat USB-C (port belakang sebelah kanan)</translation> <translation id="8939855324412367560">Audio input adalah "<ph name="INPUT_DEVICE_NAME" />" dan audio output adalah "<ph name="OUTPUT_DEVICE_NAME" />". Buka Setelan untuk mengubah.</translation> <translation id="8940956008527784070">Baterai lemah (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index 0f8e083..0df0a19 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Ýttu á <ph name="MODIFIER" /> og smelltu á tengil</translation> <translation id="2957159466053076448">Þú getur slökkt á þessum eiginleikum hvenær sem er í stillingum. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Hljóð tækis</translation> -<translation id="2960314608273155470">Tökustilling, <ph name="SOURCE" /> <ph name="TYPE" /> er sjálfgefið. Ýttu á Tab (dálkalykilinn) til að fletta á lyklaborði.</translation> <translation id="2961963223658824723">Eitthvað fór úrskeiðis. Reyndu aftur eftir nokkrar sekúndur.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Kveikja á hljóðnemaaðgangi?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Búa til Google skjal</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 skrá}one{# skrá}other{# skrár}}</translation> <translation id="8936501819958976551">óvirkt</translation> -<translation id="8937312474322077653">Stilla á <ph name="SOURCE" /> <ph name="TYPE" /> í skjáupptöku. Ýttu á flipa til að velja gerð töku. Ýttu á bil til að velja svæði. Ýttu á enter til að taka mynd.</translation> <translation id="8938800817013097409">USB-C tæki (hægra tengi að aftan)</translation> <translation id="8939855324412367560">Inntakshljóð er „<ph name="INPUT_DEVICE_NAME" />“ og úttakshljóð er „<ph name="OUTPUT_DEVICE_NAME" />“. Farðu í stillingar til að breyta þessu.</translation> <translation id="8940956008527784070">Rafhlaða að tæmast (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index d204882..2ef583f 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Premi <ph name="MODIFIER" /> e fai clic su un link</translation> <translation id="2957159466053076448">Puoi disattivare queste funzionalità in qualsiasi momento nelle Impostazioni. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio del dispositivo</translation> -<translation id="2960314608273155470">Modalità di acquisizione, l'impostazione predefinita è <ph name="TYPE" /> <ph name="SOURCE" />. Premi Tab per usare la navigazione da tastiera.</translation> <translation id="2961963223658824723">Si è verificato un problema. Riprova tra qualche secondo.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Vuoi attivare l'accesso al microfono?</translation> @@ -2429,7 +2428,6 @@ <translation id="8934418770423095813">Crea documento Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 file}other{# file}}</translation> <translation id="8936501819958976551">disattivato</translation> -<translation id="8937312474322077653">In Cattura schermo, imposta su <ph name="SOURCE" /> <ph name="TYPE" />. Premi Tab per scegliere il tipo di acquisizione. Premi la barra spaziatrice per selezionare la regione. Premi Invio per acquisire.</translation> <translation id="8938800817013097409">Dispositivo USB-C (porta posteriore destra)</translation> <translation id="8939855324412367560">Il dispositivo di input audio è "<ph name="INPUT_DEVICE_NAME" />" e il dispositivo di output audio è "<ph name="OUTPUT_DEVICE_NAME" />". Vai alle Impostazioni per modificare.</translation> <translation id="8940956008527784070">Batteria in esaurimento (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index d2a431c..1ff12d8 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">הקשה על <ph name="MODIFIER" /> ולחיצה על קישור</translation> <translation id="2957159466053076448">אפשר להשבית את התכונות האלה בכל שלב בהגדרות. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">אודיו מהמכשיר</translation> -<translation id="2960314608273155470">מצב צילום מסך, ברירת המחדל היא <ph name="SOURCE" /> <ph name="TYPE" />. צריך להקיש על Tab כדי לנווט באמצעות המקלדת.</translation> <translation id="2961963223658824723">משהו השתבש. אפשר לנסות שוב בעוד כמה שניות.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">להפעיל את הגישה למיקרופון?</translation> @@ -2435,7 +2434,6 @@ <translation id="8934418770423095813">יצירה של מסמך Google Docs</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{קובץ אחד}one{# קבצים}two{# קבצים}other{# קבצים}}</translation> <translation id="8936501819958976551">מושבתת</translation> -<translation id="8937312474322077653">בצילום מסך, צריך להגדיר את האפשרות <ph name="SOURCE" /> <ph name="TYPE" />. אפשר להקיש על Tab כדי לבחור את סוג הצילום. כדי לבחור אזור, מקישים על מקש הרווח. מקישים על Enter כדי לצלם.</translation> <translation id="8938800817013097409">מכשיר עם יציאת USB-C (יציאה ימנית מאחור)</translation> <translation id="8939855324412367560">מקור קלט האודיו הוא '<ph name="INPUT_DEVICE_NAME" />' ומקור פלט האודיו הוא '<ph name="OUTPUT_DEVICE_NAME" />'. אפשר לשנות את זה בהגדרות.</translation> <translation id="8940956008527784070">סוללה חלשה (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index 4ec27ca0..fa288dc1 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> キーを押しながらリンクをクリックする</translation> <translation id="2957159466053076448">これらの機能は、[設定] でいつでもオフにできます。<ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">デバイスの音声</translation> -<translation id="2960314608273155470">キャプチャ モードです。デフォルトは <ph name="SOURCE" /> の <ph name="TYPE" /> です。キーボード ナビゲーションを使用するには、タブキーを押してください。</translation> <translation id="2961963223658824723">エラーが発生しました。数秒後にもう一度お試しください。</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">マイクへのアクセスをオンにしますか?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google ドキュメントを作成</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 件のファイル}other{# 件のファイル}}</translation> <translation id="8936501819958976551">無効</translation> -<translation id="8937312474322077653">スクリーン キャプチャで <ph name="SOURCE" /> <ph name="TYPE" /> に設定します。キャプチャの種類を選択するには Tab キーを押します。範囲を選択するには Space キーを押します。キャプチャするには Enter キーを押します。</translation> <translation id="8938800817013097409">USB-C デバイス(背面右のポート)</translation> <translation id="8939855324412367560">入力オーディオは "<ph name="INPUT_DEVICE_NAME" />"、出力オーディオは "<ph name="OUTPUT_DEVICE_NAME" />" です。変更するには [設定] に移動してください。</translation> <translation id="8940956008527784070">バッテリー残量: 少(<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 1eebb76b..aca6968 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">დააჭერით აირჩიეთ <ph name="MODIFIER" />, შემდეგ კი დააწკაპუნეთ ბმულზე</translation> <translation id="2957159466053076448">ამ ფუნქციების გამორთვა ყოველთვის შეგიძლიათ პარამეტრებიდან. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">მოწყობილობის აუდიო</translation> -<translation id="2960314608273155470">აღბეჭდვის რეჟიმი, ნაგულისხმევია <ph name="SOURCE" /> <ph name="TYPE" />. კლავიატურით ნავიგაციისთვის დააჭირეთ კლავიშს Tab.</translation> <translation id="2961963223658824723">წარმოიქმნა შეფერხება. ცადეთ ხელახლა რამდენიმე წამში.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">გსურთ, ჩართოთ მიკროფონზე წვდომა?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google Doc-ის შექმნა</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ფაილი}other{# ფაილი}}</translation> <translation id="8936501819958976551">დეაქტივირებულია</translation> -<translation id="8937312474322077653">ეკრანის ანაბეჭდის რეჟიმში დააყენეთ <ph name="SOURCE" /> <ph name="TYPE" />. დააჭირეთ Tab-ს, რომ აირჩიოთ გადაღების ტიპი. დააჭირეთ ინტერვალს, რომ აირჩიოთ რეგიონი. დააჭირეთ შეყვანას, რომ დაიწყოთ გადაღება.</translation> <translation id="8938800817013097409">USB-C მოწყობილობა (უკან მდებარე მარჯვენა პორტი)</translation> <translation id="8939855324412367560">შემავალი აუდიოა „<ph name="INPUT_DEVICE_NAME" />“, ხოლო გამომავალი — „<ph name="OUTPUT_DEVICE_NAME" />“. შესაცვლელად გადადით პარამეტრებში.</translation> <translation id="8940956008527784070">კვების ბატარეა იცლება (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index 8e46d88..b327b8f 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> пернесін басып, сілтемені басыңыз</translation> <translation id="2957159466053076448">"Параметрлер" бөліміне өтіп, бұл функцияларды кез келген уақытта өшіруге болады. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Құрылғыдан шығатын дыбыс</translation> -<translation id="2960314608273155470">Түсіру режимі, әдепкі параметр: <ph name="SOURCE" /> <ph name="TYPE" />. Пернетақтамен басқару үшін Tab пернесін басыңыз.</translation> <translation id="2961963223658824723">Бірдеңе дұрыс болмады. Бірнеше секундтан кейін қайталап көріңіз.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Микрофонды пайдалану мүмкіндігін қосу керек пе?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google құжатын жасау</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 файл}other{# файл}}</translation> <translation id="8936501819958976551">өшірілді</translation> -<translation id="8937312474322077653">Экран жазбасында <ph name="SOURCE" /> <ph name="TYPE" /> мәніне орнатылған. Түсіру түрін таңдау үшін Tab пернесін басыңыз. Аймақ таңдау үшін бос орын пернесін басыңыз. Түсіру үшін Enter пернесін басыңыз.</translation> <translation id="8938800817013097409">USB-C құрылғысы (артқы оң жақ порты)</translation> <translation id="8939855324412367560">Кіріс аудио — "<ph name="INPUT_DEVICE_NAME" />" және шығыс аудио — "<ph name="OUTPUT_DEVICE_NAME" />". Өзгерту үшін "Параметрлер" бөліміне өтіңіз.</translation> <translation id="8940956008527784070">Батарея заряды төмен (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index cd4683f..60d2d17 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">ចុច <ph name="MODIFIER" /> រួចចុចតំណ</translation> <translation id="2957159466053076448">អ្នកអាចបិទមុខងារទាំងនេះនៅពេលណាក៏បាននៅក្នុង "ការកំណត់"។ <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">សំឡេងឧបករណ៍</translation> -<translation id="2960314608273155470">មុខងារថត, លំនាំដើមគឺ <ph name="TYPE" /><ph name="SOURCE" />។ ចុច tab សម្រាប់ការរុករកដោយប្រើក្ដារចុច។</translation> <translation id="2961963223658824723">មានអ្វីមួយខុសប្រក្រតី សូមព្យាយាមម្ដងទៀតក្នុងពេលបន្តិចទៀត។</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">បើកសិទ្ធិចូលប្រើប្រាស់មីក្រូហ្វូនឬ?</translation> @@ -2432,7 +2431,6 @@ <translation id="8934418770423095813">បង្កើតឯកសារ Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{ឯកសារ 1}other{ឯកសារ #}}</translation> <translation id="8936501819958976551">បានបិទដំណើរការ</translation> -<translation id="8937312474322077653">នៅក្នុងការថតអេក្រង់ សូមកំណត់ទៅ<ph name="TYPE" /><ph name="SOURCE" />។ ចុច tab ដើម្បីជ្រើសរើសប្រភេទនៃការថត។ ចុចដកឃ្លា ដើម្បីជ្រើសរើសកន្លែង។ ចុច enter ដើម្បីថត។</translation> <translation id="8938800817013097409">ឧបករណ៍ USB-C (រន្ធស្តាំផ្នែកខាងក្រោយ)</translation> <translation id="8939855324412367560">ឧបករណ៍បញ្ចូលសំឡេងគឺ "<ph name="INPUT_DEVICE_NAME" />" ហើយឧបករណ៍បញ្ចេញសំឡេងគឺ "<ph name="OUTPUT_DEVICE_NAME" />"។ សូមចូលទៅកាន់ "ការកំណត់" ដើម្បីផ្លាស់ប្ដូរ។</translation> <translation id="8940956008527784070">ថ្មខ្សោយ (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 71c8503..70e2cf2 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> ಅನ್ನು ಒತ್ತಿರಿ ಮತ್ತು ಲಿಂಕ್ ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ</translation> <translation id="2957159466053076448">ನೀವು ಈ ಫೀಚರ್ಗಳನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಯಾವಾಗ ಬೇಕಾದರೂ ಆಫ್ ಮಾಡಬಹುದು. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">ಸಾಧನದ ಆಡಿಯೋ</translation> -<translation id="2960314608273155470">ಕ್ಯಾಪ್ಚರ್ ಮೋಡ್, <ph name="SOURCE" /> <ph name="TYPE" /> ಡೀಫಾಲ್ಟ್ ಆಗಿದೆ. ಕೀಬೋರ್ಡ್ ನ್ಯಾವಿಗೇಶನ್ಗಾಗಿ ಟ್ಯಾಬ್ ಒತ್ತಿರಿ.</translation> <translation id="2961963223658824723">ಏನೋ ಸಮಸ್ಯೆಯಾಗಿದೆ. ಕೆಲವು ನಿಮಿಷಗಳಲ್ಲಿ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">ಮೈಕ್ರೋಫೋನ್ ಆ್ಯಕ್ಸೆಸ್ ಆನ್ ಮಾಡಬೇಕೆ?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google Doc ರಚಿಸಿ</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ಫೈಲ್}one{# ಫೈಲ್ಗಳು}other{# ಫೈಲ್ಗಳು}}</translation> <translation id="8936501819958976551">ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation> -<translation id="8937312474322077653">ಸ್ಕ್ರೀನ್ ಕ್ಯಾಪ್ಚರ್ನಲ್ಲಿ, <ph name="SOURCE" /> <ph name="TYPE" /> ಗೆ ಸೆಟ್ ಮಾಡಲಾಗಿದೆ. ಕ್ಯಾಪ್ಚರ್ ಮಾಡುವಿಕೆಯ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಬ್ ಒತ್ತಿರಿ. ಪ್ರದೇಶವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಸ್ಪೇಸ್ ಒತ್ತಿರಿ. ಕ್ಯಾಪ್ಚರ್ ಮಾಡಲು ಎಂಟರ್ ಒತ್ತಿರಿ.</translation> <translation id="8938800817013097409">USB-C ಸಾಧನ (ಹಿಂಭಾಗದಲ್ಲಿನ ಬಲ ಪೋರ್ಟ್)</translation> <translation id="8939855324412367560">ಇನ್ಪುಟ್ ಆಡಿಯೋ "<ph name="INPUT_DEVICE_NAME" />" ಮತ್ತು ಔಟ್ಪುಟ್ ಆಡಿಯೋ "<ph name="OUTPUT_DEVICE_NAME" />" ಆಗಿದೆ. ಬದಲಾಯಿಸಲು ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ.</translation> <translation id="8940956008527784070">ಬ್ಯಾಟರಿ ಕಡಿಮೆ (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index e214f1e1..41153ce 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> 키를 누른 상태에서 링크 클릭</translation> <translation id="2957159466053076448">언제든지 설정에서 이러한 기능을 사용 중지할 수 있습니다. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">기기 오디오</translation> -<translation id="2960314608273155470">캡처 모드, 기본값은 <ph name="SOURCE" /> <ph name="TYPE" />입니다. 키보드 탐색을 사용하려면 Tab 키를 누르세요.</translation> <translation id="2961963223658824723">문제가 발생했습니다. 잠시 후 다시 시도해 주세요.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">마이크 액세스를 사용 설정하시겠습니까?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google 문서 만들기</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{파일 1개}other{파일 #개}}</translation> <translation id="8936501819958976551">비활성화됨</translation> -<translation id="8937312474322077653">화면 캡처에서 <ph name="SOURCE" /> <ph name="TYPE" /> 유형으로 설정합니다. 캡처 유형을 선택하려면 Tab 키를 누르세요. 스페이스바를 눌러 지역을 선택하세요. 캡처하려면 Enter 키를 누르세요.</translation> <translation id="8938800817013097409">USB-C 기기(우측 후면 포트)</translation> <translation id="8939855324412367560">입력 오디오와 출력 오디오가 각각 "<ph name="INPUT_DEVICE_NAME" />" 및 "<ph name="OUTPUT_DEVICE_NAME" />"입니다. 설정으로 이동하여 해당 설정을 변경하세요.</translation> <translation id="8940956008527784070">배터리 부족(<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index eb467b3f..c6a2e20 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> баскычын басып, шилтемени чыкылдатыңыз</translation> <translation id="2957159466053076448">Бул функцияларды каалаган убакта Параметрлерден өчүрө аласыз. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Түзмөктөгү аудиолор</translation> -<translation id="2960314608273155470">Сүрөткө тартуу режими, демейки шартта: <ph name="SOURCE" /> <ph name="TYPE" />. Өтүү үчүн баскычтоптогу "Tab" баскычын басыңыз.</translation> <translation id="2961963223658824723">Бир жерден ката кетти. Бир нече секунддан кийин кайталап көрүңүз.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Микрофонду пайдалануу мүмкүнчүлүгүн күйгүзөсүзбү?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google документин түзүү</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 файл}other{# файл}}</translation> <translation id="8936501819958976551">өчүрүлдү</translation> -<translation id="8937312474322077653">Экрандагыны тартып алууда <ph name="SOURCE" /> <ph name="TYPE" /> деп коюңуз. Тартуу түрүн тандоо үчүн өтмөктү басыңыз. Аймакты тандоо үчүн боштук баскычын басыңыз. Тартуу үчүн Enter баскычын басыңыз.</translation> <translation id="8938800817013097409">USB-C түзмөгү (аркасындагы оң жактагы оюкча)</translation> <translation id="8939855324412367560">Киргизүүчү түзмөк – "<ph name="INPUT_DEVICE_NAME" />", ал эми чыгаруучу түзмөк – "<ph name="OUTPUT_DEVICE_NAME" />". Өзгөртүү үчүн параметрлерге өтүңүз.</translation> <translation id="8940956008527784070">Батарея аз (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 54e21f6..15f7052c07 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">ກົດ <ph name="MODIFIER" /> ແລ້ວຄລິກລິ້ງ</translation> <translation id="2957159466053076448">ທ່ານສາມາດປິດຄຸນສົມບັດເຫຼົ່ານີ້ຕອນໃດກໍໄດ້ໃນການຕັ້ງຄ່າ. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">ສຽງຈາກອຸປະກອນ</translation> -<translation id="2960314608273155470">ໂໝດບັນທຶກ, ຄ່າເລີ່ມຕົ້ນແມ່ນ <ph name="SOURCE" /> <ph name="TYPE" />. ກົດແຖບສຳລັບການນຳທາງແປ້ນພິມ.</translation> <translation id="2961963223658824723">ມີບາງຢ່າງຜິດພາດເກີດຂຶ້ນ. ກະລຸນາລອງໃໝ່ໃນອີກສອງສາມວິນາທີ.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">ເປີດສິດເຂົ້າເຖິງໄມໂຄຣໂຟນບໍ?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">ສ້າງ Google Doc</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ໄຟລ໌}other{# ໄຟລ໌}}</translation> <translation id="8936501819958976551">ປິດນຳໃຊ້ແລ້ວ</translation> -<translation id="8937312474322077653">ໃນການຖ່າຍຮູບໜ້າຈໍ, ໃຫ້ຕັ້ງເປັນ <ph name="SOURCE" /> <ph name="TYPE" />. ກົດແຖບເພື່ອເລືອກປະເພດການຖ່າຍຮູບ. ກົດ Space ເພື່ອເລືອກພາກພື້ນ. ກົດ Enter ເພື່ອຖ່າຍຮູບ.</translation> <translation id="8938800817013097409">ອຸປະກອນ USB-C (ຜອດດ້ານຂວາຢູ່ເບື້ອງຫຼັງ)</translation> <translation id="8939855324412367560">ສຽງອິນພຸດແມ່ນ "<ph name="INPUT_DEVICE_NAME" />" ແລະ ສຽງເອົ້າພຸດແມ່ນ "<ph name="OUTPUT_DEVICE_NAME" />". ເຂົ້າໄປການຕັ້ງຄ່າເພື່ອປ່ຽນແປງ.</translation> <translation id="8940956008527784070">ແບັດເຕີຣີອ່ອນ (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 97bda5a..3546bf29 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Paspauskite <ph name="MODIFIER" /> ir spustelėkite nuorodą</translation> <translation id="2957159466053076448">Galite bet kada išjungti šias funkcijas skiltyje „Nustatymai“. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Įrenginio garsas</translation> -<translation id="2960314608273155470">Užfiksavimo režimas, numatytoji parinktis yra <ph name="SOURCE" /> <ph name="TYPE" />. Norėdami naudoti klaviatūrą, paspauskite tabuliavimo klavišą.</translation> <translation id="2961963223658824723">Deja, įvyko klaida. Bandykite dar kartą po kelių sekundžių.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Įjungti prieigą prie mikrofono?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Sukurti „Google“ dokumentą</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{Vienas failas}one{# failas}few{# failai}many{# failo}other{# failų}}</translation> <translation id="8936501819958976551">išaktyvinta</translation> -<translation id="8937312474322077653">Įjungę ekrano fiksavimą nustatykite <ph name="SOURCE" /> <ph name="TYPE" />. Paspauskite tabuliavimo klavišą, kad pasirinktumėte fiksavimo tipą. Paspauskite tarpo klavišą, kad pasirinktumėte sritį. Paspauskite „Enter“, kad užfiksuotumėte.</translation> <translation id="8938800817013097409">USB-C įrenginys (prievadas dešinėje, užpakalinėje dalyje)</translation> <translation id="8939855324412367560">Įvesties garso įrašas yra „<ph name="INPUT_DEVICE_NAME" />“, o išvesties garsas – „<ph name="OUTPUT_DEVICE_NAME" />“. Eikite į skiltį „Nustatymai“ ir pakeiskite.</translation> <translation id="8940956008527784070">Akumuliatorius senka (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index a42a7bf..ab0f96e 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Nospiediet <ph name="MODIFIER" /> un noklikšķiniet uz saites</translation> <translation id="2957159466053076448">Iestatījumos varat jebkurā laikā izslēgt šīs funkcijas. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Ierīces audio</translation> -<translation id="2960314608273155470">Uzņemšanas režīms, noklusējuma iestatījums: <ph name="SOURCE" /> <ph name="TYPE" />. Lai aktivizētu tastatūras navigāciju, nospiediet tabulēšanas taustiņu.</translation> <translation id="2961963223658824723">Radās problēma. Pēc dažām sekundēm mēģiniet vēlreiz.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Vai ieslēgt piekļuvi mikrofonam?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Izveidot Google dokumentu</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fails}zero{# failu}one{# fails}other{# faili}}</translation> <translation id="8936501819958976551">deaktivizēta</translation> -<translation id="8937312474322077653">Ekrānuzņēmuma izveidei atlasiet šādu iestatījumu: <ph name="SOURCE" /> <ph name="TYPE" />. Lai izvēlētos ekrānuzņēmuma izveides veidu, nospiediet tabulēšanas taustiņu. Nospiediet atstarpes taustiņu, lai atlasītu reģionu. Nospiediet taustiņu Enter, lai sāktu izveidi.</translation> <translation id="8938800817013097409">USB-C ierīce (pieslēgvieta aizmugurē pa labi)</translation> <translation id="8939855324412367560">Ieejas audio ierīce ir <ph name="INPUT_DEVICE_NAME" />, un izvades audio ierīce ir <ph name="OUTPUT_DEVICE_NAME" />. Lai tās mainītu, pārejiet uz iestatījumiem.</translation> <translation id="8940956008527784070">Akumulators gandrīz tukšs (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 40b55e9..c82a408 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Притиснете <ph name="MODIFIER" /> и кликнете на линк</translation> <translation id="2957159466053076448">Функцииве може да ги исклучите во „Поставки“ кога сакате. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Аудио од уредот</translation> -<translation id="2960314608273155470">Режим на снимање. Стандардната поставка е „<ph name="TYPE" />“ (<ph name="SOURCE" />). Притиснете Tab за навигација со тастатура.</translation> <translation id="2961963223658824723">Нешто тргна наопаку. Обидете се повторно за неколку секунди.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Да се вклучи пристап до микрофонот?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Создај документ на Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 датотека}one{# датотека}other{# датотеки}}</translation> <translation id="8936501819958976551">деактивирано</translation> -<translation id="8937312474322077653">Во „Снимање на екранот“, поставете на <ph name="SOURCE" /> <ph name="TYPE" />. Притиснете Tab за да го изберете типот снимање. Притиснете Space за да го изберете регионот. Притиснете Enter за да снимате.</translation> <translation id="8938800817013097409">USB-Ц уред (десна порта од задната страна)</translation> <translation id="8939855324412367560">Влезот за аудио е „<ph name="INPUT_DEVICE_NAME" />“, а излезот за аудио е „<ph name="OUTPUT_DEVICE_NAME" />“. Одете во „Поставки“ за да промените.</translation> <translation id="8940956008527784070">Слаба батерија (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 15768ac..7e1fc75 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> അമർത്തി ഒരു ലിങ്ക് ക്ലിക്ക് ചെയ്യുക</translation> <translation id="2957159466053076448">ക്രമീകരണത്തിൽ ഏതുസമയത്തും നിങ്ങൾക്ക് ഈ ഫീച്ചറുകൾ ഓഫാക്കാം. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">ഉപകരണത്തിന്റെ ഓഡിയോ</translation> -<translation id="2960314608273155470">ക്യാപ്ചർ മോഡ്, <ph name="SOURCE" /> <ph name="TYPE" /> ഡിഫോൾട്ട് ആണ്. കീബോർഡ് നാവിഗേഷന് Tab അമർത്തുക.</translation> <translation id="2961963223658824723">എന്തോ കുഴപ്പം സംഭവിച്ചു. അൽപ്പസമയത്തിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">മൈക്രോഫോൺ ആക്സസ് ഓണാക്കണോ?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Google ഡോക് സൃഷ്ടിക്കുക</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{ഒരു ഫയൽ}other{# ഫയലുകൾ}}</translation> <translation id="8936501819958976551">നിർജീവമാക്കി</translation> -<translation id="8937312474322077653">സ്ക്രീൻ ക്യാപ്ച്ചറിൽ, <ph name="SOURCE" /> <ph name="TYPE" /> എന്നതായി സജ്ജീകരിക്കുക. ക്യാപ്ച്ചർ തരം തിരഞ്ഞെടുക്കാൻ Tab അമർത്തുക. പ്രദേശം തിരഞ്ഞെടുക്കാൻ Space അമർത്തുക. ക്യാപ്ചർ ചെയ്യാൻ Enter അമർത്തുക.</translation> <translation id="8938800817013097409">USB-C ഉപകരണം (പുറകിൽ വലതുവശത്തെ പോർട്ട്)</translation> <translation id="8939855324412367560">ഇൻപുട്ട് ഓഡിയോ "<ph name="INPUT_DEVICE_NAME" />" എന്നതും ഔട്ട്പുട്ട് വീഡിയോ "<ph name="OUTPUT_DEVICE_NAME" />" എന്നതുമാണ്. മാറ്റാൻ ക്രമീകരണത്തിൽ പോകുക.</translation> <translation id="8940956008527784070">ബാറ്ററി കുറവാണ് (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index f4355f1..45dc6df 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" />-г дараад холбоосыг товшино уу</translation> <translation id="2957159466053076448">Та эдгээр онцлогийг Тохиргоонд хүссэн үедээ унтраах боломжтой. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Төхөөрөмжийн аудио</translation> -<translation id="2960314608273155470">Зураг авах горим. Өгөгдмөл нь <ph name="SOURCE" /> <ph name="TYPE" /> байна. Гарын навигац ашиглах бол tab дээр дарна уу.</translation> <translation id="2961963223658824723">Алдаа гарлаа. Хэдэн секундын дараа дахин оролдоно уу.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Микрофоны хандалтыг асаах уу?</translation> @@ -2435,7 +2434,6 @@ <translation id="8934418770423095813">Google Док үүсгэх</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 файл}other{# файл}}</translation> <translation id="8936501819958976551">идэвхгүй болгосон</translation> -<translation id="8937312474322077653">Дэлгэцийн зураг авах явцад <ph name="SOURCE" /> <ph name="TYPE" /> болгож тохируулна уу. Зураг авах төрлийг сонгохын тулд tab дээр дарна уу. Бүс сонгохын тулд зай авах товчин дээр дарна уу. Зураг авахын тулд enter дээр дарна уу.</translation> <translation id="8938800817013097409">USB-C төхөөрөмж (ард талын баруун порт)</translation> <translation id="8939855324412367560">Аудио оролт нь "<ph name="INPUT_DEVICE_NAME" />" бол гаралт нь "<ph name="OUTPUT_DEVICE_NAME" />" юм. Өөрчлөхийн тулд Тохиргоо руу очно уу.</translation> <translation id="8940956008527784070">Цэнэг бага байна ( <ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index cdfeae4e..dc07ef0 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> प्रेस करा आणि लिंकवर क्लिक करा</translation> <translation id="2957159466053076448">तुम्ही सेटिंग्ज मध्ये कधीही ही वैशिष्ट्ये बंद करू शकता. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">डिव्हाइस ऑडिओ</translation> -<translation id="2960314608273155470">कॅप्चर मोड, <ph name="SOURCE" /> <ph name="TYPE" /> हा डीफॉल्ट आहे. कीबोर्ड नेव्हिगेशनसाठी टॅब प्रेस करा.</translation> <translation id="2961963223658824723">काहीतरी चूक झाली. काही सेकंदांनी पुन्हा प्रयत्न करा.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">मायक्रोफोनचा अॅक्सेस सुरू करायचा आहे का?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google Doc तयार करा</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{१ फाइल}other{# फाइल}}</translation> <translation id="8936501819958976551">डीॲक्टिव्हेट केले आहे</translation> -<translation id="8937312474322077653">स्क्रीन कॅप्चरमध्ये, <ph name="SOURCE" /> <ph name="TYPE" /> वर सेट करा. कॅप्चराचा प्रकार निवडण्यासाठी टॅब प्रेस करा. प्रदेश निवडण्यासाठी स्पेस प्रेस करा. कॅप्चर करण्यासाठी एंटर प्रेस करा.</translation> <translation id="8938800817013097409">USB-C डिव्हाइस (मागील बाजूचे उजवे पोर्ट)</translation> <translation id="8939855324412367560">"<ph name="INPUT_DEVICE_NAME" />" हा इनपुट ऑडिओ आहे आणि "<ph name="OUTPUT_DEVICE_NAME" />" हा आउटपुट ऑडिओ आहे. बदलण्यासाठी सेटिंग्ज वर जा.</translation> <translation id="8940956008527784070">बॅटरी कमी झाली (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index f5850b30..3a699e9 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Tekan <ph name="MODIFIER" /> dan klik pautan</translation> <translation id="2957159466053076448">Anda boleh mematikan ciri tersebut pada bila-bila masa dalam Tetapan.<ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio peranti</translation> -<translation id="2960314608273155470">Mod Tangkap, pilihan lalai ialah <ph name="SOURCE" /> <ph name="TYPE" />. Tekan tab untuk menavigasi papan kekunci.</translation> <translation id="2961963223658824723">Maaf, kesilapan telah berlaku. Cuba lagi dalam beberapa saat.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Hidupkan akses mikrofon?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Buat Dokumen Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fail}other{# fail}}</translation> <translation id="8936501819958976551">dinyahaktifkan</translation> -<translation id="8937312474322077653">Dalam tangkapan skrin, tetapkan kepada <ph name="SOURCE" /> <ph name="TYPE" />. Tekan tab untuk memilih jenis tangkapan. Tekan ruang untuk memilih rantau. Tekan enter untuk menangkap.</translation> <translation id="8938800817013097409">Peranti USB-C (port kanan di belakang)</translation> <translation id="8939855324412367560">Audio input ialah "<ph name="INPUT_DEVICE_NAME" />" dan audio output ialah "<ph name="OUTPUT_DEVICE_NAME" />". Akses Tetapan untuk membuat perubahan.</translation> <translation id="8940956008527784070">Bateri lemah (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 786c5556..bc8e443 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> ကို ဖိပြီး လင့်ခ်ကို နှိပ်ပါ</translation> <translation id="2957159466053076448">ဤဝန်ဆောင်မှုများကို ဆက်တင်များတွင် အချိန်မရွေး ပိတ်နိုင်သည်။ <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">စက်ပစ္စည်းအသံ</translation> -<translation id="2960314608273155470">ပုံဖမ်းယူမှုမုဒ်၊ မူရင်းမှာ <ph name="SOURCE" /> <ph name="TYPE" /> ဖြစ်သည်။ ကီးဘုတ် လမ်းညွှန်အတွက် တဘ်ကိုနှိပ်ပါ။</translation> <translation id="2961963223658824723">တစ်ခုခုမှားယွင်း နေသည်။ မိနစ်အနည်းငယ်အကြာတွင် ထပ်စမ်းကြည့်ပါ။</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">မိုက်ခရိုဖုန်းသုံးခွင့် ဖွင့်မလား။</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Google Doc ပြုလုပ်ရန်</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{ဖိုင် ၁ ဖိုင်}other{ဖိုင် # ဖိုင်}}</translation> <translation id="8936501819958976551">ရပ်ထားသည်</translation> -<translation id="8937312474322077653">ဖန်သားပြင် ပုံဖမ်းခြင်းတွင် <ph name="SOURCE" /> <ph name="TYPE" /> သို့ သတ်မှတ်ပါ။ ရိုက်ကူးမှုအမျိုးအစားရွေးရန် တဘ်ခလုတ်နှိပ်ပါ။ အပိုင်းရွေးရန် နေရာခြားခလုတ်နှိပ်ပါ။ ရိုက်ကူးရန် Enter ခလုတ်နှိပ်ပါ။</translation> <translation id="8938800817013097409">USB-C ကိရိယာ (ကျောဘက် ညာ ပို့တ်)</translation> <translation id="8939855324412367560">အသံဝင်မည့် ကိရိယာသည် “<ph name="INPUT_DEVICE_NAME" />” ဖြစ်ပြီး အသံထွက်မည့် ကိရိယာသည် “<ph name="OUTPUT_DEVICE_NAME" />” ဖြစ်သည်။ ပြောင်းရန် ဆက်တင်များသို့ သွားပါ။</translation> <translation id="8940956008527784070">ဓာတ်ခဲအားနည်း (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index 7a21fc2..cad82c1 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> थिच्नुहोस् र कुनै लिंकमा क्लिक गर्नुहोस्</translation> <translation id="2957159466053076448">तपाईं सेटिङमा गई जुनसुकै बेला यी सुविधाहरू अफ गर्न सक्नुहुन्छ। <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">डिभाइसको अडियो</translation> -<translation id="2960314608273155470">क्याप्चर मोड, डिफल्ट मोड <ph name="SOURCE" /> <ph name="TYPE" /> हो। किबोर्डमार्फत नेभिगेसन गर्न ट्याब की थिच्नुहोस्।</translation> <translation id="2961963223658824723">कुनै समस्या आयो। केही बेरमा फेरि प्रयास गर्नुहोस्।</translation> <translation id="2963773877003373896">मोड3</translation> <translation id="2965227184985674128">माइक्रोफोन प्रयोग गर्ने अनुमति अन गर्ने हो?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google कागजात प्रयोग गरी डकुमेन्ट बनाउनुहोस्</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{एउटा फाइल}other{# वटा फाइल}}</translation> <translation id="8936501819958976551">निष्क्रिय पारियो</translation> -<translation id="8937312474322077653">स्क्रिन क्याप्चरमा गई <ph name="SOURCE" /> <ph name="TYPE" /> सेट गर्नुहोस्। क्याप्चरको प्रकार छनौट गर्न ट्याब थिच्नुहोस्। क्षेत्र चयन गर्न स्पेस थिच्नुहोस्। क्याप्चर गर्न इन्टर थिच्नुहोस्।</translation> <translation id="8938800817013097409">USB-C यन्त्र (पछाडिको दायाँ पोर्ट)</translation> <translation id="8939855324412367560">इनपुट अडियो "<ph name="INPUT_DEVICE_NAME" />" हो र आउटपुट अडियो "<ph name="OUTPUT_DEVICE_NAME" />" हो। परिवर्तन गर्न "सेटिङ" मा जानुहोस्।</translation> <translation id="8940956008527784070">ब्याटरी कम (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index bb5ea8c..f9afb931 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Druk op <ph name="MODIFIER" /> en klik op een link</translation> <translation id="2957159466053076448">Je kunt deze functies altijd uitzetten in Instellingen. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audio van apparaat</translation> -<translation id="2960314608273155470">Opnamemodus, standaard is <ph name="SOURCE" /> <ph name="TYPE" />. Druk op Tab voor toetsenbordnavigatie.</translation> <translation id="2961963223658824723">Er is iets misgegaan. Probeer het over een paar seconden opnieuw.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Microfoontoegang aanzetten?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google-document maken</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 bestand}other{# bestanden}}</translation> <translation id="8936501819958976551">gedeactiveerd</translation> -<translation id="8937312474322077653">Je zit in de functie voor schermopname, die is ingesteld op <ph name="SOURCE" /> <ph name="TYPE" />. Druk op Tab om het opnametype te kiezen. Druk op de spatiebalk om de regio te selecteren. Druk op Enter om op te nemen.</translation> <translation id="8938800817013097409">USB-C-apparaat (poort rechts aan de achterkant)</translation> <translation id="8939855324412367560">De invoeraudio is <ph name="INPUT_DEVICE_NAME" /> en de uitvoeraudio is <ph name="OUTPUT_DEVICE_NAME" />. Ga naar Instellingen voor wijzigingen.</translation> <translation id="8940956008527784070">Batterij is bijna leeg (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 30d85ff..fb16a5d 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Trykk på <ph name="MODIFIER" /> og klikk på en link</translation> <translation id="2957159466053076448">Du kan når som helst slå av disse funksjonene i innstillingene. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Enhetslyd</translation> -<translation id="2960314608273155470">Opptaksmodus – standard er <ph name="SOURCE" /> <ph name="TYPE" />. Trykk på Tab for å navigere med tastaturet.</translation> <translation id="2961963223658824723">Noe gikk galt. Prøv på nytt om noen sekunder.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Vil du slå på mikrofontilgang?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Opprett Google-dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fil}other{# filer}}</translation> <translation id="8936501819958976551">deaktivert</translation> -<translation id="8937312474322077653">I skjermbilde angir du <ph name="SOURCE" /> <ph name="TYPE" />. Trykk på Tab for å velge bildetype. Trykk på mellomromstasten for å velge region. Trykk på Enter for å ta bilde.</translation> <translation id="8938800817013097409">USB-C-enhet (høyre port på baksiden)</translation> <translation id="8939855324412367560">Innenheten for lyd er «<ph name="INPUT_DEVICE_NAME" />», og utenheten for lyd er «<ph name="OUTPUT_DEVICE_NAME" />». Gå til innstillingene for å endre dette.</translation> <translation id="8940956008527784070">Lavt batterinivå (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index ef9766f..e36aa1d 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" />କୁ ଦବାଇ ଏକ ଲିଙ୍କରେ କ୍ଲିକ କରନ୍ତୁ</translation> <translation id="2957159466053076448">ଆପଣ ସେଟିଂସରେ ଯେ କୌଣସି ସମୟରେ ଏହି ଫିଚରଗୁଡ଼ିକୁ ବନ୍ଦ କରିପାରିବେ। <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">ଡିଭାଇସ ଅଡିଓ</translation> -<translation id="2960314608273155470">କ୍ୟାପଚର ମୋଡ, ଡିଫଲ୍ଟ ହେଉଛି <ph name="SOURCE" /> <ph name="TYPE" />। କୀବୋର୍ଡ ନାଭିଗେସନ ପାଇଁ Tabକୁ ଦବାନ୍ତୁ।</translation> <translation id="2961963223658824723">କିଛି ସମସ୍ୟା ହୋଇଛି। କିଛି ସେକେଣ୍ଡ ମଧ୍ୟରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">ମାଇକ୍ରୋଫୋନ ଆକ୍ସେସକୁ ଚାଲୁ କରିବେ?</translation> @@ -2432,7 +2431,6 @@ <translation id="8934418770423095813">Google Doc ତିଆରି କରନ୍ତୁ</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1ଟି ଫାଇଲ}other{#ଟି ଫାଇଲ}}</translation> <translation id="8936501819958976551">ନିଷ୍କ୍ରିୟ କରାଯାଇଛି</translation> -<translation id="8937312474322077653">ସ୍କ୍ରିନ କେପଚରରେ, <ph name="SOURCE" /> <ph name="TYPE" />ରେ ସେଟ କରନ୍ତୁ। କେପଚର ପ୍ରକାର ବାଛିବାକୁ ଟାବକୁ ଦବାନ୍ତୁ। ଅଞ୍ଚଳ ଚୟନ କରିବାକୁ ସ୍ପେସକୁ ଦବାନ୍ତୁ। କେପଚର କରିବାକୁ ଏଣ୍ଟର ଦବାନ୍ତୁ।</translation> <translation id="8938800817013097409">USB-C ଡିଭାଇସ୍ (ପଛରେ ଥିବା ଡାହାଣପଟ ପୋର୍ଟ)</translation> <translation id="8939855324412367560">ଇନପୁଟ ଅଡିଓ ହେଉଛି "<ph name="INPUT_DEVICE_NAME" />" ଏବଂ ଆଉଟପୁଟ ଅଡିଓ ହେଉଛି "<ph name="OUTPUT_DEVICE_NAME" />"। ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ ସେଟିଂସକୁ ଯାଆନ୍ତୁ।</translation> <translation id="8940956008527784070">ବ୍ୟାଟେରୀ କମ୍ ଅଛି (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 0b573f32..2bad2f7 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> ਦਬਾ ਕੇ ਲਿੰਕ 'ਤੇ ਕਲਿੱਕ ਕਰੋ</translation> <translation id="2957159466053076448">ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਕਿਸੇ ਵੀ ਸਮੇਂ ਇਨ੍ਹਾਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ। <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">ਡੀਵਾਈਸ ਆਡੀਓ</translation> -<translation id="2960314608273155470">ਕੈਪਚਰ ਮੋਡ, <ph name="SOURCE" /> <ph name="TYPE" /> ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਹੈ। ਕੀ-ਬੋਰਡ ਨੈਵੀਗੇਸ਼ਨ ਲਈ ਟੈਬ ਦਬਾਓ।</translation> <translation id="2961963223658824723">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ। ਕੁਝ ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">ਕੀ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚ ਚਾਲੂ ਕਰਨੀ ਹੈ?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Google ਡੌਕ ਬਣਾਓ</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ਫ਼ਾਈਲ}one{# ਫ਼ਾਈਲ}other{# ਫ਼ਾਈਲਾਂ}}</translation> <translation id="8936501819958976551">ਅਕਿਰਿਆਸ਼ੀਲ ਕੀਤਾ ਗਿਆ</translation> -<translation id="8937312474322077653">ਸਕ੍ਰੀਨ ਕੈਪਚਰ ਵਿੱਚ, <ph name="SOURCE" /> <ph name="TYPE" /> 'ਤੇ ਸੈੱਟ ਕਰੋ। ਕੈਪਚਰ ਦੀ ਕਿਸਮ ਚੁਣਨ ਲਈ Tab ਦਬਾਓ। ਖੇਤਰ ਚੁਣਨ ਲਈ Space ਦਬਾਓ। ਕੈਪਚਰ ਕਰਨ ਲਈ Enter ਦਬਾਓ।</translation> <translation id="8938800817013097409">USB-C ਡੀਵਾਈਸ (ਪਿੱਛੇ ਸੱਜਾ ਪੋਰਟ)</translation> <translation id="8939855324412367560">ਇਨਪੁੱਟ ਆਡੀਓ "<ph name="INPUT_DEVICE_NAME" />" ਹੈ ਅਤੇ ਆਊਟਪੁੱਟ ਆਡੀਓ "<ph name="OUTPUT_DEVICE_NAME" />" ਹੈ। ਤਬਦੀਲੀ ਕਰਨ ਲਈ ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ।</translation> <translation id="8940956008527784070">ਬੈਟਰੀ ਘੱਟ (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index e89df4a..2ce64bd7 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Naciśnij <ph name="MODIFIER" /> i kliknij link</translation> <translation id="2957159466053076448">W każdej chwili możesz wyłączyć te funkcje w Ustawieniach. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Dźwięki z urządzenia</translation> -<translation id="2960314608273155470">Tryb przechwytywania, domyślny to <ph name="SOURCE" /> <ph name="TYPE" />. Aby poruszać się za pomocą klawiatury, naciśnij Tab.</translation> <translation id="2961963223658824723">Coś poszło nie tak. Spróbuj ponownie za kilka sekund.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Włączyć dostęp do mikrofonu?</translation> @@ -2432,7 +2431,6 @@ <translation id="8934418770423095813">Utwórz dokument Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 plik}few{# pliki}many{# plików}other{# pliku}}</translation> <translation id="8936501819958976551">dezaktywowana</translation> -<translation id="8937312474322077653">Na zrzucie ekranu wybierz <ph name="SOURCE" /> <ph name="TYPE" />. Aby wybrać typ zrzutu ekranu, naciśnij Tab. Aby wybrać region, naciśnij spację. Aby wykonać zrzut ekranu, naciśnij Enter.</translation> <translation id="8938800817013097409">Urządzenie USB-C (prawy port z tyłu)</translation> <translation id="8939855324412367560">Wejście audio to „<ph name="INPUT_DEVICE_NAME" />”, a wyjście audio to „<ph name="OUTPUT_DEVICE_NAME" />”. Aby to zmienić, otwórz Ustawienia.</translation> <translation id="8940956008527784070">Niski stan baterii (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 6c2e791..cabbb21 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Pressione <ph name="MODIFIER" /> e clique em um link</translation> <translation id="2957159466053076448">Você pode desativar esses recursos quando quiser nas configurações. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Áudio do dispositivo</translation> -<translation id="2960314608273155470">O padrão do modo de captura é <ph name="TYPE" /> <ph name="SOURCE" />. Pressione a tecla Tab para ativar a navegação pelo teclado.</translation> <translation id="2961963223658824723">Algo deu errado. Tente novamente em alguns segundos.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Ativar o acesso ao microfone?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Criar um arquivo do Documentos Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 arquivo}one{# arquivo}other{# arquivos}}</translation> <translation id="8936501819958976551">desativado</translation> -<translation id="8937312474322077653">Na captura de tela, defina como <ph name="SOURCE" /> <ph name="TYPE" />. Pressione "Tab" para escolher o tipo de captura. Pressione a barra de espaço para selecionar a região. Pressione "Enter" para capturar.</translation> <translation id="8938800817013097409">Dispositivo USB-C (porta traseira da direita)</translation> <translation id="8939855324412367560">O áudio de entrada vem do dispositivo "<ph name="INPUT_DEVICE_NAME" />" e o de saída vem de "<ph name="OUTPUT_DEVICE_NAME" />". Acesse as Configurações para mudar.</translation> <translation id="8940956008527784070">Nível de bateria baixo (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 41b20dc..bc582858 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Prima <ph name="MODIFIER" /> e clique num link</translation> <translation id="2957159466053076448">Pode desativar estas funcionalidades em qualquer altura nas Definições. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Áudio do dispositivo</translation> -<translation id="2960314608273155470">Modo de captura, a predefinição é <ph name="SOURCE" /> <ph name="TYPE" />. Prima Tab para a navegação do teclado.</translation> <translation id="2961963223658824723">Ocorreu um erro. Tente novamente dentro de alguns segundos.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Ativar acesso ao microfone?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Criar Documento do Google Docs</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ficheiro}other{# ficheiros}}</translation> <translation id="8936501819958976551">desativada</translation> -<translation id="8937312474322077653">Na captura de ecrã, defina como <ph name="TYPE" /> <ph name="SOURCE" />. Prima Tab para escolher o tipo de captura. Prima a barra de espaço para selecionar a região. Prima Enter para capturar.</translation> <translation id="8938800817013097409">Dispositivo USB-C (porta traseira direita)</translation> <translation id="8939855324412367560">A entrada de áudio é "<ph name="INPUT_DEVICE_NAME" />" e a saída de áudio é "<ph name="OUTPUT_DEVICE_NAME" />". Aceda às Definições para fazer alterações.</translation> <translation id="8940956008527784070">Bateria fraca (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 620b5af..5afc064e 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Apasă pe <ph name="MODIFIER" /> și dă clic pe un link</translation> <translation id="2957159466053076448">Poți dezactiva oricând aceste funcții din Setări. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Conținutul audio de la dispozitiv</translation> -<translation id="2960314608273155470">Modul de capturare, setarea prestabilită este <ph name="TYPE" /> <ph name="SOURCE" />. Apasă pe tasta Tab pentru navigare pe tastatură.</translation> <translation id="2961963223658824723">A apărut o eroare. Încearcă din nou în câteva secunde.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Activezi accesul la microfon?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Creează un document Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{Un fișier}few{# fișiere}other{# de fișiere}}</translation> <translation id="8936501819958976551">dezactivată</translation> -<translation id="8937312474322077653">În captura de ecran, setează la <ph name="SOURCE" /> <ph name="TYPE" />. Apasă pe Tab pentru a alege tipul de captură. Apasă pe tasta de spațiu pentru a selecta regiunea. Apasă pe Enter pentru a captura.</translation> <translation id="8938800817013097409">Dispozitiv USB-C (portul din dreapta în spate)</translation> <translation id="8939855324412367560">Intrarea audio provine de la <ph name="INPUT_DEVICE_NAME" />, iar conținutul se redă pe <ph name="OUTPUT_DEVICE_NAME" />. Accesează Setările pentru a le modifica.</translation> <translation id="8940956008527784070">Baterie slabă (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index f30561e..8bbcdff7 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Нажмите на ссылку, удерживая <ph name="MODIFIER" /></translation> <translation id="2957159466053076448">Эти функции можно в любой момент отключить в настройках.<ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Звук с устройства</translation> -<translation id="2960314608273155470">Режим съемки. По умолчанию: <ph name="SOURCE" />, <ph name="TYPE" />. Для навигации с помощью клавиатуры используйте клавишу Tab.</translation> <translation id="2961963223658824723">Произошла ошибка. Повторите попытку через несколько секунд.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Предоставить доступ к микрофону?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Создать документ Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 файл}one{# файл}few{# файла}many{# файлов}other{# файла}}</translation> <translation id="8936501819958976551">отключила</translation> -<translation id="8937312474322077653">Параметры записи экрана: <ph name="SOURCE" />, <ph name="TYPE" />. Чтобы изменить тип записи, нажмите Tab. Чтобы выбрать область экрана, нажмите Пробел. Чтобы начать запись, нажмите Ввод.</translation> <translation id="8938800817013097409">Устройство USB-C (порт справа на задней панели)</translation> <translation id="8939855324412367560">Устройство ввода – "<ph name="INPUT_DEVICE_NAME" />", устройство вывода – "<ph name="OUTPUT_DEVICE_NAME" />". Изменить их можно в настройках.</translation> <translation id="8940956008527784070">Низкий заряд батареи (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 3bea001..c132cf6 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> ඔබා සබැඳියක් ක්ලික් කරන්න</translation> <translation id="2957159466053076448">ඔබට මෙම විශේෂාංග සැකසීම් තුළ ඕනෑම වේලාවක ක්රියාවිරහිත කළ හැක. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">උපාංග ශ්රව්ය</translation> -<translation id="2960314608273155470">ග්රහණ ප්රකාරය, පෙරනිමි වන්නේ <ph name="SOURCE" /> <ph name="TYPE" />. යතුරු පුවරු සංචාලනය සඳහා ටැබය ඔබන්න.</translation> <translation id="2961963223658824723">යම් දෙයක් වැරදිණි. මිනිත්තු කිහිපයකින් නැවත උත්සාහ කරන්න.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">මයික්රෆෝන ප්රවේශය ක්රියාත්මක කරන්න ද?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google Doc තනන්න</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ගොනුවක්}one{ගොනු #ක්}other{ගොනු #ක්}}</translation> <translation id="8936501819958976551">ක්රියා විරහිතයි</translation> -<translation id="8937312474322077653">තිර ග්රහණයේ දී, <ph name="SOURCE" /> ලෙස <ph name="TYPE" /> සකසන්න. ග්රහණ වර්ගය තේරීමට පටිත්ත ඔබන්න. කලාපය තේරීමට ඉඩ ඔබන්න. ග්රහණය කිරීමට enter ඔබන්න.</translation> <translation id="8938800817013097409">USB-C උපාංගය (පසුපස දකුණු තොට)</translation> <translation id="8939855324412367560">ආදාන ශ්රව්ය "<ph name="INPUT_DEVICE_NAME" />" වන අතර ප්රතිදාන ශ්රව්ය "<ph name="OUTPUT_DEVICE_NAME" />" වේ. වෙනස් කිරීමට සැකසීම් වෙත යන්න.</translation> <translation id="8940956008527784070">බැටරි බලය අඩුය (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index 5dafbd08..2d446e0 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Stlačte <ph name="MODIFIER" /> a kliknite na odkaz</translation> <translation id="2957159466053076448">Tieto funkcie môžete kedykoľvek vypnúť v Nastaveniach. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Zvuk zariadenia</translation> -<translation id="2960314608273155470">Režim snímania, predvolené nastavenie je <ph name="SOURCE" /> <ph name="TYPE" />. Ak chcete používať navigáciu klávesnicou, stlačte kláves Tab.</translation> <translation id="2961963223658824723">Vyskytol sa problém. Skúste to znova o niekoľko minút.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Chcete zapnúť prístup k mikrofónu?</translation> @@ -2432,7 +2431,6 @@ <translation id="8934418770423095813">Vytvoriť dokument Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 súbor}few{# súbory}many{# files}other{# súborov}}</translation> <translation id="8936501819958976551">deaktivované</translation> -<translation id="8937312474322077653">V zázname obrazovky nastavte na <ph name="SOURCE" /> <ph name="TYPE" />. Stlačením klávesa Tab vyberte typ záznamu. Stlačením medzerníka vyberte región. Stlačením klávesa Enter vytvorte záznam.</translation> <translation id="8938800817013097409">Zariadenie USB-C (pravý port vzadu)</translation> <translation id="8939855324412367560">Zvukový vstup je <ph name="INPUT_DEVICE_NAME" /> a zvukový výstup je <ph name="OUTPUT_DEVICE_NAME" />. Zmeny môžete vykonať v Nastaveniach.</translation> <translation id="8940956008527784070">Kapacita batérie je nízka (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 80e004f..8750065 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -462,6 +462,7 @@ <translation id="2530896289327917474">Vklop ali izklop brskanja s kazalko</translation> <translation id="2531025035050312891">počasna naprava</translation> <translation id="2531107890083353124">Med vlečenjem zavihka pritisnite <ph name="KEY_ONE" /></translation> +<translation id="2532199152994248594">Povlecite ali pritisnite preslednico, če želite izbrati območje zajema</translation> <translation id="2545334090614121435">Ali poskušate uporabiti tipko Home? Uporabite</translation> <translation id="254900897760075745">Kopiranje izbrane vsebine v odložišče</translation> <translation id="2549711466868162843">Izboljšanje osvetlitve</translation> @@ -581,7 +582,6 @@ <translation id="2949420361496057765">Pritisnite <ph name="MODIFIER" /> in kliknite povezavo</translation> <translation id="2957159466053076448">Te funkcije lahko kadar koli izklopite v nastavitvah. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Zvok v napravi</translation> -<translation id="2960314608273155470">Način zajema, privzeta nastavitev je <ph name="SOURCE" /> <ph name="TYPE" />. Pritisnite tabulatorko za premikanje s tipkovnico.</translation> <translation id="2961963223658824723">Prišlo je do napake. Poskusite znova čez nekaj sekund.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Želite vklopiti dostop do mikrofona?</translation> @@ -1770,6 +1770,7 @@ <translation id="6700713906295497288">Menijski gumb UNV-ja</translation> <translation id="6704073473590541209">Izbrana ročica desnega roba, uporabite puščične tipke za premikanje</translation> <translation id="6706742084323792866">Pripenjanje tipkovnice</translation> +<translation id="6709719156428404245">Povlecite ali pritisnite preslednico, če želite izbrati območje snemanja</translation> <translation id="6710213216561001401">Prejšnji</translation> <translation id="6723839937902243910">Napajanje</translation> <translation id="672609503628871915">Oglejte si novosti</translation> @@ -2433,7 +2434,6 @@ <translation id="8934418770423095813">Ustvari Google Dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 datoteka}one{# datoteka}two{# datoteki}few{# datoteke}other{# datotek}}</translation> <translation id="8936501819958976551">deaktivirano</translation> -<translation id="8937312474322077653">Pri zajemu zaslonske slike nastavite na <ph name="SOURCE" /> <ph name="TYPE" />. Pritisnite tabulatorko, če želite izbrati vrsto zajema. Pritisnite preslednico, če želite izbrati regijo. Pritisnite Enter, da zajamete.</translation> <translation id="8938800817013097409">Naprava USB-C (vrata desno zadaj)</translation> <translation id="8939855324412367560">Zvočni vhod je »<ph name="INPUT_DEVICE_NAME" />«, zvočni izhod pa »<ph name="OUTPUT_DEVICE_NAME" />«. To lahko spremenite v nastavitvah.</translation> <translation id="8940956008527784070">Akumulator je skoraj prazen (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index eae11bd..5cef566c1 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Shtyp <ph name="MODIFIER" /> dhe kliko një lidhje</translation> <translation id="2957159466053076448">Mund t'i çaktivizosh këto veçori në çdo kohë te "Cilësimet". <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Audioja e pajisjes</translation> -<translation id="2960314608273155470">Modaliteti i regjistrimit, parazgjedhja është <ph name="TYPE" /> (<ph name="SOURCE" />). Shtyp skedën për navigimin e tastierës.</translation> <translation id="2961963223658824723">Ndodhi një gabim. Provo sërish pas pak sekondash.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Të aktivizohet qasja te mikrofoni?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Krijo "Dokument të Google"</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 skedar}other{# skedarë}}</translation> <translation id="8936501819958976551">çaktivizuar</translation> -<translation id="8937312474322077653">Në regjistrimin e ekranit, cakto te <ph name="TYPE" /> <ph name="SOURCE" />. Shtyp "Tab" për të zgjedhur llojin e regjistrimit. Shtyp tastin e hapësirës për të zgjedhur rajonin. Shtyp "Enter" për të regjistruar.</translation> <translation id="8938800817013097409">Pajisja USB-C (porta djathtas, prapa)</translation> <translation id="8939855324412367560">Audioja e hyrjes është nga "<ph name="INPUT_DEVICE_NAME" />" dhe audioja e daljes është nga "<ph name="OUTPUT_DEVICE_NAME" />". Shko te "Cilësimet" për ta ndryshuar.</translation> <translation id="8940956008527784070">Nivel i ulët baterie (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 7056e69..e34d269 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -582,7 +582,6 @@ <translation id="2949420361496057765">Pritisnite <ph name="MODIFIER" /> i kliknite na link</translation> <translation id="2957159466053076448">Te funkcije možete da isključite u bilo kom trenutku u Podešavanjima. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Zvuk uređaja</translation> -<translation id="2960314608273155470">Režim snimanja, podrazumevana vrednost je <ph name="SOURCE" /> <ph name="TYPE" />. Pritisnite Tab za kretanje pomoću tastature.</translation> <translation id="2961963223658824723">Došlo je do greške. Probajte ponovo za par sekundi.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Želite da uključite pristup mikrofonu?</translation> @@ -2437,7 +2436,6 @@ <translation id="8934418770423095813">Napravite Google dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fajl}one{# fajl}few{# fajla}other{# fajlova}}</translation> <translation id="8936501819958976551">deaktivirano</translation> -<translation id="8937312474322077653">U snimanju ekrana podesite na <ph name="SOURCE" /> <ph name="TYPE" />. Pritisnite Tab da biste izabrali tip snimanja. Pritisnite taster za razmak da biste izabrali region. Pritisnite Enter da biste snimili.</translation> <translation id="8938800817013097409">Uređaj sa USB priključkom tipa C (zadnji desni port)</translation> <translation id="8939855324412367560">Audio ulaz je <ph name="INPUT_DEVICE_NAME" />, a audio izlaz je <ph name="OUTPUT_DEVICE_NAME" />. Idite u Podešavanja da biste to promenili.</translation> <translation id="8940956008527784070">Baterija je skoro prazna (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 3f3a375..ac3052a 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -582,7 +582,6 @@ <translation id="2949420361496057765">Притисните <ph name="MODIFIER" /> и кликните на линк</translation> <translation id="2957159466053076448">Те функције можете да искључите у било ком тренутку у Подешавањима. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Звук уређаја</translation> -<translation id="2960314608273155470">Режим снимања, подразумевана вредност је <ph name="SOURCE" /> <ph name="TYPE" />. Притисните Tab за кретање помоћу тастатуре.</translation> <translation id="2961963223658824723">Дошло је до грешке. Пробајте поново за пар секунди.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Желите да укључите приступ микрофону?</translation> @@ -2437,7 +2436,6 @@ <translation id="8934418770423095813">Направите Google документ</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 фајл}one{# фајл}few{# фајла}other{# фајлова}}</translation> <translation id="8936501819958976551">деактивирано</translation> -<translation id="8937312474322077653">У снимању екрана подесите на <ph name="SOURCE" /> <ph name="TYPE" />. Притисните Tab да бисте изабрали тип снимања. Притисните тастер за размак да бисте изабрали регион. Притисните Enter да бисте снимили.</translation> <translation id="8938800817013097409">Уређај са USB прикључком типа C (задњи десни порт)</translation> <translation id="8939855324412367560">Аудио улаз је <ph name="INPUT_DEVICE_NAME" />, а аудио излаз је <ph name="OUTPUT_DEVICE_NAME" />. Идите у Подешавања да бисте то променили.</translation> <translation id="8940956008527784070">Батерија је скоро празна (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index fe7f242..23a2de4 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Tryck på <ph name="MODIFIER" /> och klicka på en länk</translation> <translation id="2957159466053076448">Du kan när som helst inaktivera dessa funktioner i inställningarna. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Ljud på enheten</translation> -<translation id="2960314608273155470">Läge för skärmbild/skärminspelning, standard är <ph name="SOURCE" /> <ph name="TYPE" />. Tryck på tabb om du vill navigera med tangentbordet.</translation> <translation id="2961963223658824723">Ett fel har uppstått. Försök igen om några sekunder.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Vill du aktivera mikrofonåtkomst?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Skapa Google-dokument</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 fil}other{# filer}}</translation> <translation id="8936501819958976551">inaktiverad</translation> -<translation id="8937312474322077653">Ange <ph name="SOURCE" /> <ph name="TYPE" /> under Skärmbild/skärminspelning. Tryck på Tabb för att välja typ av skärmbild/skärminspelning. Tryck på mellanslag för att välja region. Tryck på Retur för ta en skärmbild eller spela in.</translation> <translation id="8938800817013097409">USB-C-enhet (högra porten på baksidan)</translation> <translation id="8939855324412367560">Ljudingången är <ph name="INPUT_DEVICE_NAME" /> och ljudutgången är <ph name="OUTPUT_DEVICE_NAME" />. Du kan ändra detta i inställningarna.</translation> <translation id="8940956008527784070">Låg batterinivå (<ph name="PERCENTAGE" /> %)</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index 31f5ccd..a0cc186 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Bonyeza <ph name="MODIFIER" /> na ubofye kiungo</translation> <translation id="2957159466053076448">Unaweza kuzima vipengele hivi wakati wowote kwenye Mipangilio. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Sauti ya kifaa</translation> -<translation id="2960314608273155470">Hali ya Kupiga Picha, chaguomsingi ni <ph name="SOURCE" /> <ph name="TYPE" />. Bonyeza 'tab' ili usogeze kwa kutumia kibodi.</translation> <translation id="2961963223658824723">Hitilafu fulani imetokea. Jaribu tena baada ya sekunde chache.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Ungependa kuwasha ufikiaji wa maikrofoni?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Unda Hati ya Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{Faili 1}other{Faili #}}</translation> <translation id="8936501819958976551">kimezimwa</translation> -<translation id="8937312474322077653">Katika mchakato wa kurekodi skrini, weka mipangilio iwe <ph name="SOURCE" /> <ph name="TYPE" />. Bonyeza kichupo ili uchague jinsi ya kurekodi tukio. Bonyeza 'space' ili uchague eneo. Bonyeza 'enter' ili urekodi.</translation> <translation id="8938800817013097409">Kifaa cha USB-C (mlango wa kulia nyuma)</translation> <translation id="8939855324412367560">Kifaa cha kuingiza sauti ni "<ph name="INPUT_DEVICE_NAME" />" na kifaa cha kutoa sauti ni "<ph name="OUTPUT_DEVICE_NAME" />". Nenda kwenye mipangilio ili ubadilishe.</translation> <translation id="8940956008527784070">Betri inaisha (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 250d0d46..2b2f690 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> அழுத்தி, இணைப்பைக் கிளிக் செய்யவும்</translation> <translation id="2957159466053076448">அமைப்புகளில் எப்போது வேண்டுமானாலும் இந்த அம்சங்களை முடக்கிக்கொள்ளலாம். <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">சாதன ஆடியோ</translation> -<translation id="2960314608273155470">படமெடுப்புப் பயன்முறையின் இயல்பு, <ph name="SOURCE" /> <ph name="TYPE" />. கீபோர்டு மூலம் வழிசெலுத்துதலுக்கு Tab பட்டனை அழுத்தவும்.</translation> <translation id="2961963223658824723">ஏதோ தவறாகிவிட்டது. சில வினாடிகள் கழித்து மீண்டும் முயலவும்.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">மைக்ரோஃபோனுக்கான அணுகலை வழங்கவா?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google ஆவணத்தை உருவாக்கு</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ஃபைல்}other{# ஃபைல்கள்}}</translation> <translation id="8936501819958976551">முடக்கப்பட்டது</translation> -<translation id="8937312474322077653">ஸ்கிரீன் கேப்சரில் <ph name="SOURCE" /> <ph name="TYPE" /> என்று அமைக்கப்பட்டுள்ளது. கேப்சர் வகையைத் தேர்வுசெய்ய Tab அழுத்தவும். பகுதியைத் தேர்ந்தெடுக்க Space அழுத்தவும். கேப்சர் செய்ய Enter அழுத்தவும்.</translation> <translation id="8938800817013097409">USB-C சாதனம் (பின்பக்கம் உள்ள வலது போர்ட்)</translation> <translation id="8939855324412367560">ஆடியோ இன்புட்: "<ph name="INPUT_DEVICE_NAME" />" மற்றும் ஆடியோ அவுட்புட்: "<ph name="OUTPUT_DEVICE_NAME" />". அமைப்புகளுக்குச் சென்று மாற்றவும்.</translation> <translation id="8940956008527784070">பேட்டரி குறைவு (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 49a9ddc5..d0d7aad 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" />ను నొక్కి, లింక్ను క్లిక్ చేయండి</translation> <translation id="2957159466053076448">మీరు ఈ ఫీచర్లను సెట్టింగ్లలో ఎప్పుడైనా ఆఫ్ చేయవచ్చు. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">డివైజ్ ఆడియో</translation> -<translation id="2960314608273155470">క్యాప్చర్ మోడ్, ఆటోమేటిక్ సెట్టింగ్ <ph name="SOURCE" /> <ph name="TYPE" />. కీబోర్డ్ నావిగేషన్ కోసం Tabను నొక్కండి.</translation> <translation id="2961963223658824723">ఏదో తప్పు జరిగింది. కొన్ని క్షణాల తర్వాత మళ్లీ ట్రై చేయండి.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">మైక్రోఫోన్ యాక్సెస్ను ఆన్ చేయాలా?</translation> @@ -2434,7 +2433,6 @@ <translation id="8934418770423095813">Google డాక్ను క్రియేట్ చేయండి</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ఫైల్}other{# ఫైళ్లు}}</translation> <translation id="8936501819958976551">డీయాక్టివేట్ చేయబడింది</translation> -<translation id="8937312474322077653">స్క్రీన్ క్యాప్చర్లో, <ph name="SOURCE" /> <ph name="TYPE" />కు సెట్ చేయండి. క్యాప్చర్ రకాన్ని ఎంచుకోవడానికి ట్యాబ్ను నొక్కండి. ప్రాంతాన్ని ఎంచుకోవడానికి స్పేస్ను నొక్కండి. క్యాప్చర్ చేయడానికి Enterను నొక్కండి.</translation> <translation id="8938800817013097409">USB-C పరికరం (వెనుక భాగంలో కుడి పోర్ట్)</translation> <translation id="8939855324412367560">ఇన్పుట్ ఆడియో "<ph name="INPUT_DEVICE_NAME" />", అవుట్పుట్ ఆడియో "<ph name="OUTPUT_DEVICE_NAME" />". మార్చడానికి సెట్టింగ్లకు వెళ్లండి.</translation> <translation id="8940956008527784070">బ్యాటరీ తక్కువగా ఉంది (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index 114b9d3..f5c4f37 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">กด <ph name="MODIFIER" /> แล้วคลิกลิงก์</translation> <translation id="2957159466053076448">คุณปิดฟีเจอร์เหล่านี้ในการตั้งค่าได้ทุกเมื่อ <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">เสียงจากอุปกรณ์</translation> -<translation id="2960314608273155470">โหมดจับภาพ ค่าเริ่มต้นคือ<ph name="TYPE" /><ph name="SOURCE" /> กดแป้น Tab เพื่อไปยังส่วนต่างๆ ด้วยแป้นพิมพ์</translation> <translation id="2961963223658824723">เกิดข้อผิดพลาด โปรดลองอีกครั้งในอีกสักครู่</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">เปิดการเข้าถึงไมโครโฟนใช่ไหม</translation> @@ -2428,7 +2427,6 @@ <translation id="8934418770423095813">สร้างเอกสารใน Google เอกสาร</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ไฟล์}other{# ไฟล์}}</translation> <translation id="8936501819958976551">ปิดใช้งานอยู่</translation> -<translation id="8937312474322077653">ในการจับภาพหน้าจอ ให้ตั้งค่าเป็น <ph name="SOURCE" /> <ph name="TYPE" /> กด Tab เพื่อเลือกประเภทการจับภาพ กด Space เพื่อเลือกภูมิภาค กด Enter เพื่อจับภาพ</translation> <translation id="8938800817013097409">อุปกรณ์ USB-C (พอร์ตด้านหลังขวา)</translation> <translation id="8939855324412367560">เสียงอินพุตคือ "<ph name="INPUT_DEVICE_NAME" />" และเสียงเอาต์พุตคือ "<ph name="OUTPUT_DEVICE_NAME" />" โปรดเปลี่ยนที่การตั้งค่า</translation> <translation id="8940956008527784070">แบตเตอรี่ต่ำ (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 57f8ddb..db0fed9 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> tuşunu basılı tutarken bağlantıyı tıklayın</translation> <translation id="2957159466053076448">Bu özellikleri dilediğiniz zaman Ayarlar'dan kapatabilirsiniz. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Cihaz sesi</translation> -<translation id="2960314608273155470">Ekran Görüntüsü Alma Modu, varsayılan <ph name="SOURCE" /> <ph name="TYPE" />. Klavyeyle gezinmek için sekme tuşuna basın.</translation> <translation id="2961963223658824723">Bir sorun oluştu. Birkaç saniye sonra tekrar deneyin.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Mikrofon erişimi açılsın mı?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Google Dokümanı Oluştur</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 dosya}other{# dosya}}</translation> <translation id="8936501819958976551">devre dışı</translation> -<translation id="8937312474322077653">Ekran görüntüsünde <ph name="SOURCE" /> <ph name="TYPE" /> olarak ayarlayın. Yakalama türünü seçmek için Sekme tuşuna basın. Bölgeyi seçmek için boşluk tuşuna basın. Çekmek için Enter tuşuna basın.</translation> <translation id="8938800817013097409">USB-C cihaz (arkadaki sağ bağlantı noktası)</translation> <translation id="8939855324412367560">Giriş sesi "<ph name="INPUT_DEVICE_NAME" />", çıkış sesi "<ph name="OUTPUT_DEVICE_NAME" />". Değiştirmek için Ayarlar'a gidin.</translation> <translation id="8940956008527784070">Pil gücü az (%<ph name="PERCENTAGE" />)</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index b31b03e..9c8dff2 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Натисніть <ph name="MODIFIER" />, а потім – посилання</translation> <translation id="2957159466053076448">Ці функції можна будь-коли вимкнути в налаштуваннях. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Звук із пристрою</translation> -<translation id="2960314608273155470">Режим зйомки. За умовчанням – <ph name="TYPE" /> <ph name="SOURCE" />. Для навігації за допомогою клавіатури натисніть клавішу Tab.</translation> <translation id="2961963223658824723">Сталася помилка. Повторіть спробу за кілька секунд.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Надати доступ до мікрофона?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Створити документ Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 файл}one{# файл}few{# файли}many{# файлів}other{# файлу}}</translation> <translation id="8936501819958976551">деактивовано</translation> -<translation id="8937312474322077653">У налаштуваннях запису екрана вибрано область екрана "<ph name="SOURCE" />" і тип запису "<ph name="TYPE" />". Щоб вибрати тип запису, натисніть клавішу Tab. Щоб вибрати область екрана, натисніть пробіл. Щоб почати запис, натисніть клавішу Enter.</translation> <translation id="8938800817013097409">Пристрій, під’єднаний до порту USB-C (праворуч на задній панелі)</translation> <translation id="8939855324412367560">Для введення аудіо використовується <ph name="INPUT_DEVICE_NAME" />, а для виведення – <ph name="OUTPUT_DEVICE_NAME" />. Щоб внести зміни, перейдіть у налаштування.</translation> <translation id="8940956008527784070">Низький заряд акумулятора (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 3989e59..993d05d 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> دبائیں اور کسی لنک پر کلک کریں</translation> <translation id="2957159466053076448">آپ ترتیبات میں کسی بھی وقت ان خصوصیات کو آف کر سکتے ہیں۔ <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">آلہ کا آڈیو</translation> -<translation id="2960314608273155470">کیپچر وضع، <ph name="SOURCE" /> <ph name="TYPE" /> ڈیفالٹ موڈ ہے۔ کی بورڈ نیویگیشن کے لیے ٹیب دبائیں۔</translation> <translation id="2961963223658824723">کچھ غلط ہو گیا۔ چند سیکنڈ میں دوبارہ کوشش کریں۔</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">مائیکروفون تک رسائی آن کریں؟</translation> @@ -2432,7 +2431,6 @@ <translation id="8934418770423095813">Google Doc تخلیق کریں</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 فائل}other{# فائلز}}</translation> <translation id="8936501819958976551">غیر فعال</translation> -<translation id="8937312474322077653">اسکرین کیپچر میں، <ph name="TYPE" /> <ph name="SOURCE" /> پر سیٹ کریں۔ کیپچر کی قسم منتخب کرنے کے لیے ٹیب کو دبائیں۔ علاقہ منتخب کرنے کے لیے Space دبائیں۔ کیپچر کرنے کے لیے Enter دبائیں۔</translation> <translation id="8938800817013097409">USB-C آلہ (پیچھے موجود دایاں پورٹ)</translation> <translation id="8939855324412367560">ان پٹ آڈیو "<ph name="INPUT_DEVICE_NAME" />" ہے اور آؤٹ پٹ آڈیو "<ph name="OUTPUT_DEVICE_NAME" />" ہے۔ تبدیل کرنے کے لیے ترتیبات پر جائیں۔</translation> <translation id="8940956008527784070">بیٹری کم ہے (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index 28dcc444..6b99a42 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -462,6 +462,7 @@ <translation id="2530896289327917474">Faol kursor rejimini yoqish yoki oʻchirish</translation> <translation id="2531025035050312891">qurilma sekin ishlayapti</translation> <translation id="2531107890083353124">Varaqni sudrayotganda <ph name="KEY_ONE" /> tugmasini bosing</translation> +<translation id="2532199152994248594">Rasmga olinadigan hududni tanlash uchun kursorni tortib joylang yoki Boʻshliq tugmasini bosing</translation> <translation id="2545334090614121435">Home bosish kerakmi? Buni ishlating:</translation> <translation id="254900897760075745">Tanlangan kontentni vaqtincha xotiraga nusxalash</translation> <translation id="2549711466868162843">Yoritishni yaxshilash</translation> @@ -581,7 +582,6 @@ <translation id="2949420361496057765"><ph name="MODIFIER" /> bilan havola ustiga bosing</translation> <translation id="2957159466053076448">Bu funksiyalarni istalgan vaqt sozlamalar orqali faolsizlantirish mumkin. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Qurilmadagi audio</translation> -<translation id="2960314608273155470">Tasvirga olish rejimi, standart: <ph name="SOURCE" /> <ph name="TYPE" />. Klaviaturada harakatlanish uchun tab tugmasini bosing.</translation> <translation id="2961963223658824723">Xatolik yuz berdi. Bir necha soniyadan keyin qayta urining.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Mikrofondan foydalanishga ruxsat berilsinmi?</translation> @@ -1770,6 +1770,7 @@ <translation id="6700713906295497288">IME menyusi tugmasi</translation> <translation id="6704073473590541209">Oʻng chekka dastasi belgilandi, tomon strelkalari yordamida suring</translation> <translation id="6706742084323792866">PIN kod klaviaturasi</translation> +<translation id="6709719156428404245">Yozib olinadigan hududni tanlash uchun kursorni tortib joylang yoki Boʻshliq tugmasini bosing</translation> <translation id="6710213216561001401">Avvalgi</translation> <translation id="6723839937902243910">Quvvat</translation> <translation id="672609503628871915">Nimalar yangiligini ko‘ring</translation> @@ -2433,7 +2434,6 @@ <translation id="8934418770423095813">Google Doc hujjatini yaratish</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 ta fayl}other{# ta fayl}}</translation> <translation id="8936501819958976551">faolsizlantirildi</translation> -<translation id="8937312474322077653">Ekranni yozib olish parametrlari: <ph name="SOURCE" />, <ph name="TYPE" />. Yozuv turini oʻzgartirish uchun Tab tugmasini bosing. Ekran hududini tanlash uchun Boʻshliq tugmasini bosing. Yozib olish uchun Enter tugmasini bosing.</translation> <translation id="8938800817013097409">USB-C qurilma (orqa tomondagi o‘ng port)</translation> <translation id="8939855324412367560">Audio manbasi: "<ph name="INPUT_DEVICE_NAME" />" va audio chiqarish qurilmasi: "<ph name="OUTPUT_DEVICE_NAME" />". Sozlamalar orqali oʻzgartirish mumkin.</translation> <translation id="8940956008527784070">Batareya zaryadi kam (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 67aaab0..f121149 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Nhấn phím <ph name="MODIFIER" /> rồi nhấp vào một đường liên kết</translation> <translation id="2957159466053076448">Bạn có thể tắt các tính năng này bất cứ lúc nào trong phần Cài đặt. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Âm thanh trên thiết bị</translation> -<translation id="2960314608273155470">Chế độ chụp, mặc định là <ph name="SOURCE" /> <ph name="TYPE" />. Nhấn phím Tab để di chuyển bằng bàn phím.</translation> <translation id="2961963223658824723">Đã xảy ra sự cố. Hãy thử lại sau vài giây.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Cho phép truy cập micrô?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Tạo Google Tài liệu</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 tệp}other{# tệp}}</translation> <translation id="8936501819958976551">đã tắt</translation> -<translation id="8937312474322077653">Trong chế độ chụp ảnh màn hình, hãy đặt thành <ph name="SOURCE" /> <ph name="TYPE" />. Nhấn phím Tab để chọn kiểu chụp. Nhấn phím cách để chọn khu vực. Nhấn phím Enter để chụp.</translation> <translation id="8938800817013097409">Thiết bị USB-C (cổng bên phải ở phía sau)</translation> <translation id="8939855324412367560">Âm thanh đầu vào là "<ph name="INPUT_DEVICE_NAME" />" và âm thanh đầu ra là "<ph name="OUTPUT_DEVICE_NAME" />". Chuyển đến phần Cài đặt để thay đổi.</translation> <translation id="8940956008527784070">Pin yếu (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index a4b3849..761feff 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">在按住 <ph name="MODIFIER" /> 的同时点击链接</translation> <translation id="2957159466053076448">您随时可以在“设置”中关闭这些功能。<ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">设备音频</translation> -<translation id="2960314608273155470">截屏/录屏模式,默认为<ph name="SOURCE" /><ph name="TYPE" />。按 Tab 键即可使用键盘进行导航。</translation> <translation id="2961963223658824723">出了点问题。请过几秒钟后重试。</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">开启麦克风使用权限?</translation> @@ -2431,7 +2430,6 @@ <translation id="8934418770423095813">创建 Google 文档</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 个文件}other{# 个文件}}</translation> <translation id="8936501819958976551">已停用</translation> -<translation id="8937312474322077653">在屏幕截取中,将其设置为<ph name="SOURCE" /><ph name="TYPE" />。按 Tab 键可选择截取类型。按空格键可选择区域。按 Enter 键可截取。</translation> <translation id="8938800817013097409">USB-C 设备(背面右侧端口)</translation> <translation id="8939855324412367560">音频输入设备为“<ph name="INPUT_DEVICE_NAME" />”,音频输出设备为“<ph name="OUTPUT_DEVICE_NAME" />”。如需更改,请前往“设置”。</translation> <translation id="8940956008527784070">电池电量不足 (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index 030e9c3..5e89c206 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">按 <ph name="MODIFIER" /> 鍵,然後按一下連結</translation> <translation id="2957159466053076448">你可隨時在「設定」中關閉這些功能。<ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">裝置音訊</translation> -<translation id="2960314608273155470">擷取模式,預設係<ph name="SOURCE" /><ph name="TYPE" />。㩒 tab 鍵就可以睇下鍵盤導覽資料。</translation> <translation id="2961963223658824723">系統發生錯誤,請幾秒後再試。</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">要開啟麥克風存取權嗎?</translation> @@ -2431,7 +2430,6 @@ <translation id="8934418770423095813">建立 Google 文件</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 個檔案}other{# 個檔案}}</translation> <translation id="8936501819958976551">已停用</translation> -<translation id="8937312474322077653">喺螢幕截圖入面,設定為<ph name="SOURCE" />嘅<ph name="TYPE" />。㩒 Tab 鍵可以揀擷取類型。㩒空格鍵可以揀區域。㩒 Enter 鍵就可以擷取。</translation> <translation id="8938800817013097409">USB-C 裝置 (後方右側連接埠)</translation> <translation id="8939855324412367560">音訊輸入裝置為「<ph name="INPUT_DEVICE_NAME" />」,音訊輸出裝置為「<ph name="OUTPUT_DEVICE_NAME" />」。如要變更,請前往「設定」。</translation> <translation id="8940956008527784070">電池電量不足 (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 4824203..d2d576b9 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">按下 <ph name="MODIFIER" /> 鍵,然後點選連結</translation> <translation id="2957159466053076448">你隨時可以前往「設定」關閉這些功能。<ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">裝置音訊</translation> -<translation id="2960314608273155470">擷取模式,預設為<ph name="SOURCE" /><ph name="TYPE" />。按下 Tab 鍵即可查看鍵盤瀏覽資訊。</translation> <translation id="2961963223658824723">發生錯誤,請於幾秒後再試一次。</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">要允許存取麥克風嗎?</translation> @@ -2428,7 +2427,6 @@ <translation id="8934418770423095813">建立 Google 文件</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{1 個檔案}other{# 個檔案}}</translation> <translation id="8936501819958976551">已停用</translation> -<translation id="8937312474322077653">在螢幕畫面擷取中,設為<ph name="SOURCE" />的<ph name="TYPE" />。按下 Tab 鍵選擇擷取類型。按下空格鍵選取區域。按下 Enter 鍵擷取。</translation> <translation id="8938800817013097409">USB-C 裝置 (背面右側連接埠)</translation> <translation id="8939855324412367560">音訊輸入裝置為「<ph name="INPUT_DEVICE_NAME" />」,音訊輸出裝置為「<ph name="OUTPUT_DEVICE_NAME" />」。如要變更,請前往「設定」。</translation> <translation id="8940956008527784070">電池電量不足 (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index b94976d1..a3a7b3c 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -581,7 +581,6 @@ <translation id="2949420361496057765">Cindezela u-<ph name="MODIFIER" /> uphinde uchofoze ilinki</translation> <translation id="2957159466053076448">Ungavala lezi zakhi nganoma yisiphi isikhathi Kumasethingi. <ph name="LINK_TO_LEARN_MORE" /></translation> <translation id="295852781144570696">Umsindo wedivayisi</translation> -<translation id="2960314608273155470">Imodi Yokuthatha, okuzenzakalelayo ngu-<ph name="SOURCE" /> <ph name="TYPE" />. Chofoza ithebhu yokuzulazula kwekhibhodi.</translation> <translation id="2961963223658824723">Kukhona okungahambanga kahle. Zama futhi kumasekhondi ambalwa.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="2965227184985674128">Vula ukufinyelela kwemakrofoni?</translation> @@ -2433,7 +2432,6 @@ <translation id="8934418770423095813">Dala Amadokhumenti e-Google</translation> <translation id="8934926665751933910">{NUM_FILES,plural, =1{Ifayela eli-1}one{Amafayela angu-#}other{Amafayela angu-#}}</translation> <translation id="8936501819958976551">kwenziwe kwangasebenzi</translation> -<translation id="8937312474322077653">Ukuthatha isikrini, kusethwe kokuthi <ph name="SOURCE" /> <ph name="TYPE" />. Chofa ithebhu ukuze ukhethe uhlobo lokushutha. Chofa isikhala ukuze ukhethe isifunda. Chofa u-enter ukuze uthathe isithombe.</translation> <translation id="8938800817013097409">Idivayisi ye-USB-C (imbobo engakwesokudla ngemuva)</translation> <translation id="8939855324412367560">Okufakwayo komsindo okuthi "<ph name="INPUT_DEVICE_NAME" />" futhi umphumela womsindo okuthi "<ph name="OUTPUT_DEVICE_NAME" />". Iya Kumasethingi ukuze ushintshe.</translation> <translation id="8940956008527784070">Ibhethri liphansi (<ph name="PERCENTAGE" />%)</translation>
diff --git a/ash/system/night_light/OWNERS b/ash/system/night_light/OWNERS index 07a939a8..5f47e7d2 100644 --- a/ash/system/night_light/OWNERS +++ b/ash/system/night_light/OWNERS
@@ -1,3 +1,2 @@ jamescook@chromium.org -afakhry@chromium.org #{LAST_RESORT_SUGGESTION}
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 00e113f..eaf96597 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -2097,6 +2097,10 @@ cflags_cc += [ # TODO(crbug.com/417996267): Fix and re-enable "-Wno-character-conversion", + + # Rust bindgen gets these flags, but uses pinned clang, so it doesn't + # recognize the new warning. Remove this during the clang roll. + "-Wno-unknown-warning-option", ] } }
diff --git a/build/rust/cargo_crate.gni b/build/rust/cargo_crate.gni index 8e5d75c..709186b 100644 --- a/build/rust/cargo_crate.gni +++ b/build/rust/cargo_crate.gni
@@ -33,6 +33,11 @@ # library_configs/executable_configs # All just as in rust_target.gni # +# enabled (optional) +# A boolean that controls whether the main target will be defined at all. +# Can be used to avoid compiling some platform-specific crates on other +# platforms. +# # epoch (optional) # The major version of the library, which is used to differentiate between # multiple versions of the same library name. This includes all leading 0s @@ -111,6 +116,11 @@ _rustc_metadata = "${_crate_name}-${invoker.epoch}" } + _enabled = true + if (defined(invoker.enabled)) { + _enabled = invoker.enabled + } + _epochlabel = "vunknown" if (defined(invoker.epoch)) { _tempepoch = string_replace(invoker.epoch, ".", "_") @@ -226,152 +236,163 @@ } # The main target, either a Rust source set or an executable. - target(_target_type, target_name) { - forward_variables_from(invoker, - "*", - TESTONLY_AND_VISIBILITY + [ - "build_root", - "build_deps", - "build_sources", - "build_script_inputs", - "build_script_outputs", - "epoch", - "unit_test_target", - "configs", - "executable_configs", - "library_configs", - "proc_macro_configs", - "rustenv", - "dev_deps", - "native_libs_dir", - ]) + if (_enabled) { + target(_target_type, target_name) { + forward_variables_from(invoker, + "*", + TESTONLY_AND_VISIBILITY + [ + "build_root", + "build_deps", + "build_sources", + "build_script_inputs", + "build_script_outputs", + "epoch", + "unit_test_target", + "configs", + "executable_configs", + "library_configs", + "proc_macro_configs", + "rustenv", + "dev_deps", + "native_libs_dir", + ]) - testonly = _testonly - if (defined(invoker.visibility)) { - visibility = invoker.visibility - } - crate_name = _crate_name - - if (defined(_output_name)) { - output_name = _output_name - } - - # Don't import the `chromium` crate into third-party code. - no_chromium_prelude = true - - # Depend by default on the `//build/rust/allocator` library, but avoid this - # dependency in `no_std` mode. This is desirable for two reasons: - # 1. It gives users of `cargo_crate` an indirect way to control presence of - # this dependency. - # 2. More importantly, it avoid cyclic dependencies like the one below: - # //build/rust/allocator:allocator -> - # ... - # //build/rust/std:std -> - # //build/rust/std/rules:addr2line (or another stdlib crate) -> - # //build/rust/allocator:allocator - no_allocator_crate = false - if (defined(invoker.no_std) && invoker.no_std) { - no_allocator_crate = true - } - - rustc_metadata = _rustc_metadata - - # TODO(crbug.com/40259764): don't default to true. This requires changes to - # third_party.toml and gnrt when generating third-party build targets. - allow_unsafe = true - - configs = [] - configs = _configs - if (_crate_type == "rlib") { - # Forward configs for unit tests. - executable_configs = invoker.executable_configs - } - - if (!defined(rustflags)) { - rustflags = [] - } - rustenv = _rustenv - - if (!defined(build_native_rust_unit_tests)) { - build_native_rust_unit_tests = _crate_type != "proc-macro" - } - if (build_native_rust_unit_tests) { - # Unit tests in a proc-macro crate type don't make sense, you can't - # compile executables against the `proc_macro` crate. - assert(_crate_type != "proc-macro") - } - - # The unit tests for each target, if generated, should be unique as well. - # a) It needs to be unique even if multiple build targets have the same - # `crate_name`, but different target names. - # b) It needs to be unique even if multiple build targets have the same - # `crate_name` and target name, but different epochs. - _unit_test_unique_target_name = "" - if (_crate_name != _orig_target_name) { - _unit_test_unique_target_name = "${_orig_target_name}_" - } - _unit_test_unique_epoch = "" - if (defined(invoker.epoch)) { - _epoch_str = string_replace(invoker.epoch, ".", "_") - _unit_test_unique_epoch = "v${_epoch_str}_" - } - if (defined(output_dir) && output_dir != "") { - unit_test_output_dir = output_dir - } - unit_test_target = "${_unit_test_unique_target_name}${_crate_name}_${_unit_test_unique_epoch}unittests" - - if ((!defined(output_dir) || output_dir == "") && _crate_type == "rlib") { - # Cargo crate rlibs can be compiled differently for tests, and must not - # collide with the production outputs. This does *not* override the - # unit_test_output_dir, which is set above, as that target is not an rlib. - output_dir = "$target_out_dir/$_orig_target_name" - } - - if (defined(invoker.dev_deps)) { - test_deps = invoker.dev_deps - } - - if (defined(invoker.build_root)) { - # Uh-oh, we have a build script - if (!defined(deps)) { - deps = [] + testonly = _testonly + if (defined(invoker.visibility)) { + visibility = invoker.visibility } - if (!defined(sources)) { - sources = [] - } - if (!defined(inputs)) { - inputs = [] + crate_name = _crate_name + + if (defined(_output_name)) { + output_name = _output_name } - # This... is a bit weird. We generate a file called cargo_flags.rs which - # does not actually contain Rust code, but instead some flags to add - # to the rustc command line. We need it to end in a .rs extension so that - # we can include it in the 'sources' line and thus have dependency - # calculation done correctly. data_deps won't work because targets don't - # require them to be present until runtime. - flags_file = "$_build_script_env_out_dir/cargo_flags.rs" - rustflags += [ "@" + rebase_path(flags_file, root_build_dir) ] - sources += [ flags_file ] - if (defined(invoker.build_script_outputs)) { - # Build scripts may output arbitrary files. They are usually included in - # the main Rust target using include! or include_str! and therefore the - # filename may be .rs or may be arbitrary. We want to educate ninja - # about the dependency either way. - foreach(extra_source, - filter_include(invoker.build_script_outputs, [ "*.rs" ])) { - sources += [ "$_build_script_env_out_dir/$extra_source" ] + # Don't import the `chromium` crate into third-party code. + no_chromium_prelude = true + + # Depend by default on the `//build/rust/allocator` library, but avoid this + # dependency in `no_std` mode. This is desirable for two reasons: + # 1. It gives users of `cargo_crate` an indirect way to control presence of + # this dependency. + # 2. More importantly, it avoid cyclic dependencies like the one below: + # //build/rust/allocator:allocator -> + # ... + # //build/rust/std:std -> + # //build/rust/std/rules:addr2line (or another stdlib crate) -> + # //build/rust/allocator:allocator + no_allocator_crate = false + if (defined(invoker.no_std) && invoker.no_std) { + no_allocator_crate = true + } + + rustc_metadata = _rustc_metadata + + # TODO(crbug.com/40259764): don't default to true. This requires changes to + # third_party.toml and gnrt when generating third-party build targets. + allow_unsafe = true + + configs = [] + configs = _configs + if (_crate_type == "rlib") { + # Forward configs for unit tests. + executable_configs = invoker.executable_configs + } + + if (!defined(rustflags)) { + rustflags = [] + } + rustenv = _rustenv + + if (!defined(build_native_rust_unit_tests)) { + build_native_rust_unit_tests = _crate_type != "proc-macro" + } + if (build_native_rust_unit_tests) { + # Unit tests in a proc-macro crate type don't make sense, you can't + # compile executables against the `proc_macro` crate. + assert(_crate_type != "proc-macro") + } + + # The unit tests for each target, if generated, should be unique as well. + # a) It needs to be unique even if multiple build targets have the same + # `crate_name`, but different target names. + # b) It needs to be unique even if multiple build targets have the same + # `crate_name` and target name, but different epochs. + _unit_test_unique_target_name = "" + if (_crate_name != _orig_target_name) { + _unit_test_unique_target_name = "${_orig_target_name}_" + } + _unit_test_unique_epoch = "" + if (defined(invoker.epoch)) { + _epoch_str = string_replace(invoker.epoch, ".", "_") + _unit_test_unique_epoch = "v${_epoch_str}_" + } + if (defined(output_dir) && output_dir != "") { + unit_test_output_dir = output_dir + } + unit_test_target = "${_unit_test_unique_target_name}${_crate_name}_${_unit_test_unique_epoch}unittests" + + if ((!defined(output_dir) || output_dir == "") && _crate_type == "rlib") { + # Cargo crate rlibs can be compiled differently for tests, and must not + # collide with the production outputs. This does *not* override the + # unit_test_output_dir, which is set above, as that target is not an rlib. + output_dir = "$target_out_dir/$_orig_target_name" + } + + if (defined(invoker.dev_deps)) { + test_deps = invoker.dev_deps + } + + if (defined(invoker.build_root)) { + # Uh-oh, we have a build script + if (!defined(deps)) { + deps = [] } - foreach(extra_source, - filter_exclude(invoker.build_script_outputs, [ "*.rs" ])) { - inputs += [ "$_build_script_env_out_dir/$extra_source" ] + if (!defined(sources)) { + sources = [] + } + if (!defined(inputs)) { + inputs = [] + } + + # This... is a bit weird. We generate a file called cargo_flags.rs which + # does not actually contain Rust code, but instead some flags to add + # to the rustc command line. We need it to end in a .rs extension so that + # we can include it in the 'sources' line and thus have dependency + # calculation done correctly. data_deps won't work because targets don't + # require them to be present until runtime. + flags_file = "$_build_script_env_out_dir/cargo_flags.rs" + rustflags += [ "@" + rebase_path(flags_file, root_build_dir) ] + sources += [ flags_file ] + if (defined(invoker.build_script_outputs)) { + # Build scripts may output arbitrary files. They are usually included in + # the main Rust target using include! or include_str! and therefore the + # filename may be .rs or may be arbitrary. We want to educate ninja + # about the dependency either way. + foreach(extra_source, + filter_include(invoker.build_script_outputs, [ "*.rs" ])) { + sources += [ "$_build_script_env_out_dir/$extra_source" ] + } + foreach(extra_source, + filter_exclude(invoker.build_script_outputs, [ "*.rs" ])) { + inputs += [ "$_build_script_env_out_dir/$extra_source" ] + } + } + deps += [ ":${_build_script_name}_output" ] + if (defined(_native_libs_action)) { + deps += [ ":${_native_libs_action}" ] + configs += [ ":${_native_libs_config}" ] } } - deps += [ ":${_build_script_name}_output" ] - if (defined(_native_libs_action)) { - deps += [ ":${_native_libs_action}" ] - configs += [ ":${_native_libs_config}" ] - } } + } else { + not_needed(invoker, "*", [ + "build_root", + "build_deps", + "build_sources", + "build_script_inputs", + "build_script_outputs", + ]) + not_needed("*") } if (defined(invoker.build_root)) {
diff --git a/build/rust/std/BUILD.gn.hbs b/build/rust/std/BUILD.gn.hbs index c9c4b99..265c8a4 100644 --- a/build/rust/std/BUILD.gn.hbs +++ b/build/rust/std/BUILD.gn.hbs
@@ -8,12 +8,12 @@ {{#each rules}} {{#with this.detail}} -{{#if cond}} -if ({{cond}}) { -{{/if}} cargo_crate("{{../name}}") { crate_type = "{{crate_type}}" crate_root = "{{crate_root}}" + {{#if cond}} + enabled = {{cond}} + {{/if}} sources = [ {{#each sources}} "{{this}}", @@ -160,8 +160,5 @@ {{/with}} {{/if}} } -{{#if cond}} -} -{{/if}} {{/with}} {{/each}}
diff --git a/build/rust/std/rules/BUILD.gn b/build/rust/std/rules/BUILD.gn index 8ae649d..8806893 100644 --- a/build/rust/std/rules/BUILD.gn +++ b/build/rust/std/rules/BUILD.gn
@@ -6,135 +6,133 @@ import("//build/rust/cargo_crate.gni") -if (!is_win) { - cargo_crate("addr2line") { - crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/lib.rs" - sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/bin/addr2line.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/frame.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/function.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/lazy.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/line.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/loader.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/lookup.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/unit.rs", - ] - inputs = [] - no_std = true +cargo_crate("addr2line") { + crate_type = "rlib" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/lib.rs" + enabled = !is_win + sources = [ + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/bin/addr2line.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/frame.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/function.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/lazy.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/line.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/loader.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/lookup.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/addr2line-0.24.2/src/unit.rs", + ] + inputs = [] + no_std = true - # Unit tests skipped. Generate with --with-tests to include them. - build_native_rust_unit_tests = false - edition = "2018" - cargo_pkg_version = "0.24.2" - cargo_pkg_name = "addr2line" - cargo_pkg_description = - "A cross-platform symbolication library written in Rust, using `gimli`" - library_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", + # Unit tests skipped. Generate with --with-tests to include them. + build_native_rust_unit_tests = false + edition = "2018" + cargo_pkg_version = "0.24.2" + cargo_pkg_name = "addr2line" + cargo_pkg_description = + "A cross-platform symbolication library written in Rust, using `gimli`" + library_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + library_configs += [ "//build/config/compiler:no_chromium_code" ] + executable_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + executable_configs += [ "//build/config/compiler:no_chromium_code" ] + deps = [ + "//build/rust/std:profiler_builtins_group", + "//build/rust/std:std_build_deps", + ] + if (!is_win) { + deps += [ + ":compiler_builtins", + ":gimli", + ":rustc_std_workspace_alloc", + ":rustc_std_workspace_core", ] - library_configs += [ "//build/config/compiler:no_chromium_code" ] - executable_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - ] - executable_configs += [ "//build/config/compiler:no_chromium_code" ] - deps = [ - "//build/rust/std:profiler_builtins_group", - "//build/rust/std:std_build_deps", - ] - if (!is_win) { - deps += [ - ":compiler_builtins", - ":gimli", - ":rustc_std_workspace_alloc", - ":rustc_std_workspace_core", - ] - } - aliased_deps = { - alloc = ":rustc_std_workspace_alloc" - core = ":rustc_std_workspace_core" - } - features = [ - "alloc", - "compiler_builtins", - "core", - "rustc-dep-of-std", - ] - rustenv = [ - "CFG_DISABLE_UNSTABLE_FEATURES=0", - "STD_ENV_ARCH=$rust_target_arch", - ] - rustflags = [ - "--cfg=backtrace_in_libstd", - "-Zforce-unstable-if-unmarked", - "--cap-lints=allow", # Suppress all warnings in stdlib crates - ] - output_dir = - "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } + aliased_deps = { + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" + } + features = [ + "alloc", + "compiler_builtins", + "core", + "rustc-dep-of-std", + ] + rustenv = [ + "CFG_DISABLE_UNSTABLE_FEATURES=0", + "STD_ENV_ARCH=$rust_target_arch", + ] + rustflags = [ + "--cfg=backtrace_in_libstd", + "-Zforce-unstable-if-unmarked", + "--cap-lints=allow", # Suppress all warnings in stdlib crates + ] + output_dir = + "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } -if (!is_win) { - cargo_crate("adler2") { - crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/adler2-2.0.0/src/lib.rs" - sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/adler2-2.0.0/src/algo.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/adler2-2.0.0/src/lib.rs", - ] - inputs = [] - no_std = true +cargo_crate("adler2") { + crate_type = "rlib" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/adler2-2.0.0/src/lib.rs" + enabled = !is_win + sources = [ + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/adler2-2.0.0/src/algo.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/adler2-2.0.0/src/lib.rs", + ] + inputs = [] + no_std = true - # Unit tests skipped. Generate with --with-tests to include them. - build_native_rust_unit_tests = false - edition = "2021" - cargo_pkg_version = "2.0.0" - cargo_pkg_authors = "Jonas Schievink <jonasschievink@gmail.com>, oyvindln <oyvindln@users.noreply.github.com>" - cargo_pkg_name = "adler2" - cargo_pkg_description = - "A simple clean-room implementation of the Adler-32 checksum" - library_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", + # Unit tests skipped. Generate with --with-tests to include them. + build_native_rust_unit_tests = false + edition = "2021" + cargo_pkg_version = "2.0.0" + cargo_pkg_authors = "Jonas Schievink <jonasschievink@gmail.com>, oyvindln <oyvindln@users.noreply.github.com>" + cargo_pkg_name = "adler2" + cargo_pkg_description = + "A simple clean-room implementation of the Adler-32 checksum" + library_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + library_configs += [ "//build/config/compiler:no_chromium_code" ] + executable_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + executable_configs += [ "//build/config/compiler:no_chromium_code" ] + deps = [ + "//build/rust/std:profiler_builtins_group", + "//build/rust/std:std_build_deps", + ] + if (!is_win) { + deps += [ + ":compiler_builtins", + ":rustc_std_workspace_core", ] - library_configs += [ "//build/config/compiler:no_chromium_code" ] - executable_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - ] - executable_configs += [ "//build/config/compiler:no_chromium_code" ] - deps = [ - "//build/rust/std:profiler_builtins_group", - "//build/rust/std:std_build_deps", - ] - if (!is_win) { - deps += [ - ":compiler_builtins", - ":rustc_std_workspace_core", - ] - } - aliased_deps = { - core = ":rustc_std_workspace_core" - } - features = [ - "compiler_builtins", - "core", - "rustc-dep-of-std", - ] - rustenv = [ - "CFG_DISABLE_UNSTABLE_FEATURES=0", - "STD_ENV_ARCH=$rust_target_arch", - ] - rustflags = [ - "--cfg=backtrace_in_libstd", - "-Zforce-unstable-if-unmarked", - "--cap-lints=allow", # Suppress all warnings in stdlib crates - ] - output_dir = - "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } + aliased_deps = { + core = ":rustc_std_workspace_core" + } + features = [ + "compiler_builtins", + "core", + "rustc-dep-of-std", + ] + rustenv = [ + "CFG_DISABLE_UNSTABLE_FEATURES=0", + "STD_ENV_ARCH=$rust_target_arch", + ] + rustflags = [ + "--cfg=backtrace_in_libstd", + "-Zforce-unstable-if-unmarked", + "--cap-lints=allow", # Suppress all warnings in stdlib crates + ] + output_dir = + "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } cargo_crate("alloc") { crate_type = "rlib" @@ -1159,108 +1157,107 @@ output_dir = "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } -if (!is_win) { - cargo_crate("gimli") { - crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/lib.rs" - sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/arch.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/constants.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/endianity.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/leb128.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/abbrev.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/addr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/aranges.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/cfi.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/dwarf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/endian_reader.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/endian_slice.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/index.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/line.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/lists.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/loclists.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/lookup.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/op.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/pubnames.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/pubtypes.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/reader.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/relocate.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/rnglists.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/str.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/unit.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/util.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/value.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/test_util.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/abbrev.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/cfi.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/dwarf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/endian_vec.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/line.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/loc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/op.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/range.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/relocate.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/str.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/unit.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/writer.rs", - ] - inputs = [] - no_std = true +cargo_crate("gimli") { + crate_type = "rlib" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/lib.rs" + enabled = !is_win + sources = [ + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/arch.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/common.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/constants.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/endianity.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/leb128.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/abbrev.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/addr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/aranges.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/cfi.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/dwarf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/endian_reader.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/endian_slice.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/index.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/line.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/lists.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/loclists.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/lookup.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/op.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/pubnames.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/pubtypes.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/reader.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/relocate.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/rnglists.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/str.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/unit.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/util.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/read/value.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/test_util.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/abbrev.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/cfi.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/dwarf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/endian_vec.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/line.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/loc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/op.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/range.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/relocate.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/str.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/unit.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/gimli-0.31.1/src/write/writer.rs", + ] + inputs = [] + no_std = true - # Unit tests skipped. Generate with --with-tests to include them. - build_native_rust_unit_tests = false - edition = "2018" - cargo_pkg_version = "0.31.1" - cargo_pkg_name = "gimli" - cargo_pkg_description = - "A library for reading and writing the DWARF debugging format." - library_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", + # Unit tests skipped. Generate with --with-tests to include them. + build_native_rust_unit_tests = false + edition = "2018" + cargo_pkg_version = "0.31.1" + cargo_pkg_name = "gimli" + cargo_pkg_description = + "A library for reading and writing the DWARF debugging format." + library_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + library_configs += [ "//build/config/compiler:no_chromium_code" ] + executable_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + executable_configs += [ "//build/config/compiler:no_chromium_code" ] + deps = [ + "//build/rust/std:profiler_builtins_group", + "//build/rust/std:std_build_deps", + ] + if (!is_win) { + deps += [ + ":compiler_builtins", + ":rustc_std_workspace_alloc", + ":rustc_std_workspace_core", ] - library_configs += [ "//build/config/compiler:no_chromium_code" ] - executable_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - ] - executable_configs += [ "//build/config/compiler:no_chromium_code" ] - deps = [ - "//build/rust/std:profiler_builtins_group", - "//build/rust/std:std_build_deps", - ] - if (!is_win) { - deps += [ - ":compiler_builtins", - ":rustc_std_workspace_alloc", - ":rustc_std_workspace_core", - ] - } - aliased_deps = { - alloc = ":rustc_std_workspace_alloc" - core = ":rustc_std_workspace_core" - } - features = [ - "read", - "read-core", - "rustc-dep-of-std", - ] - rustenv = [ - "CFG_DISABLE_UNSTABLE_FEATURES=0", - "STD_ENV_ARCH=$rust_target_arch", - ] - rustflags = [ - "--cfg=backtrace_in_libstd", - "-Zforce-unstable-if-unmarked", - "--cap-lints=allow", # Suppress all warnings in stdlib crates - ] - output_dir = - "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } + aliased_deps = { + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" + } + features = [ + "read", + "read-core", + "rustc-dep-of-std", + ] + rustenv = [ + "CFG_DISABLE_UNSTABLE_FEATURES=0", + "STD_ENV_ARCH=$rust_target_arch", + ] + rustflags = [ + "--cfg=backtrace_in_libstd", + "-Zforce-unstable-if-unmarked", + "--cap-lints=allow", # Suppress all warnings in stdlib crates + ] + output_dir = + "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } cargo_crate("hashbrown") { crate_type = "rlib" @@ -1345,564 +1342,560 @@ output_dir = "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } -if (!is_win) { - cargo_crate("libc") { - crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/lib.rs" - sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/fuchsia/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/fuchsia/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/fuchsia/riscv64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/fuchsia/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/hermit.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/macros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/primitives.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/psp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/sgx.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/solid/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/solid/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/solid/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/switch.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/teeos/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/trusty.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/aix/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/aix/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/b32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/b64/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/b64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/b64/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/dragonfly/errno.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/dragonfly/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd11/b32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/riscv64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/mips.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/riscv64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/sparc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/mips64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/riscv64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/sparc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/cygwin/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/b32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/b64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/native.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/hurd/b32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/hurd/b64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/hurd/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b32/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b32/x86/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b64/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b64/riscv64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b64/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/emscripten/lfs64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/emscripten/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/generic/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/mips/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/powerpc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/sparc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/arm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/csky/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/mips/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/x86/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/s390x.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/arm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/hexagon.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/mips/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/x86/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/mips64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/s390x.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/wasm32/wali.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/lfs64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/arm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/mips/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/x86_64/other.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/arm/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/espidf/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/generic.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/horizon/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/powerpc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/rtems/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/vita/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nto/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nto/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nto/neutrino.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nto/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nuttx/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/redox/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/compat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/illumos.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/solaris.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/x86_common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/aarch64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/arm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/powerpc.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/powerpc64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/riscv32.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/riscv64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/x86.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/x86_64.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/wasi/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/wasi/p2.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/windows/gnu/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/windows/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/windows/msvc/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/xous.rs", - ] - inputs = [] - no_std = true +cargo_crate("libc") { + crate_type = "rlib" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/lib.rs" + enabled = !is_win + sources = [ + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/fuchsia/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/fuchsia/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/fuchsia/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/fuchsia/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/hermit.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/macros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/primitives.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/psp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/sgx.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/solid/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/solid/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/solid/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/switch.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/teeos/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/trusty.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/aix/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/aix/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/b32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/b64/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/b64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/b64/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/apple/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/dragonfly/errno.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/dragonfly/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd11/b32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd12/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd13/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd14/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/freebsd15/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/freebsdlike/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/mips.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/sparc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/netbsd/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/mips64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/sparc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/bsd/netbsdlike/openbsd/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/cygwin/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/b32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/native.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/haiku/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/hurd/b32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/hurd/b64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/hurd/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b32/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b32/x86/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b64/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b64/riscv64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/b64/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/android/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/emscripten/lfs64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/emscripten/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/generic/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/mips/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/powerpc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/arch/sparc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/arm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/csky/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/m68k/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/mips/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b32/x86/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/loongarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/mips64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/s390x.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/gnu/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/arm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/hexagon.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/mips/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b32/x86/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/mips64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/s390x.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/wasm32/wali.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/lfs64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/musl/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/arm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/mips/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/linux/uclibc/x86_64/other.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/linux_like/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/arm/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/espidf/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/generic.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/horizon/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/powerpc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/rtems/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/newlib/vita/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nto/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nto/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nto/neutrino.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nto/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/nuttx/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/redox/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/compat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/illumos.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/solaris.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/unix/solarish/x86_common.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/aarch64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/arm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/powerpc.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/powerpc64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/riscv32.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/riscv64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/x86.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/vxworks/x86_64.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/wasi/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/wasi/p2.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/windows/gnu/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/windows/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/windows/msvc/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/src/xous.rs", + ] + inputs = [] + no_std = true - # Unit tests skipped. Generate with --with-tests to include them. - build_native_rust_unit_tests = false - edition = "2021" - cargo_pkg_version = "0.2.172" - cargo_pkg_authors = "The Rust Project Developers" - cargo_pkg_name = "libc" - cargo_pkg_description = "Raw FFI bindings to platform libraries like libc." - library_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - "//build/config/coverage:default_coverage", - ] - library_configs += [ "//build/config/compiler:no_chromium_code" ] - executable_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - ] - executable_configs += [ "//build/config/compiler:no_chromium_code" ] - deps = [ "//build/rust/std:std_build_deps" ] - if (!is_win) { - deps += [ ":rustc_std_workspace_core" ] - } - features = [ - "align", - "rustc-dep-of-std", - "rustc-std-workspace-core", - ] - build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/build.rs" - build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/build.rs" ] - rustenv = [ - "CFG_DISABLE_UNSTABLE_FEATURES=0", - "STD_ENV_ARCH=$rust_target_arch", - ] - rustflags = [ - "--cfg=backtrace_in_libstd", - "-Zforce-unstable-if-unmarked", - "--cap-lints=allow", # Suppress all warnings in stdlib crates - ] - output_dir = - "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" + # Unit tests skipped. Generate with --with-tests to include them. + build_native_rust_unit_tests = false + edition = "2021" + cargo_pkg_version = "0.2.172" + cargo_pkg_authors = "The Rust Project Developers" + cargo_pkg_name = "libc" + cargo_pkg_description = "Raw FFI bindings to platform libraries like libc." + library_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + "//build/config/coverage:default_coverage", + ] + library_configs += [ "//build/config/compiler:no_chromium_code" ] + executable_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + executable_configs += [ "//build/config/compiler:no_chromium_code" ] + deps = [ "//build/rust/std:std_build_deps" ] + if (!is_win) { + deps += [ ":rustc_std_workspace_core" ] } + features = [ + "align", + "rustc-dep-of-std", + "rustc-std-workspace-core", + ] + build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/build.rs" + build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/libc-0.2.172/build.rs" ] + rustenv = [ + "CFG_DISABLE_UNSTABLE_FEATURES=0", + "STD_ENV_ARCH=$rust_target_arch", + ] + rustflags = [ + "--cfg=backtrace_in_libstd", + "-Zforce-unstable-if-unmarked", + "--cap-lints=allow", # Suppress all warnings in stdlib crates + ] + output_dir = + "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } -if (!is_win) { - cargo_crate("memchr") { - crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/lib.rs" - sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/neon/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/neon/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/neon/packedpair.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/packedpair/default_rank.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/packedpair/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/rabinkarp.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/shiftor.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/twoway.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/generic/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/generic/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/generic/packedpair.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/simd128/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/simd128/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/simd128/packedpair.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/avx2/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/avx2/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/avx2/packedpair.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/sse2/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/sse2/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/sse2/packedpair.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/cow.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/ext.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/macros.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/memchr.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/memmem/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/memmem/searcher.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/memchr/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/memchr/naive.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/memchr/prop.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/packedpair.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/substring/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/substring/naive.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/substring/prop.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/vector.rs", - ] - inputs = [] - no_std = true +cargo_crate("memchr") { + crate_type = "rlib" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/lib.rs" + enabled = !is_win + sources = [ + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/neon/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/neon/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/aarch64/neon/packedpair.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/packedpair/default_rank.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/packedpair/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/rabinkarp.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/shiftor.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/all/twoway.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/generic/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/generic/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/generic/packedpair.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/simd128/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/simd128/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/wasm32/simd128/packedpair.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/avx2/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/avx2/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/avx2/packedpair.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/sse2/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/sse2/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/arch/x86_64/sse2/packedpair.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/cow.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/ext.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/macros.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/memchr.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/memmem/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/memmem/searcher.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/memchr/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/memchr/naive.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/memchr/prop.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/packedpair.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/substring/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/substring/naive.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/tests/substring/prop.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/memchr-2.7.4/src/vector.rs", + ] + inputs = [] + no_std = true - # Unit tests skipped. Generate with --with-tests to include them. - build_native_rust_unit_tests = false - edition = "2021" - cargo_pkg_version = "2.7.4" - cargo_pkg_authors = "Andrew Gallant <jamslam@gmail.com>, bluss" - cargo_pkg_name = "memchr" - cargo_pkg_description = "Provides extremely fast (uses SIMD on x86_64, aarch64 and wasm32) routines for 1, 2 or 3 byte search and single substring search." - library_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", + # Unit tests skipped. Generate with --with-tests to include them. + build_native_rust_unit_tests = false + edition = "2021" + cargo_pkg_version = "2.7.4" + cargo_pkg_authors = "Andrew Gallant <jamslam@gmail.com>, bluss" + cargo_pkg_name = "memchr" + cargo_pkg_description = "Provides extremely fast (uses SIMD on x86_64, aarch64 and wasm32) routines for 1, 2 or 3 byte search and single substring search." + library_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + library_configs += [ "//build/config/compiler:no_chromium_code" ] + executable_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + executable_configs += [ "//build/config/compiler:no_chromium_code" ] + deps = [ + "//build/rust/std:profiler_builtins_group", + "//build/rust/std:std_build_deps", + ] + if (!is_win) { + deps += [ + ":compiler_builtins", + ":rustc_std_workspace_core", ] - library_configs += [ "//build/config/compiler:no_chromium_code" ] - executable_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - ] - executable_configs += [ "//build/config/compiler:no_chromium_code" ] - deps = [ - "//build/rust/std:profiler_builtins_group", - "//build/rust/std:std_build_deps", - ] - if (!is_win) { - deps += [ - ":compiler_builtins", - ":rustc_std_workspace_core", - ] - } - aliased_deps = { - core = ":rustc_std_workspace_core" - } - features = [ - "compiler_builtins", - "core", - "rustc-dep-of-std", - ] - rustenv = [ - "CFG_DISABLE_UNSTABLE_FEATURES=0", - "STD_ENV_ARCH=$rust_target_arch", - ] - rustflags = [ - "--cfg=backtrace_in_libstd", - "-Zforce-unstable-if-unmarked", - "--cap-lints=allow", # Suppress all warnings in stdlib crates - ] - output_dir = - "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } + aliased_deps = { + core = ":rustc_std_workspace_core" + } + features = [ + "compiler_builtins", + "core", + "rustc-dep-of-std", + ] + rustenv = [ + "CFG_DISABLE_UNSTABLE_FEATURES=0", + "STD_ENV_ARCH=$rust_target_arch", + ] + rustflags = [ + "--cfg=backtrace_in_libstd", + "-Zforce-unstable-if-unmarked", + "--cap-lints=allow", # Suppress all warnings in stdlib crates + ] + output_dir = + "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } -if (!is_win) { - cargo_crate("miniz_oxide") { - crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/lib.rs" - sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/buffer.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/core.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/stored.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/stream.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/zlib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/inflate/core.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/inflate/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/inflate/output_buffer.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/inflate/stream.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/serde/big_array.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/serde/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/shared.rs", - ] - inputs = [] - no_std = true +cargo_crate("miniz_oxide") { + crate_type = "rlib" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/lib.rs" + enabled = !is_win + sources = [ + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/buffer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/core.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/stored.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/stream.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/deflate/zlib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/inflate/core.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/inflate/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/inflate/output_buffer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/inflate/stream.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/serde/big_array.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/serde/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/miniz_oxide-0.8.8/src/shared.rs", + ] + inputs = [] + no_std = true - # Unit tests skipped. Generate with --with-tests to include them. - build_native_rust_unit_tests = false - edition = "2021" - cargo_pkg_version = "0.8.8" - cargo_pkg_authors = "Frommi <daniil.liferenko@gmail.com>, oyvindln <oyvindln@users.noreply.github.com>, Rich Geldreich richgel99@gmail.com" - cargo_pkg_name = "miniz_oxide" - cargo_pkg_description = "DEFLATE compression and decompression library rewritten in Rust based on miniz" - library_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", + # Unit tests skipped. Generate with --with-tests to include them. + build_native_rust_unit_tests = false + edition = "2021" + cargo_pkg_version = "0.8.8" + cargo_pkg_authors = "Frommi <daniil.liferenko@gmail.com>, oyvindln <oyvindln@users.noreply.github.com>, Rich Geldreich richgel99@gmail.com" + cargo_pkg_name = "miniz_oxide" + cargo_pkg_description = "DEFLATE compression and decompression library rewritten in Rust based on miniz" + library_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + library_configs += [ "//build/config/compiler:no_chromium_code" ] + executable_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + executable_configs += [ "//build/config/compiler:no_chromium_code" ] + deps = [ + "//build/rust/std:profiler_builtins_group", + "//build/rust/std:std_build_deps", + ] + if (!is_win) { + deps += [ + ":adler2", + ":compiler_builtins", + ":rustc_std_workspace_alloc", + ":rustc_std_workspace_core", ] - library_configs += [ "//build/config/compiler:no_chromium_code" ] - executable_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - ] - executable_configs += [ "//build/config/compiler:no_chromium_code" ] - deps = [ - "//build/rust/std:profiler_builtins_group", - "//build/rust/std:std_build_deps", - ] - if (!is_win) { - deps += [ - ":adler2", - ":compiler_builtins", - ":rustc_std_workspace_alloc", - ":rustc_std_workspace_core", - ] - } - aliased_deps = { - alloc = ":rustc_std_workspace_alloc" - core = ":rustc_std_workspace_core" - } - features = [ - "alloc", - "compiler_builtins", - "core", - "rustc-dep-of-std", - ] - rustenv = [ - "CFG_DISABLE_UNSTABLE_FEATURES=0", - "STD_ENV_ARCH=$rust_target_arch", - ] - rustflags = [ - "--cfg=backtrace_in_libstd", - "-Zforce-unstable-if-unmarked", - "--cap-lints=allow", # Suppress all warnings in stdlib crates - ] - output_dir = - "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } + aliased_deps = { + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" + } + features = [ + "alloc", + "compiler_builtins", + "core", + "rustc-dep-of-std", + ] + rustenv = [ + "CFG_DISABLE_UNSTABLE_FEATURES=0", + "STD_ENV_ARCH=$rust_target_arch", + ] + rustflags = [ + "--cfg=backtrace_in_libstd", + "-Zforce-unstable-if-unmarked", + "--cap-lints=allow", # Suppress all warnings in stdlib crates + ] + output_dir = + "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } -if (!is_win) { - cargo_crate("object") { - crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/lib.rs" - sources = [ - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/archive.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/bytes.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/elf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/error.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/table.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/common.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/elf.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/endian.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/lib.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/macho.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/pe.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/pod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/any.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/archive.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/comdat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/import.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/symbol.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/attributes.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/comdat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/compression.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/dynamic.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/hash.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/note.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/segment.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/symbol.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/version.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/gnu_compression.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/dyld_cache.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/fat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/load_command.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/segment.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/symbol.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/data_directory.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/export.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/import.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/resource.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/rich.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/read_cache.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/read_ref.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/traits.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/util.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/wasm.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/comdat.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/file.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/relocation.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/section.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/segment.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/symbol.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/coff/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/coff/object.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/coff/writer.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/elf/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/elf/object.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/elf/writer.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/macho.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/mod.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/pe.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/string.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/util.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/xcoff.rs", - "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/xcoff.rs", - ] - inputs = [] - no_std = true +cargo_crate("object") { + crate_type = "rlib" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/lib.rs" + enabled = !is_win + sources = [ + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/archive.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/bytes.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/elf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/error.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/build/table.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/common.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/elf.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/endian.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/lib.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/macho.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/pe.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/pod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/any.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/archive.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/comdat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/import.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/coff/symbol.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/attributes.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/comdat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/compression.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/dynamic.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/hash.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/note.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/segment.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/symbol.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/elf/version.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/gnu_compression.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/dyld_cache.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/fat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/load_command.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/segment.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/macho/symbol.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/data_directory.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/export.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/import.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/resource.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/rich.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/pe/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/read_cache.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/read_ref.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/traits.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/util.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/wasm.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/comdat.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/file.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/relocation.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/section.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/segment.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/read/xcoff/symbol.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/coff/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/coff/object.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/coff/writer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/elf/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/elf/object.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/elf/writer.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/macho.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/mod.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/pe.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/string.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/util.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/write/xcoff.rs", + "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/src/xcoff.rs", + ] + inputs = [] + no_std = true - # Unit tests skipped. Generate with --with-tests to include them. - build_native_rust_unit_tests = false - edition = "2018" - cargo_pkg_version = "0.36.7" - cargo_pkg_name = "object" - cargo_pkg_description = - "A unified interface for reading and writing object file formats." - library_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", + # Unit tests skipped. Generate with --with-tests to include them. + build_native_rust_unit_tests = false + edition = "2018" + cargo_pkg_version = "0.36.7" + cargo_pkg_name = "object" + cargo_pkg_description = + "A unified interface for reading and writing object file formats." + library_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + library_configs += [ "//build/config/compiler:no_chromium_code" ] + executable_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + executable_configs += [ "//build/config/compiler:no_chromium_code" ] + deps = [ + "//build/rust/std:profiler_builtins_group", + "//build/rust/std:std_build_deps", + ] + if (!is_win) { + deps += [ + ":compiler_builtins", + ":memchr", + ":rustc_std_workspace_alloc", + ":rustc_std_workspace_core", ] - library_configs += [ "//build/config/compiler:no_chromium_code" ] - executable_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - ] - executable_configs += [ "//build/config/compiler:no_chromium_code" ] - deps = [ - "//build/rust/std:profiler_builtins_group", - "//build/rust/std:std_build_deps", - ] - if (!is_win) { - deps += [ - ":compiler_builtins", - ":memchr", - ":rustc_std_workspace_alloc", - ":rustc_std_workspace_core", - ] - } - aliased_deps = { - alloc = ":rustc_std_workspace_alloc" - core = ":rustc_std_workspace_core" - } - features = [ - "alloc", - "archive", - "coff", - "compiler_builtins", - "core", - "elf", - "macho", - "pe", - "read_core", - "rustc-dep-of-std", - "unaligned", - "xcoff", - ] - build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/build.rs" - build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/build.rs" ] - rustenv = [ - "CFG_DISABLE_UNSTABLE_FEATURES=0", - "STD_ENV_ARCH=$rust_target_arch", - ] - rustflags = [ - "--cfg=backtrace_in_libstd", - "-Zforce-unstable-if-unmarked", - "--cap-lints=allow", # Suppress all warnings in stdlib crates - ] - output_dir = - "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } + aliased_deps = { + alloc = ":rustc_std_workspace_alloc" + core = ":rustc_std_workspace_core" + } + features = [ + "alloc", + "archive", + "coff", + "compiler_builtins", + "core", + "elf", + "macho", + "pe", + "read_core", + "rustc-dep-of-std", + "unaligned", + "xcoff", + ] + build_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/build.rs" + build_sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/vendor/object-0.36.7/build.rs" ] + rustenv = [ + "CFG_DISABLE_UNSTABLE_FEATURES=0", + "STD_ENV_ARCH=$rust_target_arch", + ] + rustflags = [ + "--cfg=backtrace_in_libstd", + "-Zforce-unstable-if-unmarked", + "--cap-lints=allow", # Suppress all warnings in stdlib crates + ] + output_dir = + "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } cargo_crate("panic_abort") { crate_type = "rlib" @@ -3386,42 +3379,41 @@ output_dir = "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" } -if (is_win) { - cargo_crate("windows_targets") { - crate_type = "rlib" - crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/windows_targets/src/lib.rs" - sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/windows_targets/src/lib.rs" ] - inputs = [] - no_std = true +cargo_crate("windows_targets") { + crate_type = "rlib" + crate_root = "//third_party/rust-toolchain/lib/rustlib/src/rust/library/windows_targets/src/lib.rs" + enabled = is_win + sources = [ "//third_party/rust-toolchain/lib/rustlib/src/rust/library/windows_targets/src/lib.rs" ] + inputs = [] + no_std = true - # Unit tests skipped. Generate with --with-tests to include them. - build_native_rust_unit_tests = false - edition = "2024" - cargo_pkg_version = "0.0.0" - cargo_pkg_name = "windows-targets" - cargo_pkg_description = "A drop-in replacement for the real windows-targets crate for use in std only." - library_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - "//build/config/coverage:default_coverage", - ] - library_configs += [ "//build/config/compiler:no_chromium_code" ] - executable_configs -= [ - "//build/config/compiler:chromium_code", - "//build/config/compiler:disallow_unstable_features", - ] - executable_configs += [ "//build/config/compiler:no_chromium_code" ] - deps = [ "//build/rust/std:std_build_deps" ] - rustenv = [ - "CFG_DISABLE_UNSTABLE_FEATURES=0", - "STD_ENV_ARCH=$rust_target_arch", - ] - rustflags = [ - "--cfg=backtrace_in_libstd", - "-Zforce-unstable-if-unmarked", - "--cap-lints=allow", # Suppress all warnings in stdlib crates - ] - output_dir = - "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" - } + # Unit tests skipped. Generate with --with-tests to include them. + build_native_rust_unit_tests = false + edition = "2024" + cargo_pkg_version = "0.0.0" + cargo_pkg_name = "windows-targets" + cargo_pkg_description = "A drop-in replacement for the real windows-targets crate for use in std only." + library_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + "//build/config/coverage:default_coverage", + ] + library_configs += [ "//build/config/compiler:no_chromium_code" ] + executable_configs -= [ + "//build/config/compiler:chromium_code", + "//build/config/compiler:disallow_unstable_features", + ] + executable_configs += [ "//build/config/compiler:no_chromium_code" ] + deps = [ "//build/rust/std:std_build_deps" ] + rustenv = [ + "CFG_DISABLE_UNSTABLE_FEATURES=0", + "STD_ENV_ARCH=$rust_target_arch", + ] + rustflags = [ + "--cfg=backtrace_in_libstd", + "-Zforce-unstable-if-unmarked", + "--cap-lints=allow", # Suppress all warnings in stdlib crates + ] + output_dir = + "$root_out_dir/local_rustc_sysroot/lib/rustlib/$rust_abi_target/lib/" }
diff --git a/chrome/VERSION b/chrome/VERSION index 6c52b71b..7c028e4 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=138 MINOR=0 -BUILD=7183 +BUILD=7184 PATCH=0
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java index 8021e8a0..01e6cb6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
@@ -9,7 +9,6 @@ import org.chromium.base.SysUtils; import org.chromium.build.annotations.NullMarked; import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.ui.util.XrUtils; import java.util.Locale; import java.util.Set; @@ -28,19 +27,6 @@ return SysUtils.isLowEndDevice() || ChromeFeatureList.sForceListTabSwitcher.isEnabled(); } - /** - * @return whether tab drag as window is enabled. - */ - public static boolean isTabDragAsWindowEnabled() { - return XrUtils.isXrDevice(); - } - - /** Returns whether drag drop from tab strip to create new instance is enabled. */ - public static boolean isTabDragToCreateInstanceSupported() { - // TODO(crbug/328511660): Add OS version check once available. - return doesOemSupportDragToCreateInstance() || !isTabDragAsWindowEnabled(); - } - /** Returns whether device OEM is allow-listed for tab tearing */ public static boolean doesOemSupportDragToCreateInstance() { return TAB_TEARING_OEM_ALLOWLIST.contains(Build.MANUFACTURER.toLowerCase(Locale.US));
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb index 9febe3e..a57f232 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">የዚህ ንጥል ዋጋ በቅርቡ ከ<ph name="PREVIOUS_PRICE" /> ወደ <ph name="NEW_PRICE" /> ቀንሷል</translation> <translation id="6109251075362363230">በጣም በቅርብ ጊዜ ጥቅም ላይ ከዋለው ቅጂ በስተቀር ሁሉም የተባዙ ትሮች አሁን በማህደር ይቀመጣሉ።</translation> <translation id="6193448654517602979">ትሮችን ምረጥ</translation> +<translation id="6220820548421939212">አዎ። ገብቼያለሁ</translation> <translation id="6228793724645064692">(የተሰጠ ደረጃ)</translation> <translation id="6271513594716432922">ሁሉንም የቦዘኑ ትሮች ዝጋ</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{ትርን ወደ አዲስ ቡድን ያክሉ}one{ትርን ወደ አዲስ ቡድን ያክሉ}other{ትሮችን ወደ አዲስ ቡድን ያክሉ}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">እንቅስቃሴ</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> ደረጃ፣ <ph name="REVIEWS_COUNT_ONE" /> ግምገማ}one{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> ደረጃ፣<ph name="REVIEWS_COUNT_MANY" /> ግምገማዎች}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> ደረጃ፣<ph name="REVIEWS_COUNT_MANY" /> ግምገማዎች}}</translation> <translation id="7885132941432959125">ቅርን ወደ ቀኝ አንቀሳቅስ</translation> +<translation id="788914896430720926">ገቢር ያልሆነ ክፍልዎን ንፁህ አድርገው ያቆያሉ?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> አልተመረጠም</translation> <translation id="7942349550061667556">ቀይ</translation> <translation id="7961015016161918242">በፍጹም</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">በእነዚህ ማንነትን የማያሳውቁ ትሮች ውስጥ የሚኖርዎት እንቅስቃሴ ከዚህ መሣሪያ ላይ ይወገዳል</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{ከ<ph name="NUM_MONTHS_ONE" /> ወር በፊት የተፈጠረ}one{ከ<ph name="NUM_MONTHS_MANY" /> ወር በፊት የተፈጠረ}other{ከ<ph name="NUM_MONTHS_MANY" /> ወሮች በፊት የተፈጠረ}}</translation> <translation id="8820741577754260431">በትሮችዎ ላይ የዋጋ ቅነሳዎችን ይመልከቱ</translation> +<translation id="883379923675618699">Chrome በ3 ወራት ውስጥ ያልተጠቀሙባቸውን ገቢር ባልሆነ ክፍል ውስጥ ያሉ ንጥሎችን በራስ-ሰር ይዘጋል። ይህን አሁን ወይም በማንኛውም ጊዜ ቅንብሮች ውስጥ ማጥፋት ይችላሉ።</translation> <translation id="8887921976452567404">የእርስዎ የተዘጉ ትሮች እና ቡድኖች ከቅርብ ጊዜ የትሮች ክፍል እና ከትር ቡድኖች ክፍል እንደገና ሊከፈቱ ይችላሉ።</translation> <translation id="8915916167043355778">ሁሉንም ዝጋ</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{ወደ አዲስ መስኮት ያንቀሳቅሱ}one{ወደ ሌላ መስኮት ያንቀሳቅሱ}other{ወደ ሌላ መስኮት ያንቀሳቅሱ}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb index 499b179..fb1201d3 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">শেহতীয়াকৈ এইটো বস্তুৰ মূল্য <ph name="PREVIOUS_PRICE" />ৰ পৰা <ph name="NEW_PRICE" />লৈ হ্ৰাস পাইছে</translation> <translation id="6109251075362363230">আটাইবোৰ ডুপ্লিকেট টেবো এতিয়া আৰ্কাইভ কৰা হ’ব, য’ত একেবাৰে শেহতীয়াকৈ ব্যৱহাৰ কৰা প্ৰতিলিপিটোৰ ক্ষেত্ৰত ব্যতিক্ৰম থাকিব।</translation> <translation id="6193448654517602979">টেবসমূহ বাছনি কৰক</translation> +<translation id="6220820548421939212">হয়। মই সন্মত</translation> <translation id="6228793724645064692">(ষ্ট’ৰৰ মূল্যাংকন)</translation> <translation id="6271513594716432922">আটাইবোৰ নিষ্ক্ৰিয় টেব বন্ধ কৰক</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{নতুন গোটত টেব যোগ দিয়ক}one{নতুন গোটত টেবসমূহ যোগ দিয়ক}other{নতুন গোটত টেবসমূহ যোগ দিয়ক}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">কাৰ্যকলাপ</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> মূল্যাংকন, <ph name="REVIEWS_COUNT_ONE" /> টা পৰ্যালোচনা}one{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> মূল্যাংকন, <ph name="REVIEWS_COUNT_MANY" /> টা পৰ্যালোচনা}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> মূল্যাংকন, <ph name="REVIEWS_COUNT_MANY" /> টা পৰ্যালোচনা}}</translation> <translation id="7885132941432959125">টেবটো সোঁফাললৈ নিয়ক</translation> +<translation id="788914896430720926">আপোনাৰ নিষ্ক্ৰিয় শাখাটো পৰিপাটিকৈ ৰাখিবনে?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> বাছনি কৰা হোৱা নাই</translation> <translation id="7942349550061667556">ৰঙা</translation> <translation id="7961015016161918242">কেতিয়াও নহয়</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">এই ইনক’গনিট’ টেবসমূহত আপুনি কৰা কাৰ্যকলাপ এই ডিভাইচটোৰ পৰা আঁতৰোৱা হ’ব</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> মাহ পূৰ্বে সৃষ্টি কৰা হৈছে}one{<ph name="NUM_MONTHS_MANY" /> মাহ পূৰ্বে সৃষ্টি কৰা হৈছে}other{<ph name="NUM_MONTHS_MANY" /> মাহ পূৰ্বে সৃষ্টি কৰা হৈছে}}</translation> <translation id="8820741577754260431">আপোনাৰ টেবসমূহত মূল্য কমাৰ বিষয়ে তথ্য চাওক</translation> +<translation id="883379923675618699">Chromeএ নিষ্ক্ৰিয় শাখাত থকা বস্তুবোৰ স্বয়ংক্ৰিয়ভাৱে বন্ধ কৰে যিবোৰ আপুনি ৩ মাহ ধৰি ব্যৱহাৰ কৰা নাই। আপুনি এতিয়া বা যিকোনো সময়তে এইটো অফ কৰিব পাৰে।</translation> <translation id="8887921976452567404">আপোনাৰ বন্ধ কৰা টেব আৰু গোটসমূহ শেহতীয়া টেব আৰু টেবৰ গোটসমূহ শাখাৰ পৰা পুনৰ খুলিব পাৰি।</translation> <translation id="8915916167043355778">আটাইবোৰ বন্ধ কৰক</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{নতুন ৱিণ্ড’লৈ নিয়ক}one{অন্য ৱিণ্ড’লৈ নিয়ক}other{অন্য ৱিণ্ড’লৈ নিয়ক}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb index e62060b..eb211f4 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Bu element bu yaxınlarda <ph name="PREVIOUS_PRICE" /> qiymətindən <ph name="NEW_PRICE" /> qiymətinə endirilib</translation> <translation id="6109251075362363230">Ən son istifadə olunan nüsxə istisna olmaqla bütün dublikat tablar da artıq arxivlənəcək.</translation> <translation id="6193448654517602979">Tablar seçin</translation> +<translation id="6220820548421939212">Bəli. Hazıram</translation> <translation id="6228793724645064692">(mağaza reytinqi)</translation> <translation id="6271513594716432922">Bütün deaktiv tabları bağlayın</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Yeni qrupa tab əlavə edin}other{Yeni qrupa tablar əlavə edin}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Fəalliyyət</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> reytinq, <ph name="REVIEWS_COUNT_ONE" /> rəy}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> reytinq, <ph name="REVIEWS_COUNT_MANY" /> rəy}}</translation> <translation id="7885132941432959125">Tabı sağa daşıyın</translation> +<translation id="788914896430720926">Fəaliyyətsiz bölmə səliqəli saxlanılsın?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> Seçilməyib</translation> <translation id="7942349550061667556">Qırmızı</translation> <translation id="7961015016161918242">Heç vaxt</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Bu Anonim tablardakı fəaliyyət bu cihazdan silinəcək</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> ay əvvəl yaradıldı}other{<ph name="NUM_MONTHS_MANY" /> ay əvvəl yaradıldı}}</translation> <translation id="8820741577754260431">Tablarda qiymət endirimləri göstərilsin</translation> +<translation id="883379923675618699">Chrome fəaliyyətsiz bölmədə 3 ay ərzində istifadə etmədiyiniz elementləri avtomatik bağlayır. Bunu indi və ya istənilən vaxt Ayarlarda söndürə bilərsiniz.</translation> <translation id="8887921976452567404">Bağlanmış tab və qrupları Son tablar və ya Tab qrupları bölməsindən yenidən aça bilərsiniz.</translation> <translation id="8915916167043355778">Hamısını bağlayın</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Yeni pəncərəyə köçürün}other{Başqa pəncərəyə köçürün}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb index fb3d649..def94a2 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Цана на гэты тавар нядаўна знізілася з <ph name="PREVIOUS_PRICE" /> да <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Цяпер усе паўторныя ўкладкі будуць таксама адпраўляцца ў архіў, за выключэннем той, якая выкарыстоўвалася апошняй.</translation> <translation id="6193448654517602979">Выберыце ўкладкі</translation> +<translation id="6220820548421939212">Так. Згаджаюся</translation> <translation id="6228793724645064692">(ацэнка крамы)</translation> <translation id="6271513594716432922">Закрыць усе неактыўныя ўкладкі</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Дадаць укладку ў новую групу}one{Дадаць укладкі ў новую групу}few{Дадаць укладкі ў новую групу}many{Дадаць укладкі ў новую групу}other{Дадаць укладкі ў новую групу}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Дзеянні</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Ацэнка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> водгук}one{Ацэнка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> водгук}few{Ацэнка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> водгукі}many{Ацэнка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> водгукаў}other{Ацэнка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> водгуку}}</translation> <translation id="7885132941432959125">Перамясціць укладку ўправа</translation> +<translation id="788914896430720926">Выдаляць неактыўныя элементы з раздзела?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> колер не выбраны</translation> <translation id="7942349550061667556">Чырвоны</translation> <translation id="7961015016161918242">Ніколі</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Звесткі пра вашы дзеянні на гэтых укладках у рэжыме інкогніта будуць выдалены з прылады</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Створана <ph name="NUM_MONTHS_ONE" /> месяц таму}one{Створана <ph name="NUM_MONTHS_MANY" /> месяц таму}few{Створана <ph name="NUM_MONTHS_MANY" /> месяцы таму}many{Створана <ph name="NUM_MONTHS_MANY" /> месяцаў таму}other{Створана <ph name="NUM_MONTHS_MANY" /> месяца таму}}</translation> <translation id="8820741577754260431">Паказваць інфармацыю пра зніжэнне цэн на ўкладках</translation> +<translation id="883379923675618699">Chrome аўтаматычна выдаляе з раздзела неактыўныя элементы, якімі вы не карысталіся на працягу трох месяцаў. Выключыць гэту функцыю можна ў любы час у наладах.</translation> <translation id="8887921976452567404">Закрытыя ўкладкі і групы можна зноў адкрыць з раздзелаў "Нядаўнія ўкладкі" і "Групы ўкладак".</translation> <translation id="8915916167043355778">Закрыць усе</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Перамясціць у новае акно}one{Перамясціць у іншае акно}few{Перамясціць у іншае акно}many{Перамясціць у іншае акно}other{Перамясціць у іншае акно}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb index 1d458f6..4f7926f6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
@@ -123,7 +123,7 @@ <translation id="6054741997831917303">Cijena ove stavke je nedavno pala sa <ph name="PREVIOUS_PRICE" /> na <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Svi duplikati kartica će se sada arhivirati s izuzetkom posljednje korištene kopije.</translation> <translation id="6193448654517602979">Odaberite kartice</translation> -<translation id="6220820548421939212">Da. U redu</translation> +<translation id="6220820548421939212">Da. Pristajem</translation> <translation id="6228793724645064692">(ocjena trgovine)</translation> <translation id="6271513594716432922">Zatvori sve neaktivne kartice</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Dodaj karticu u novu grupu}one{Dodaj kartice u novu grupu}few{Dodaj kartice u novu grupu}other{Dodaj kartice u novu grupu}}</translation> @@ -172,7 +172,7 @@ <translation id="7853202427316060426">Aktivnost</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Ocjena <ph name="CURRENT_RATING" /> od <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> recenzija}one{Ocjena <ph name="CURRENT_RATING" /> od <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzija}few{Ocjena <ph name="CURRENT_RATING" /> od <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzije}other{Ocjena <ph name="CURRENT_RATING" /> od <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzija}}</translation> <translation id="7885132941432959125">Pomjeranje kartice udesno</translation> -<translation id="788914896430720926">Želite li da neaktivni odjeljak bude uredan?</translation> +<translation id="788914896430720926">Organizirati neaktivni odjeljak?</translation> <translation id="7939917283308035850">Nije odabrano: <ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">Crvena</translation> <translation id="7961015016161918242">Nikada</translation> @@ -199,7 +199,7 @@ <translation id="8730999928494395583">Vaša aktivnost na ovim anonimnim karticama će se ukloniti s ovog uređaja</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Kreirano je prije <ph name="NUM_MONTHS_ONE" /> mjeseca}one{Kreirano je prije <ph name="NUM_MONTHS_MANY" /> mjeseca}few{Kreirano je prije <ph name="NUM_MONTHS_MANY" /> mjeseca}other{Kreirano je prije <ph name="NUM_MONTHS_MANY" /> mjeseci}}</translation> <translation id="8820741577754260431">Vidite pad cijena na svojim karticama</translation> -<translation id="883379923675618699">Chrome automatski zatvara stavke u neaktivnom odjeljku koje niste koristili tri mjeseca. To možete isključiti u postavkama.</translation> +<translation id="883379923675618699">Chrome automatski zatvara stavke u neaktivnom odjeljku koje niste koristili 3 mjeseca. Ovo možete isključiti sada ili bilo kada u Postavkama.</translation> <translation id="8887921976452567404">Zatvorene kartice i grupe možete ponovo otvoriti iz odjeljaka Nedavne kartice i Grupe kartica.</translation> <translation id="8915916167043355778">Zatvori sve</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Premještanje u novi prozor}one{Premještanje u drugi prozor}few{Premještanje u drugi prozor}other{Premještanje u drugi prozor}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb index 1f77a0e..03c0dd2 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">El preu d'aquest article fa poc ha baixat de <ph name="PREVIOUS_PRICE" /> a <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Ara també s'arxivaran totes les pestanyes duplicades, a excepció de la còpia que s'hagi utilitzat més recentment.</translation> <translation id="6193448654517602979">Selecciona pestanyes</translation> +<translation id="6220820548421939212">Sí, d’acord</translation> <translation id="6228793724645064692">(puntuació de la botiga)</translation> <translation id="6271513594716432922">Tanca totes les pestanyes inactives</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Afegeix una pestanya al grup nou}other{Afegeix pestanyes al grup nou}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Activitat</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Puntuació: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> ressenya}other{Puntuació: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> ressenyes}}</translation> <translation id="7885132941432959125">Mou la pestanya cap a la dreta</translation> +<translation id="788914896430720926">Vols mantenir endreçada la secció inactiva?</translation> <translation id="7939917283308035850">No s'ha seleccionat <ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">Vermell</translation> <translation id="7961015016161918242">Mai</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">La teva activitat en aquestes pestanyes d'incògnit se suprimirà del dispositiu</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Creat fa <ph name="NUM_MONTHS_ONE" /> mes}other{Creat fa <ph name="NUM_MONTHS_MANY" /> mesos}}</translation> <translation id="8820741577754260431">Consulta les baixades de preu a les pestanyes</translation> +<translation id="883379923675618699">Chrome tanca automàticament els elements de la secció inactiva que no hagis utilitzat durant 3 mesos. Pots desactivar aquesta opció ara o en qualsevol moment a Configuració.</translation> <translation id="8887921976452567404">Pots tornar a obrir les pestanyes i els grups tancats des de les seccions Pestanyes recents i Grups de pestanyes.</translation> <translation id="8915916167043355778">Tanca-ho tot</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Mou a una finestra nova}other{Mou a una altra finestra}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cy.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cy.xtb index 18381bb..bef81db 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cy.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cy.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Gwnaeth pris yr eitem hon ostwng yn ddiweddar o <ph name="PREVIOUS_PRICE" /> i <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Bydd pob tab dyblyg nawr yn cael ei archifo hefyd, ac eithrio'r copi a ddefnyddiwyd yn fwyaf diweddar.</translation> <translation id="6193448654517602979">Dewis tabiau</translation> +<translation id="6220820548421939212">Ie. Iawn</translation> <translation id="6228793724645064692">(sgôr siop)</translation> <translation id="6271513594716432922">Cau pob tab anweithredol</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Ychwanegu'r tab at grŵp newydd}zero{Ychwanegu'r tabiau at grŵp newydd}two{Ychwanegu'r tabiau at grŵp newydd}few{Ychwanegu'r tabiau at grŵp newydd}many{Ychwanegu'r tabiau at grŵp newydd}other{Ychwanegu'r tabiau at grŵp newydd}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Gweithgarwch</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Sgôr <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> adolygiad}zero{Sgôr <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> adolygiad}two{Sgôr <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> adolygiad}few{Sgôr <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> adolygiad}many{Sgôr <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> adolygiad}other{Sgôr <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> adolygiad}}</translation> <translation id="7885132941432959125">Symud tab i'r dde</translation> +<translation id="788914896430720926">Cadw eich adran anweithredol yn daclus?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> Heb ei ddewis</translation> <translation id="7942349550061667556">Coch</translation> <translation id="7961015016161918242">Byth</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Bydd eich gweithgarwch yn y tabiau Anhysbys hyn yn cael eu tynnu o'r ddyfais hon</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Crëwyd <ph name="NUM_MONTHS_ONE" /> mis yn ôl}zero{Crëwyd <ph name="NUM_MONTHS_MANY" /> mis yn ôl}two{Crëwyd <ph name="NUM_MONTHS_MANY" /> fis yn ôl}few{Crëwyd <ph name="NUM_MONTHS_MANY" /> mis yn ôl}many{Crëwyd <ph name="NUM_MONTHS_MANY" /> mis yn ôl}other{Crëwyd <ph name="NUM_MONTHS_MANY" /> mis yn ôl}}</translation> <translation id="8820741577754260431">Gweld gostyngiadau prisiau yn eich tabiau</translation> +<translation id="883379923675618699">Mae Chrome yn cau eitemau yn yr adran anweithredol nad ydych wedi'u defnyddio ers 3 mis yn awtomatig. Gallwch ddiffodd hyn nawr neu unrhyw bryd yn y Gosodiadau.</translation> <translation id="8887921976452567404">Gellir ailagor eich tabiau a'ch grwpiau sydd ar gau o'r adran Tabiau diweddar a'r adran Grwpiau tabiau.</translation> <translation id="8915916167043355778">Cau'r cyfan</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Symud i ffenestr newydd}zero{Symud i ffenestr arall}two{Symud i ffenestr arall}few{Symud i ffenestr arall}many{Symud i ffenestr arall}other{Symud i ffenestr arall}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb index 6a08e190..2bfb7af8 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Prisen på denne vare er for nylig faldet fra <ph name="PREVIOUS_PRICE" /> til <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Alle dubletter af faner arkiveres nu også med undtagelse af den senest anvendte kopi.</translation> <translation id="6193448654517602979">Vælg faner</translation> +<translation id="6220820548421939212">Ja tak</translation> <translation id="6228793724645064692">(butiksanmeldelse)</translation> <translation id="6271513594716432922">Luk alle inaktive faner</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Føj fane til ny gruppe}one{Føj fane til ny gruppe}other{Føj faner til ny gruppe}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Aktivitet</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Bedømmelse: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> – <ph name="REVIEWS_COUNT_ONE" /> anmeldelse}one{Bedømmelse: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> – <ph name="REVIEWS_COUNT_MANY" /> anmeldelse}other{Bedømmelse: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> – <ph name="REVIEWS_COUNT_MANY" /> anmeldelser}}</translation> <translation id="7885132941432959125">Flyt fane til højre</translation> +<translation id="788914896430720926">Vil du rydde op i din inaktive sektion?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> er ikke valgt</translation> <translation id="7942349550061667556">Rød</translation> <translation id="7961015016161918242">Aldrig</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Din aktivitet i disse inkognitofaner fjernes fra denne enhed</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Oprettet for <ph name="NUM_MONTHS_ONE" /> måned siden}one{Oprettet for <ph name="NUM_MONTHS_MANY" /> måned siden}other{Oprettet for <ph name="NUM_MONTHS_MANY" /> måneder siden}}</translation> <translation id="8820741577754260431">Se prisfald på dine faner</translation> +<translation id="883379923675618699">Chrome lukker automatisk elementer i den inaktive sektion, som du ikke har brugt i 3 måneder. Du kan til enhver tid deaktivere dette under Indstillinger.</translation> <translation id="8887921976452567404">Dine lukkede faner og grupper kan åbnes igen via sektionerne Seneste faner og Fanegrupper.</translation> <translation id="8915916167043355778">Luk alle</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Flyt til et nyt vindue}one{Flyt til et andet vindue}other{Flyt til et andet vindue}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb index 6a7ba16..35b9a0a 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Der Preis dieses Artikels ist kürzlich von <ph name="PREVIOUS_PRICE" /> auf <ph name="NEW_PRICE" /> gefallen</translation> <translation id="6109251075362363230">Alle doppelten Tabs werden jetzt ebenfalls archiviert, mit Ausnahme der zuletzt verwendeten Kopie.</translation> <translation id="6193448654517602979">Tabs auswählen</translation> +<translation id="6220820548421939212">Ok</translation> <translation id="6228793724645064692">(Händlerbewertung)</translation> <translation id="6271513594716432922">Alle inaktiven Tabs schließen</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Tab zu neuer Gruppe hinzufügen}other{Tabs zu neuer Gruppe hinzufügen}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Aktivität</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Bewertung: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> Rezension}other{Bewertung: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> Rezensionen}}</translation> <translation id="7885132941432959125">Tab nach rechts verschieben</translation> +<translation id="788914896430720926">Im Bereich „Inaktiv“ für Ordnung sorgen?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> nicht ausgewählt</translation> <translation id="7942349550061667556">Rot</translation> <translation id="7961015016161918242">Nie</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Deine Aktivitäten auf diesen Inkognitotabs werden von diesem Gerät gelöscht</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Vor <ph name="NUM_MONTHS_ONE" /> Monat erstellt}other{Vor <ph name="NUM_MONTHS_MANY" /> Monaten erstellt}}</translation> <translation id="8820741577754260431">Preisnachlässe auf deinen Tabs sehen</translation> +<translation id="883379923675618699">Chrome schließt automatisch Elemente im Bereich „Inaktiv“, die du seit 3 Monaten nicht verwendet hast. Du kannst diese Funktion jederzeit in den Einstellungen deaktivieren.</translation> <translation id="8887921976452567404">Deine geschlossenen Tabs und Gruppen können über die Bereiche „Zuletzt geöffnete Tabs“ oder „Tabgruppen“ wieder geöffnet werden.</translation> <translation id="8915916167043355778">Alle schließen</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Zu einem neuen Fenster wechseln}other{Zu anderen Fenstern wechseln}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb index aebcfb3..b736198a 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">El precio de este artículo recientemente bajó de <ph name="PREVIOUS_PRICE" /> a <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Ahora también se archivarán todas las pestañas duplicadas, excepto la copia más reciente.</translation> <translation id="6193448654517602979">Seleccionar pestañas</translation> +<translation id="6220820548421939212">Sí. Acepto</translation> <translation id="6228793724645064692">(calificación de la tienda)</translation> <translation id="6271513594716432922">Cerrar todas las pestañas inactivas</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Agregar pestaña a un grupo nuevo}other{Agregar pestañas a un grupo nuevo}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Actividad</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Calificación: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />; <ph name="REVIEWS_COUNT_ONE" /> opinión}other{Calificación: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />; <ph name="REVIEWS_COUNT_MANY" /> opiniones}}</translation> <translation id="7885132941432959125">Mover la pestaña a la derecha</translation> +<translation id="788914896430720926">¿Quieres mantener tu sección inactiva ordenada?</translation> <translation id="7939917283308035850">No se seleccionó <ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">Rojo</translation> <translation id="7961015016161918242">Nunca</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Se quitará tu actividad en las pestañas de incógnito del dispositivo</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Se creó hace <ph name="NUM_MONTHS_ONE" /> mes}other{Se creó hace <ph name="NUM_MONTHS_MANY" /> meses}}</translation> <translation id="8820741577754260431">Visualiza los descuentos en las pestañas.</translation> +<translation id="883379923675618699">Chrome cierra automáticamente los elementos de la sección inactiva que no usaste en 3 meses. Puedes desactivar esta opción ahora o en cualquier momento en Configuración.</translation> <translation id="8887921976452567404">Puedes volver a abrir las pestañas y los grupos cerrados desde las secciones Pestañas recientes y Grupos de pestañas.</translation> <translation id="8915916167043355778">Cerrar</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Mover a una ventana nueva}other{Mover a otra ventana}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb index 6b62913..a7efdee 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">El precio de este elemento ha bajado recientemente de <ph name="PREVIOUS_PRICE" /> a <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Ahora también se archivarán todas las pestañas duplicadas, excepto la copia usada más recientemente.</translation> <translation id="6193448654517602979">Seleccionar pestañas</translation> +<translation id="6220820548421939212">Sí, acepto</translation> <translation id="6228793724645064692">(valoración de la tienda)</translation> <translation id="6271513594716432922">Cerrar todas las pestañas inactivas</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Añadir pestaña al nuevo grupo}other{Añadir pestañas al nuevo grupo}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Actividad</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Puntuación: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> reseña}other{Puntuación: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> reseñas}}</translation> <translation id="7885132941432959125">Mover pestaña a la derecha</translation> +<translation id="788914896430720926">¿Quieres mantener tu sección Inactivas ordenada?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> no seleccionado</translation> <translation id="7942349550061667556">Rojo</translation> <translation id="7961015016161918242">Nunca</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Tu actividad en estas pestañas de Incógnito se eliminará de este dispositivo</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Creado hace <ph name="NUM_MONTHS_ONE" /> mes}other{Creado hace <ph name="NUM_MONTHS_MANY" /> meses}}</translation> <translation id="8820741577754260431">Consulta las bajadas de precio en las pestañas</translation> +<translation id="883379923675618699">Chrome cierra automáticamente los elementos de la sección Inactivas que no hayas usado durante 3 meses. Puedes desactivar esta opción ahora o en cualquier momento en la configuración.</translation> <translation id="8887921976452567404">Puedes volver a abrir las pestañas y los grupos cerrados desde las secciones Pestañas recientes y Grupos de pestañas.</translation> <translation id="8915916167043355778">Cerrar todo</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Mover a una nueva ventana}other{Mover a otras ventanas}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb index b002fcd..6dbff33 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Selle üksuse hind <ph name="PREVIOUS_PRICE" /> langes hiljuti ja uus hind on <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Nüüd arhiivitakse ka kõik vahelehtede duplikaadid, välja arvatud viimati kasutatud koopia.</translation> <translation id="6193448654517602979">Valige vahelehed</translation> +<translation id="6220820548421939212">Jah. Sobib</translation> <translation id="6228793724645064692">(hinnang poes)</translation> <translation id="6271513594716432922">Sule kõik inaktiivsed vahelehed</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Vahelehe lisamine uude gruppi}other{Vahelehtede lisamine uude gruppi}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Tegevus</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> hinnang, <ph name="REVIEWS_COUNT_ONE" /> arvustus}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> hinnang, <ph name="REVIEWS_COUNT_MANY" /> arvustust}}</translation> <translation id="7885132941432959125">Teisalda vaheleht paremale</translation> +<translation id="788914896430720926">Kas soovite mitteaktiivset jaotist puhastada?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> pole valitud</translation> <translation id="7942349550061667556">Punane</translation> <translation id="7961015016161918242">Mitte kunagi</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Teie tegevused nendel inkognito vahelehtedel eemaldatakse sellest seadmest</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Loodud <ph name="NUM_MONTHS_ONE" /> kuu tagasi}other{Loodud <ph name="NUM_MONTHS_MANY" /> kuud tagasi}}</translation> <translation id="8820741577754260431">Näete oma vahelehtedel hinnalangusi</translation> +<translation id="883379923675618699">Chrome kustutab automaatselt mitteaktiivse jaotise üksused, mida te pole kolme kuu jooksul kasutanud. Saate selle igal ajal seadetes välja lülitada.</translation> <translation id="8887921976452567404">Teie suletud vahelehti ja gruppe on võimalik avada jaotistest Hiljutised vahelehed ja Vahelehegrupid.</translation> <translation id="8915916167043355778">Sule kõik</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Teisalda uude aknasse}other{Teisalda teise aknasse}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb index 4a59d08..f47924fb 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Tämän tuotteen hinta on laskenut äskettäin: aiemmin <ph name="PREVIOUS_PRICE" />, nyt <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Myös kaikki välilehtien kopiot arkistoidaan nyt, lukuun ottamatta viimeksi käytettyä kopiota.</translation> <translation id="6193448654517602979">Valitse välilehdet</translation> +<translation id="6220820548421939212">Kyllä. Laita päälle</translation> <translation id="6228793724645064692">(kauppa-arvio)</translation> <translation id="6271513594716432922">Sulje kaikki ei-aktiiviset välilehdet</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Lisää välilehti uuteen ryhmään}other{Lisää välilehtiä uuteen ryhmään}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Tapahtumat</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Arvio: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> arvostelu}other{Arvio: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> arvostelua}}</translation> <translation id="7885132941432959125">Siirrä välilehti oikealle</translation> +<translation id="788914896430720926">Pidetäänkö ei-aktiivinen osio siistinä?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" />, ei valittu</translation> <translation id="7942349550061667556">Punainen</translation> <translation id="7961015016161918242">Ei koskaan</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Toimintasi näillä incognito-välilehdillä poistetaan laitteelta</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Luotu <ph name="NUM_MONTHS_ONE" /> kuukausi sitten}other{Luotu <ph name="NUM_MONTHS_MANY" /> kuukautta sitten}}</translation> <translation id="8820741577754260431">Katso hinnanalennukset välilehdiltä</translation> +<translation id="883379923675618699">Chrome sulkee automaattisesti ei-aktiivisen osion kohteet, joita et ole käyttänyt kolmeen kuukauteen. Voit laittaa tämän pois päältä nyt tai milloin tahansa asetuksista.</translation> <translation id="8887921976452567404">Suljetut välilehdet ja ryhmät voi avata uudelleen Viimeaikaiset välilehdet‑ ja Välilehtiryhmät-osioista.</translation> <translation id="8915916167043355778">Sulje kaikki</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Siirrä uuteen ikkunaan}other{Siirrä toiseen ikkunaan}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb index 41fdbc8..f831bd4 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">આ આઇટમની કિંમત તાજેતરમાં <ph name="PREVIOUS_PRICE" />થી ઘટીને <ph name="NEW_PRICE" /> થઈ ગઈ છે</translation> <translation id="6109251075362363230">તાજેતરમાં ઉપયોગમાં લેવાયેલી કૉપિના અપવાદ સાથે તમામ ડુપ્લિકેટ ટૅબ પણ હવે આર્કાઇવ કરવામાં આવશે.</translation> <translation id="6193448654517602979">ટૅબ પસંદ કરો</translation> +<translation id="6220820548421939212">હા. હું સંમત છું</translation> <translation id="6228793724645064692">(સ્ટોરનું રેટિંગ)</translation> <translation id="6271513594716432922">તમામ નિષ્ક્રિય ટૅબ બંધ કરો</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{નવા ગ્રૂપમાં ટૅબ ઉમેરો}one{નવા ગ્રૂપમાં ટૅબ ઉમેરો}other{નવા ગ્રૂપમાં ટૅબ ઉમેરો}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">પ્રવૃત્તિ</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> રેટિંગ, <ph name="REVIEWS_COUNT_ONE" /> રિવ્યૂ}one{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> રેટિંગ, <ph name="REVIEWS_COUNT_MANY" /> રિવ્યૂ}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> રેટિંગ, <ph name="REVIEWS_COUNT_MANY" /> રિવ્યૂ}}</translation> <translation id="7885132941432959125">ટૅબને જમણે ખસેડો</translation> +<translation id="788914896430720926">તમારા નિષ્ક્રિય વિભાગને સુઘડ રાખીએ?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> પસંદ કરેલો નથી</translation> <translation id="7942349550061667556">લાલ</translation> <translation id="7961015016161918242">ક્યારેય નહીં</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">આ ડિવાઇસમાંથી આ છૂપા ટૅબમાંની તમારી પ્રવૃત્તિ કાઢી નાખવામાં આવશે</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> મહિના પહેલાં બનાવ્યું}one{<ph name="NUM_MONTHS_MANY" /> મહિના પહેલાં બનાવ્યું}other{<ph name="NUM_MONTHS_MANY" /> મહિના પહેલાં બનાવ્યું}}</translation> <translation id="8820741577754260431">તમારી ટૅબ પર કિંમતમાં ઘટાડા વિશેની માહિતી જુઓ</translation> +<translation id="883379923675618699">Chrome નિષ્ક્રિય વિભાગમાંની આઇટમને ઑટોમૅટિક રીતે બંધ કરે છે, જેનો તમારા 3 મહિનામાં ઉપયોગ ન કર્યો હોય. તમે સેટિંગમાં જઈને આને અત્યારે અથવા કોઈપણ સમયે બંધ કરી શકો છો.</translation> <translation id="8887921976452567404">તમારા બંધ થયેલા ટૅબ અને ગ્રૂપ તાજેતરના ટૅબ વિભાગ અને ટૅબના ગ્રૂપ વિભાગમાંથી ફરીથી ખોલી શકાય છે.</translation> <translation id="8915916167043355778">બધા બંધ કરો</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{નવી વિન્ડો પર ખસેડો}one{અન્ય વિન્ડો પર ખસેડો}other{અન્ય વિન્ડો પર ખસેડો}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb index bd89c76..a5aa8187 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">इस आइटम की कीमत <ph name="PREVIOUS_PRICE" /> से कम होकर <ph name="NEW_PRICE" /> हो गई है</translation> <translation id="6109251075362363230">अब सभी डुप्लीकेट टैब भी संग्रहित किए जाएंगे. हालांकि, सबसे हाल ही में इस्तेमाल किए गए डुप्लीकेट टैब को संग्रहित नहीं किया जाएगा.</translation> <translation id="6193448654517602979">टैब चुनें</translation> +<translation id="6220820548421939212">हां. मैं सहमत हूं</translation> <translation id="6228793724645064692">(स्टोर की रेटिंग)</translation> <translation id="6271513594716432922">सभी इनऐक्टिव टैब बंद करें</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{नए ग्रुप में टैब को जोड़ें}one{नए ग्रुप में टैब को जोड़ें}other{नए ग्रुप में टैब जोड़ें}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">गतिविधि</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> रेटिंग, <ph name="REVIEWS_COUNT_ONE" /> समीक्षा}one{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> रेटिंग, <ph name="REVIEWS_COUNT_MANY" /> समीक्षा}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> रेटिंग, <ph name="REVIEWS_COUNT_MANY" /> समीक्षाएं}}</translation> <translation id="7885132941432959125">टैब को दाईं ओर ले जाएं</translation> +<translation id="788914896430720926">क्या आपको अपने इनऐक्टिव आइटम वाले सेक्शन को व्यवस्थित रखना है?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> को नहीं चुना गया</translation> <translation id="7942349550061667556">लाल</translation> <translation id="7961015016161918242">कभी नहीं</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">इन गुप्त टैब में की गई आपकी गतिविधि को इस डिवाइस से हटा दिया जाएगा</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> महीने पहले बनाया गया}one{<ph name="NUM_MONTHS_MANY" /> महीने पहले बनाया गया}other{<ph name="NUM_MONTHS_MANY" /> महीने पहले बनाया गया}}</translation> <translation id="8820741577754260431">अपने टैब पर कीमत में कमी देखें</translation> +<translation id="883379923675618699">Chrome, इनऐक्टिव सेक्शन में मौजूद उन आइटम को अपने-आप बंद कर देता है जिन्हें आपने पिछले तीन महीनों से इस्तेमाल नहीं किया है. आपके पास सेटिंग में जाकर इसे अभी या किसी भी समय बंद करने का विकल्प है.</translation> <translation id="8887921976452567404">बंद किए गए टैब और ग्रुप, 'हाल ही के टैब' सेक्शन और 'टैब ग्रुप' सेक्शन में जाकर फिर से खोले जा सकते हैं.</translation> <translation id="8915916167043355778">सभी बंद करें</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{नई विंडो में ले जाएं}one{दूसरी विंडो में ले जाएं}other{दूसरी विंडो में ले जाएं}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb index 744f4f8..7425822 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Harga item ini baru-baru ini turun dari <ph name="PREVIOUS_PRICE" /> ke <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Semua tab duplikat kini juga akan diarsipkan, kecuali salinan yang terakhir digunakan.</translation> <translation id="6193448654517602979">Pilih tab</translation> +<translation id="6220820548421939212">Ya. Izinkan</translation> <translation id="6228793724645064692">(rating toko)</translation> <translation id="6271513594716432922">Menutup semua tab tidak aktif</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Tambahkan tab ke grup baru}other{Tambahkan tab ke grup baru}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Aktivitas</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Rating <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> ulasan}other{Rating <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> ulasan}}</translation> <translation id="7885132941432959125">Pindahkan tab ke kanan</translation> +<translation id="788914896430720926">Jadikan tab tidak aktif Anda tetap rapi?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> Tidak dipilih</translation> <translation id="7942349550061667556">Merah</translation> <translation id="7961015016161918242">Jangan pernah</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Aktivitas Anda di tab Samaran ini akan dihapus dari perangkat ini</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Dibuat <ph name="NUM_MONTHS_ONE" /> bulan lalu}other{Dibuat <ph name="NUM_MONTHS_MANY" /> bulan lalu}}</translation> <translation id="8820741577754260431">Lihat diskon di tab</translation> +<translation id="883379923675618699">Chrome otomatis menutup item di tab tidak aktif yang tidak Anda gunakan selama 3 bulan. Anda dapat menonaktifkannya sekarang atau kapan saja di Setelan.</translation> <translation id="8887921976452567404">Tab dan grup yang ditutup dapat dibuka kembali dari bagian Tab terbaru dan bagian Grup tab.</translation> <translation id="8915916167043355778">Tutup semua</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Pindahkan ke jendela baru}other{Pindahkan ke jendela lain}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb index 1e785961..3b2e621 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">このアイテムの価格は最近 <ph name="PREVIOUS_PRICE" /> から <ph name="NEW_PRICE" /> に下がりました</translation> <translation id="6109251075362363230">最後に使用したもの以外の重複するすべてのタブもアーカイブされるようになりました。</translation> <translation id="6193448654517602979">タブを選択</translation> +<translation id="6220820548421939212">はい。オンにします。</translation> <translation id="6228793724645064692">(ストアの評価)</translation> <translation id="6271513594716432922">アクティブでないタブをすべて閉じる</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{タブを新しいグループに追加}other{タブを新しいグループに追加}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">アクティビティ</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" /> / <ph name="RATING_BASELINE" /> の評価、<ph name="REVIEWS_COUNT_ONE" /> 件のクチコミ}other{<ph name="CURRENT_RATING" /> / <ph name="RATING_BASELINE" /> の評価、<ph name="REVIEWS_COUNT_MANY" /> 件のクチコミ}}</translation> <translation id="7885132941432959125">タブを右に移動</translation> +<translation id="788914896430720926">アクティブでないセクションを整理しますか?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> は選択されていません</translation> <translation id="7942349550061667556">赤</translation> <translation id="7961015016161918242">使用しない</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">これらのシークレット タブでのアクティビティはこのデバイスから削除されます</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> か月前に作成}other{<ph name="NUM_MONTHS_MANY" /> か月前に作成}}</translation> <translation id="8820741577754260431">タブで値下げ情報を確認します</translation> +<translation id="883379923675618699">3 か月間使用されていないセクションのアイテムを自動的に終了します。この設定は [設定] でいつでもオフにできます。</translation> <translation id="8887921976452567404">閉じたタブとグループは、[最近使ったタブ] と [タブグループ] で再度開くことができます。</translation> <translation id="8915916167043355778">すべて閉じる</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{新しいウィンドウに移動}other{他のウィンドウに移動}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb index 0e896e7..5f22dde3 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">ამ ერთეულის ფასმა ახლახან დაიკლო <ph name="PREVIOUS_PRICE" />-დან <ph name="NEW_PRICE" />-მდე</translation> <translation id="6109251075362363230">ყველა დუბლირებული ჩანართი დაარქივდება, ყველაზე ხშირად გამოყენებული დუბლიკატის გარდა.</translation> <translation id="6193448654517602979">აირჩიეთ ჩანართები</translation> +<translation id="6220820548421939212">დიახ. თანახმა ვარ</translation> <translation id="6228793724645064692">(მაღაზიის შეფასება)</translation> <translation id="6271513594716432922">ყველა უმოქმედო ჩანართის დახურვა</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{ჩანართის დამატება ახალ ჯგუფში}other{ჩანართის დამატება ახალ ჯგუფში}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">აქტივობა</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ შეფასება: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> მიმოხილვა}other{შეფასება: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> მიმოხილვა}}</translation> <translation id="7885132941432959125">ჩანართის მარჯვნივ გადატანა</translation> +<translation id="788914896430720926">გსურთ თქვენი უმოქმედოების სექციის დალაგება?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> არ არის არჩეული</translation> <translation id="7942349550061667556">წითელი</translation> <translation id="7961015016161918242">არასოდეს</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">ამ ინკოგნიტო ჩანართებში თქვენი აქტივობა წაიშლება ამ მოწყობილობიდან</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{შეიქმნა <ph name="NUM_MONTHS_ONE" /> თვის წინ}other{შეიქმნა <ph name="NUM_MONTHS_MANY" /> თვის წინ}}</translation> <translation id="8820741577754260431">იხილეთ ინფორმაცია ფასების დაწევის შესახებ თქვენს ჩანართებზე</translation> +<translation id="883379923675618699">Chrome ავტომატურად დახურავს იმ ერთეულებს უმოქმედოების სექციაში, რომლებიც 3 თვეა, არ გამოგიყენებიათ. ამის შეცვლა ნებისმიერ დროს შეგიძლიათ პარამეტრებიდან.</translation> <translation id="8887921976452567404">თქვენი დახურული ჩანართებისა და ჯგუფების ხელახლა გახსნა შესაძლებელია ბოლო ჩანართების სექციიდან და ჩანართების ჯგუფების სექციიდან.</translation> <translation id="8915916167043355778">ყველას დახურვა</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{ახალ ფანჯარაში გადატანა}other{სხვა ფანჯარაში გადატანა}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb index 55b42e77..f194d172 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Бұл тауардың бағасы жақында түсті. Ескі бағасы: <ph name="PREVIOUS_PRICE" />, жаңа бағасы: <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Ең соңғы қолданылған көшірмені есепке алмағанда, барлық қайталанатын қойынды да мұрағатталады.</translation> <translation id="6193448654517602979">Қойындыларды таңдау</translation> +<translation id="6220820548421939212">Иә. Жарайды</translation> <translation id="6228793724645064692">(дүкен рейтингісі)</translation> <translation id="6271513594716432922">Барлық әрекетсіз қойындыны жабу</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Жаңа топқа қойынды қосу}other{Жаңа топқа қойындылар қосу}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Әрекет</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Бағасы: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> пікір}other{Бағасы: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> пікір}}</translation> <translation id="7885132941432959125">Қойындыны оңға жылжыту</translation> +<translation id="788914896430720926">Әрекетсіз бөлімді тазалап отыру қажет пе?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> таңдалмады</translation> <translation id="7942349550061667556">Қызыл</translation> <translation id="7961015016161918242">Ешқашан</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Бұл инкогнито қойындыларындағы әрекетіңіз осы құрылғыдан өшіріледі.</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> ай бұрын жасалды.}other{<ph name="NUM_MONTHS_MANY" /> ай бұрын жасалды.}}</translation> <translation id="8820741577754260431">Баға төмендеген кезде, оны қойындыдан көріңіз.</translation> +<translation id="883379923675618699">Chrome әрекетсіз бөлімдегі сіз 3 ай қолданбаған элементтерді автоматты түрде жабады. Бұл функцияны параметрлерде кез келген уақытта өшіре аласыз.</translation> <translation id="8887921976452567404">Жабылған қойындылар мен топтарды "Соңғы қойындылар" және "Қойындылар топтары" бөлімдерінен қайта ашуға болады.</translation> <translation id="8915916167043355778">Барлығын жабу</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Жаңа терезеге жылжыту}other{Басқа терезеге жылжыту}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb index ef6f0f8..2045175c 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">តម្លៃទំនិញនេះបានធ្លាក់ចុះថ្មីៗនេះពី <ph name="PREVIOUS_PRICE" /> ទៅ <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">ឥឡូវនេះ ផ្ទាំងស្ទួនទាំងអស់ក៏នឹងត្រូវបានទុកក្នុងបណ្ណសារផងដែរ លើកលែងតែផ្ទាំងស្ទួនដែលបានប្រើថ្មីៗបំផុតប៉ុណ្ណោះ។</translation> <translation id="6193448654517602979">ជ្រើសរើសផ្ទាំង</translation> +<translation id="6220820548421939212">បាទ/ចាស។ ខ្ញុំយល់ព្រម</translation> <translation id="6228793724645064692">(ការវាយតម្លៃហាង)</translation> <translation id="6271513594716432922">បិទផ្ទាំងអសកម្មទាំងអស់</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{បញ្ចូលផ្ទាំងទៅក្រុមថ្មី}other{បញ្ចូលផ្ទាំងទៅក្រុមថ្មី}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">សកម្មភាព</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ ការវាយតម្លៃដោយដាក់ផ្កាយ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, មតិវាយតម្លៃ <ph name="REVIEWS_COUNT_ONE" />}other{ការវាយតម្លៃដោយដាក់ផ្កាយ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, មតិវាយតម្លៃ <ph name="REVIEWS_COUNT_MANY" />}}</translation> <translation id="7885132941432959125">ផ្លាស់ទីផ្ទាំងទៅខាងស្ដាំ</translation> +<translation id="788914896430720926">រក្សាផ្នែកអសកម្មរបស់អ្នកឱ្យមានរបៀបរៀបរយឬ?</translation> <translation id="7939917283308035850">មិនបានជ្រើសរើសពណ៌<ph name="COLOR_NAME" />ទេ</translation> <translation id="7942349550061667556">ក្រហម</translation> <translation id="7961015016161918242">មិនដែល</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">សកម្មភាពរបស់អ្នកនៅក្នុងផ្ទាំងឯកជនទាំងនេះនឹងត្រូវបានដកចេញពីឧបករណ៍នេះ</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{បានបង្កើត <ph name="NUM_MONTHS_ONE" /> ខែមុន}other{បានបង្កើត <ph name="NUM_MONTHS_MANY" /> ខែមុន}}</translation> <translation id="8820741577754260431">មើលការធ្លាក់ថ្លៃនៅក្នុងផ្ទាំងរបស់អ្នក</translation> +<translation id="883379923675618699">Chrome បិទធាតុនៅក្នុងផ្នែកអសកម្មដែលអ្នកមិនបានប្រើរយៈពេល 3 ខែដោយស្វ័ួយប្រវត្តិ។ អ្នកអាចបិទវាឥឡូវនេះ ឬនៅពេលណាក៏បាននៅក្នុង "ការកំណត់"។</translation> <translation id="8887921976452567404">ផ្ទាំង និងក្រុមដែលអ្នកបានបិទអាចត្រូវបានបើកឡើងវិញពីផ្នែកផ្ទាំងថ្មីៗ និងផ្នែកក្រុមផ្ទាំង។</translation> <translation id="8915916167043355778">បិទទាំងអស់</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{ផ្លាស់ទីទៅវិនដូថ្មី}other{ផ្លាស់ទីទៅវិនដូផ្សេងទៀត}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb index a611512..912a7cf 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">ಈ ಐಟಂನ ಬೆಲೆಯು ಇತ್ತೀಚೆಗೆ <ph name="PREVIOUS_PRICE" /> ದಿಂದ <ph name="NEW_PRICE" /> ಗೆ ಕುಸಿದಿದೆ</translation> <translation id="6109251075362363230">ತೀರಾ ಇತ್ತೀಚೆಗೆ ಬಳಸಿದ ನಕಲನ್ನು ಹೊರತುಪಡಿಸಿ, ಎಲ್ಲಾ ನಕಲಿ ಟ್ಯಾಬ್ಗಳನ್ನು ಈಗ ಆರ್ಕೈವ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation> <translation id="6193448654517602979">ಟ್ಯಾಬ್ ಆಯ್ಕೆ</translation> +<translation id="6220820548421939212">ಹೌದು. ನಾನು ಸಮ್ಮತಿಸುತ್ತೇನೆ</translation> <translation id="6228793724645064692">(ಸ್ಟೋರ್ ರೇಟಿಂಗ್)</translation> <translation id="6271513594716432922">ಎಲ್ಲಾ ನಿಷ್ಕ್ರಿಯ ಟ್ಯಾಬ್ಗಳನ್ನು ಮುಚ್ಚಿರಿ</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{ಹೊಸ ಗುಂಪಿಗೆ ಟ್ಯಾಬ್ ಸೇರಿಸಿ}one{ಹೊಸ ಗುಂಪಿಗೆ ಟ್ಯಾಬ್ಗಳನ್ನು ಸೇರಿಸಿ}other{ಹೊಸ ಗುಂಪಿಗೆ ಟ್ಯಾಬ್ಗಳನ್ನು ಸೇರಿಸಿ}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">ಚಟುವಟಿಕೆ</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> ರೇಟಿಂಗ್, <ph name="REVIEWS_COUNT_ONE" /> ವಿಮರ್ಶೆ}one{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> ರೇಟಿಂಗ್, <ph name="REVIEWS_COUNT_MANY" /> ವಿಮರ್ಶೆಗಳು}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> ರೇಟಿಂಗ್, <ph name="REVIEWS_COUNT_MANY" /> ವಿಮರ್ಶೆಗಳು}}</translation> <translation id="7885132941432959125">ಟ್ಯಾಬ್ ಅನ್ನು ಬಲಕ್ಕೆ ಸರಿಸಿ</translation> +<translation id="788914896430720926">ನಿಮ್ಮ ನಿಷ್ಕ್ರಿಯ ವಿಭಾಗವನ್ನು ಅಚ್ಚುಕಟ್ಟಾಗಿ ಇಡುವುದೇ?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> ಅನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ</translation> <translation id="7942349550061667556">ಕೆಂಪು</translation> <translation id="7961015016161918242">ಎಂದಿಗೂ ಇಲ್ಲ</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">ಈ ಅಜ್ಞಾತ ಟ್ಯಾಬ್ಗಳಲ್ಲಿನ ನಿಮ್ಮ ಚಟುವಟಿಕೆಗಳನ್ನು ಈ ಸಾಧನದಿಂದ ತೆರವುಗೊಳಿಸಲಾಗುತ್ತದೆ</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> ತಿಂಗಳ ಹಿಂದೆ ರಚಿಸಲಾಗಿದೆ}one{<ph name="NUM_MONTHS_MANY" /> ತಿಂಗಳುಗಳ ಹಿಂದೆ}other{<ph name="NUM_MONTHS_MANY" /> ತಿಂಗಳುಗಳ ಹಿಂದೆ}}</translation> <translation id="8820741577754260431">ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳಲ್ಲಿ ಬೆಲೆ ಕುಸಿತಗಳನ್ನು ನೋಡಿ</translation> +<translation id="883379923675618699">ನೀವು 3 ತಿಂಗಳಿನಿಂದ ಬಳಸದ ನಿಷ್ಕ್ರಿಯ ವಿಭಾಗದಲ್ಲಿರುವ ಐಟಂಗಳನ್ನು Chrome ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮುಚ್ಚುತ್ತದೆ. ನೀವು ಇದನ್ನು ಈಗ ಅಥವಾ ಯಾವಾಗ ಬೇಕಾದರೂ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಆಫ್ ಮಾಡಬಹುದು.</translation> <translation id="8887921976452567404">ನಿಮ್ಮ ಮುಚ್ಚಿದ ಟ್ಯಾಬ್ಗಳು ಮತ್ತು ಗುಂಪುಗಳನ್ನು ಇತ್ತೀಚಿನ ಟ್ಯಾಬ್ಗಳ ವಿಭಾಗ ಮತ್ತು ಟ್ಯಾಬ್ ಗುಂಪುಗಳ ವಿಭಾಗದಿಂದ ಪುನಃ ತೆರೆಯಬಹುದು.</translation> <translation id="8915916167043355778">ಎಲ್ಲವನ್ನೂ ಮುಚ್ಚಿರಿ</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{ಹೊಸ ವಿಂಡೋಗೆ ಸರಿಸಿ}one{ಇತರ ವಿಂಡೋಗೆ ಸರಿಸಿ}other{ಇತರ ವಿಂಡೋಗೆ ಸರಿಸಿ}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb index 29e8288..345df8e 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">상품 가격이 최근 인하됨, 기존 가격: <ph name="PREVIOUS_PRICE" />, 인하된 가격: <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">이제 가장 최근에 사용한 사본을 제외한 모든 중복 탭도 보관처리됩니다.</translation> <translation id="6193448654517602979">탭 선택</translation> +<translation id="6220820548421939212">예. 동의합니다.</translation> <translation id="6228793724645064692">(매장 평점)</translation> <translation id="6271513594716432922">비활성 탭 모두 닫기</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{새 그룹에 탭 추가}other{새 그룹에 탭 추가}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">활동</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ 평점 <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />점, 리뷰 <ph name="REVIEWS_COUNT_ONE" />개}other{평점 <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />점, 리뷰 <ph name="REVIEWS_COUNT_MANY" />개}}</translation> <translation id="7885132941432959125">탭을 오른쪽으로 이동</translation> +<translation id="788914896430720926">비활성 섹션을 깔끔하게 유지하시겠습니까?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> 선택되지 않음</translation> <translation id="7942349550061667556">빨간색</translation> <translation id="7961015016161918242">사용하지 않음</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">시크릿 탭의 활동 내역이 이 기기에서 삭제됩니다.</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" />개월 전 생성됨}other{<ph name="NUM_MONTHS_MANY" />개월 전 생성됨}}</translation> <translation id="8820741577754260431">탭에서 가격 인하를 확인합니다.</translation> +<translation id="883379923675618699">Chrome에서 3개월 동안 사용하지 않은 비활성 섹션의 항목을 자동으로 닫습니다. 지금 또는 언제든지 설정에서 이 기능을 사용 중지할 수 있습니다.</translation> <translation id="8887921976452567404">닫은 탭 및 그룹은 최근 탭 섹션과 탭 그룹 섹션에서 다시 열 수 있습니다.</translation> <translation id="8915916167043355778">모두 닫기</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{새 창으로 이동}other{다른 창으로 이동}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb index 4d59101..4729e36 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303"><ph name="PREVIOUS_PRICE" /> турган бул нерсенин баасы <ph name="NEW_PRICE" /> болуп калды</translation> <translation id="6109251075362363230">Эми эң акыркы колдонулгандан башка бардык кайталанма өтмөктөр архивделет.</translation> <translation id="6193448654517602979">Өтмөктөрдү тандоо</translation> +<translation id="6220820548421939212">Ооба</translation> <translation id="6228793724645064692">(дүкөндүн рейтинги)</translation> <translation id="6271513594716432922">Жигерсиз өтмөктөрдүн баарын жабуу</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Өтмөктү жаңы топко кошуу}other{Өтмөктү жаңы топко кошуу}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Аракеттер</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Рейтинг: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> сын-пикир}other{Рейтинг: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> сын-пикир}}</translation> <translation id="7885132941432959125">Өтмөктү оңго жылдыруу</translation> +<translation id="788914896430720926">Колдонулбаган өтмөктөрдөн арылгыңыз келеби?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> тандалган жок</translation> <translation id="7942349550061667556">Кызыл</translation> <translation id="7961015016161918242">Эч качан</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Ушул Жашыруун өтмөктөрдө издеген нерселериңиз бул түзмөктөн өчүрүлөт</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> ай мурун түзүлдү}other{<ph name="NUM_MONTHS_MANY" /> ай мурун түзүлдү}}</translation> <translation id="8820741577754260431">Төмөндөгөн бааларды өтмөктөрдө көрөсүз</translation> +<translation id="883379923675618699">3 айдын ичинде колдонбогон Chrome'догу өтмөктөрүңүз автоматтык түрдө жабылат. Бул функцияны азыр же каалаган убакта параметрлерден өчүрүп койсоңуз болот.</translation> <translation id="8887921976452567404">Жабылган өтмөктөр менен топторду Акыркы өтмөктөр жана Өтмөк топтору бөлүмүнөн кайра ачууга болот.</translation> <translation id="8915916167043355778">Баарын жабуу</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Жаңы терезеге жылдыруу}other{Башка терезеге жылдыруу}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb index 78e72c6..e3c6fba9 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">ລາຄາຂອງສິນຄ້ານນີ້ຫຼຸດລົງຈາກ <ph name="PREVIOUS_PRICE" /> ເປັນ <ph name="NEW_PRICE" /> ເມື່ອບໍ່ດົນມານີ້</translation> <translation id="6109251075362363230">ຕອນນີ້ລະບົບຍັງຈະເກັບແຖບທີ່ຊ້ຳກັນທັງໝົດໄວ້ໃນແຟ້ມນຳ, ຍົກເວັ້ນສຳເນົາທີ່ໃຊ້ຫຼ້າສຸດ.</translation> <translation id="6193448654517602979">ເລືອກແຖບ</translation> +<translation id="6220820548421939212">ໄດ້. ຕົກລົງ</translation> <translation id="6228793724645064692">(ຄະແນນຮ້ານຄ້າ)</translation> <translation id="6271513594716432922">ປິດແຖບທີ່ບໍ່ໄດ້ນຳໃຊ້ທັງໝົດ</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{ເພີ່ມແຖບໃສ່ກຸ່ມໃໝ່}other{ເພີ່ມແຖບໃສ່ກຸ່ມໃໝ່}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">ການເຄື່ອນໄຫວ</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ ການຈັດອັນດັບ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> ຄຳຕິຊົມ}other{ການຈັດອັນດັບ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> ຄຳຕິຊົມ}}</translation> <translation id="7885132941432959125">ຍ້າຍແຖບໄປເບື້ອງຂວາ</translation> +<translation id="788914896430720926">ເກັບຮັກສາພາກສ່ວນທີ່ບໍ່ໄດ້ນຳໃຊ້ໃຫ້ເປັນລະບຽບບໍ?</translation> <translation id="7939917283308035850">ບໍ່ໄດ້ເລືອກ <ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">ສີແດງ</translation> <translation id="7961015016161918242">ບໍ່ເລີຍ</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">ການເຄື່ອນໄຫວຂອງທ່ານໃນແຖບບໍ່ເປີດເຜີຍຕົວຕົນເຫຼົ່ານີ້ຈະຖືກລຶບອອກຈາກອຸປະກອນນີ້</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{ສ້າງເມື່ອ <ph name="NUM_MONTHS_ONE" /> ເດືອນກ່ອນ}other{ສ້າງເມື່ອ <ph name="NUM_MONTHS_MANY" /> ເດືອນກ່ອນ}}</translation> <translation id="8820741577754260431">ເບິ່ງການຫຼຸດລາຄາສຳລັບແຖບຂອງທ່ານ</translation> +<translation id="883379923675618699">Chrome ຈະປິດລາຍການໃນພາກສ່ວນທີ່ທ່ານບໍ່ໄດ້ນຳໃຊ້ເປັນເວລາ 3 ເດືອນໂດຍອັດຕະໂນມັດ. ທ່ານສາມາດປິດຄຸນສົມບັດນີ້ຕອນນີ້ເລີຍ ຫຼື ຕອນໃດກໍໄດ້ໃນການຕັ້ງຄ່າ.</translation> <translation id="8887921976452567404">ແຖບ ແລະ ກຸ່ມທີ່ປິດແລ້ວຂອງທ່ານແມ່ນສາມາດເປີດຄືນໃໝ່ໄດ້ຈາກພາກສ່ວນແຖບຫຼ້າສຸດ ແລະ ພາກສ່ວນກຸ່ມແຖບ.</translation> <translation id="8915916167043355778">ປິດທັງໝົດ</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{ຍ້າຍໄປໜ້າຈໍໃໝ່}other{ຍ້າຍໄປຫາໜ້າຈໍອື່ນ}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb index c6ac1541..845b3d6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Энэ зүйлийн үнэ саяхан <ph name="PREVIOUS_PRICE" />-с <ph name="NEW_PRICE" /> болж буурсан</translation> <translation id="6109251075362363230">Хамгийн сүүлд ашигласан хуулбарыг эс тооцвол бүх давхардсан табыг одоо мөн архивлана.</translation> <translation id="6193448654517602979">Таб сонгох</translation> +<translation id="6220820548421939212">Тийм. Би зөвшөөрч байна</translation> <translation id="6228793724645064692">(дэлгүүрийн үнэлгээ)</translation> <translation id="6271513594716432922">Бүх идэвхгүй табыг хаах</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Табыг шинэ бүлэгт нэмэх}other{Табуудыг шинэ бүлэгт нэмэх}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Үйл ажиллагаа</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> үнэлгээ, <ph name="REVIEWS_COUNT_ONE" /> шүүмж}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> үнэлгээ, <ph name="REVIEWS_COUNT_MANY" /> шүүмж}}</translation> <translation id="7885132941432959125">Табыг баруун тийш зөөх</translation> +<translation id="788914896430720926">Идэвхгүй хэсгээ цэгцтэй байлгах уу?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" />-г сонгоогүй</translation> <translation id="7942349550061667556">Улаан</translation> <translation id="7961015016161918242">Хэзээ ч</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Эдгээр Нууцлалтай таб дахь таны үйл ажиллагааг энэ төхөөрөмжөөс хасна</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> сарын өмнө үүсгэсэн}other{<ph name="NUM_MONTHS_MANY" /> сарын өмнө үүсгэсэн}}</translation> <translation id="8820741577754260431">Табууд дээрх үнэ бууралтыг хараарай</translation> +<translation id="883379923675618699">Chrome таны 3 сарын хугацаанд ашиглаагүй идэвхгүй харилцан үйлдэл дэх зүйлийг автоматаар хаана. Та хүссэн үедээ үүнийг Тохиргооноос унтраах боломжтой.</translation> <translation id="8887921976452567404">Та хаасан таб, бүлгээ Саяхны табын хэсэг, Табын бүлгийн хэсгээс дахин нээх боломжтой.</translation> <translation id="8915916167043355778">Бүгдийг хаах</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Шинэ цонх руу зөөх}other{Өөр цонх руу зөөх}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb index 49bc010..df7e003 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">या आयटमची किंमत अलीकडे <ph name="PREVIOUS_PRICE" /> वरून <ph name="NEW_PRICE" /> इतकी कमी झाली</translation> <translation id="6109251075362363230">सर्वात अलीकडे वापरलेल्या कॉपीचा अपवाद वगळता, सर्व डुप्लिकेट टॅबदेखील आता संग्रहित केले जातील.</translation> <translation id="6193448654517602979">टॅब निवडा</translation> +<translation id="6220820548421939212">होय. मी तयार आहे</translation> <translation id="6228793724645064692">(स्टोअरचे रेटिंग)</translation> <translation id="6271513594716432922">सर्व इनॅक्टिव्ह टॅब बंद करा</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{नवीन गटामध्ये टॅब जोडा}other{नवीन गटामध्ये टॅब जोडा}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">गतिविधी</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> रेटिंग, <ph name="REVIEWS_COUNT_ONE" /> परीक्षण}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> रेटिंग, <ph name="REVIEWS_COUNT_MANY" /> परीक्षणे}}</translation> <translation id="7885132941432959125">टॅब उजवीकडे हलवा</translation> +<translation id="788914896430720926">तुमचे इनॅक्टिव्ह विभाग व्यवस्थित ठेवायचे आहेत का?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> निवडलेला नाही</translation> <translation id="7942349550061667556">लाल</translation> <translation id="7961015016161918242">कधीही नाही</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">या गुप्त टॅबमधील तुमची अॅक्टिव्हिटी या डिव्हाइसवरून काढून टाकली जाईल</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> महिन्यापूर्वी तयार केला आहे}other{<ph name="NUM_MONTHS_MANY" /> महिन्यांपूर्वी तयार केला आहे}}</translation> <translation id="8820741577754260431">तुमच्या टॅबवर कमी झालेली किंमत पहा</translation> +<translation id="883379923675618699">Chrome हे तुम्ही ३ महिन्यांपासून न वापरलेल्या इनॅक्टिव्ह विभागामधील आयटम आपोआप बंद करते. तुम्ही हे सेटिंग्ज मध्ये आताच किंवा कधीही बंद करू शकता.</translation> <translation id="8887921976452567404">तुमचे बंद केलेले टॅब आणि गट अलीकडील टॅब विभाग व टॅब गट विभागामधून पुन्हा उघडले जाऊ शकतात.</translation> <translation id="8915916167043355778">सर्व बंद करा</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{नवीन विंडोवर हलवा}other{इतर विंडोवर हलवा}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb index d4a4ae1..8a8b13d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Baru-baru ini harga item ini jatuh daripada <ph name="PREVIOUS_PRICE" /> kepada <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Kini semua tab pendua akan turut diarkibkan kecuali salinan yang digunakan baru-baru ini.</translation> <translation id="6193448654517602979">Pilih tab</translation> +<translation id="6220820548421939212">Ya. Saya mahu</translation> <translation id="6228793724645064692">(rating kedai)</translation> <translation id="6271513594716432922">Tutup semua tab tidak aktif</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Tambahkan tab pada kumpulan baharu}other{Tambahkan tab pada kumpulan baharu}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Aktiviti</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Rating <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> ulasan}other{Rating <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> ulasan}}</translation> <translation id="7885132941432959125">Alihkan tab ke kanan</translation> +<translation id="788914896430720926">Kemaskan bahagian tidak aktif anda?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> Tidak dipilih</translation> <translation id="7942349550061667556">Merah</translation> <translation id="7961015016161918242">Tidak sama sekali</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Aktiviti anda dalam tab Inkognito ini akan dialih keluar daripada peranti ini</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Dibuat <ph name="NUM_MONTHS_ONE" /> bulan yang lalu}other{Dibuat <ph name="NUM_MONTHS_MANY" /> bulan yang lalu}}</translation> <translation id="8820741577754260431">Lihat penurunan harga pada tab anda</translation> +<translation id="883379923675618699">Chrome menutup item dalam bahagian tidak aktif yang tidak digunakan selama 3 bulan secara automatik. Anda boleh mematikan pilihan ini sekarang atau pada bila-bila masa dalam Tetapan.</translation> <translation id="8887921976452567404">Tab dan kumpulan anda yang ditutup boleh dibuka semula daripada bahagian Tab terbaharu dan bahagian Kumpulan tab.</translation> <translation id="8915916167043355778">Tutup semua</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Alihkan kepada tetingkap baharu}other{Alihkan kepada tetingkap lain}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb index 4d15f2c..08f6529 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">De prijs van dit item is recent verlaagd van <ph name="PREVIOUS_PRICE" /> naar <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Alle dubbele tabbladen worden nu ook gearchiveerd, met uitzondering van het meest recent gebruikte exemplaar.</translation> <translation id="6193448654517602979">Tabbladen selecteren</translation> +<translation id="6220820548421939212">Ja. Nu aanzetten</translation> <translation id="6228793724645064692">(winkelbeoordeling)</translation> <translation id="6271513594716432922">Alle inactieve tabbladen sluiten</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Tabblad toevoegen aan nieuwe groep}other{Tabbladen toevoegen aan nieuwe groep}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Activiteit</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> beoordeling, <ph name="REVIEWS_COUNT_ONE" /> review}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> beoordeling, <ph name="REVIEWS_COUNT_MANY" /> reviews}}</translation> <translation id="7885132941432959125">Tabblad naar rechts verplaatsen</translation> +<translation id="788914896430720926">Wil je je inactieve gedeelte netjes houden?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> is niet geselecteerd</translation> <translation id="7942349550061667556">Rood</translation> <translation id="7961015016161918242">Nooit</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Je activiteit in deze incognitotabbladen wordt verwijderd van dit apparaat</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> maand geleden gemaakt}other{<ph name="NUM_MONTHS_MANY" /> maanden geleden gemaakt}}</translation> <translation id="8820741577754260431">Prijsdalingen bekijken op je tabbladen</translation> +<translation id="883379923675618699">Chrome sluit automatisch items in het gedeelte Inactief die je al 3 maanden niet hebt gebruikt. Je kunt dit nu of later uitzetten via Instellingen.</translation> <translation id="8887921976452567404">Je kunt je gesloten tabbladen en groepen opnieuw openen via het gedeelte Recente tabbladen en het gedeelte Tabbladgroepen.</translation> <translation id="8915916167043355778">Alles sluiten</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Verplaatsen naar nieuw venster}other{Verplaatsen naar ander venster}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb index 62b5e52..29a6595 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Prisen på denne varen falt nylig fra <ph name="PREVIOUS_PRICE" /> til <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Alle duplikatfaner blir nå også arkivert, med unntak av den sist brukte kopien.</translation> <translation id="6193448654517602979">Velg faner</translation> +<translation id="6220820548421939212">Ja. Jeg er med</translation> <translation id="6228793724645064692">(butikkvurdering)</translation> <translation id="6271513594716432922">Lukk alle inaktive faner</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Legg fanen til i en ny gruppe}other{Legg fanene til i en ny gruppe}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Aktivitet</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Vurdering: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> anmeldelse}other{Vurdering: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> anmeldelser}}</translation> <translation id="7885132941432959125">Flytt fanen mot høyre</translation> +<translation id="788914896430720926">Vil du holde den inaktive delen ryddig?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> er ikke valgt</translation> <translation id="7942349550061667556">Rød</translation> <translation id="7961015016161918242">Aldri</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Aktiviteten din på disse inkognitofanene blir fjernet fra denne enheten</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Opprettet for <ph name="NUM_MONTHS_ONE" /> måned siden}other{Opprettet for <ph name="NUM_MONTHS_MANY" /> måneder siden}}</translation> <translation id="8820741577754260431">Se avslag på fanene dine</translation> +<translation id="883379923675618699">Chrome lukker automatisk elementer i den inaktive delen som du ikke har brukt på tre måneder. Du kan slå dette av nå eller når som helst i innstillingene.</translation> <translation id="8887921976452567404">Du kan gjenåpne de lukkede fanene og gruppene dine via Nylige faner-delen og Fanegrupper-delen.</translation> <translation id="8915916167043355778">Lukk alle</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Flytt til nytt vindu}other{Flytt til et annet vindu}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb index 1379b5a..e7b2461 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Ostatnio cena tego elementu spadła z <ph name="PREVIOUS_PRICE" /> do <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Wszystkie zduplikowane karty będą teraz również archiwizowane, z wyjątkiem ostatnio używanej kopii.</translation> <translation id="6193448654517602979">Wybierz karty</translation> +<translation id="6220820548421939212">Tak. Chętnie</translation> <translation id="6228793724645064692">(ocena sklepu)</translation> <translation id="6271513594716432922">Zamknij wszystkie nieaktywne karty</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Dodaj kartę do nowej grupy}few{Dodaj karty do nowej grupy}many{Dodaj karty do nowej grupy}other{Dodaj karty do nowej grupy}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Aktywność</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Ocena <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> opinia}few{Ocena <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> opinie}many{Ocena <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> opinii}other{Ocena <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> opinii}}</translation> <translation id="7885132941432959125">Przenieś kartę w prawo</translation> +<translation id="788914896430720926">Uporządkować nieaktywną sekcję?</translation> <translation id="7939917283308035850">Nie wybrano: <ph name="COLOR_NAME" />.</translation> <translation id="7942349550061667556">Czerwony</translation> <translation id="7961015016161918242">Nigdy</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Twoja aktywność na tych kartach incognito zostanie usunięta z tego urządzenia</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Utworzono <ph name="NUM_MONTHS_ONE" /> miesiąc temu}few{Utworzono <ph name="NUM_MONTHS_MANY" /> miesiące temu}many{Utworzono <ph name="NUM_MONTHS_MANY" /> miesięcy temu}other{Utworzono <ph name="NUM_MONTHS_MANY" /> miesiąca temu}}</translation> <translation id="8820741577754260431">Pokazuj obniżki cen na kartach</translation> +<translation id="883379923675618699">Chrome automatycznie zamyka elementy w sekcji nieaktywnych, których nie używasz od 3 miesięcy. Możesz wyłączyć tę funkcję teraz lub w dowolnym momencie w Ustawieniach.</translation> <translation id="8887921976452567404">Zamknięte karty i grupy możesz ponownie otworzyć w sekcjach Ostatnie karty i Grupy kart.</translation> <translation id="8915916167043355778">Zamknij wszystko</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Przenieś do nowego okna}few{Przenieś do innego okna}many{Przenieś do innego okna}other{Przenieś do innego okna}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb index b4511bf..9161eaf 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Prețul articolului a scăzut recent de la <ph name="PREVIOUS_PRICE" /> la <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Toate filele dublură vor fi acum arhivate, cu excepția copiei folosite cel mai recent.</translation> <translation id="6193448654517602979">Selectează file</translation> +<translation id="6220820548421939212">Da. Accept</translation> <translation id="6228793724645064692">(evaluare a magazinului)</translation> <translation id="6271513594716432922">Închide toate filele inactive</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Adaugă fila într-un grup nou}few{Adaugă filele într-un grup nou}other{Adaugă filele într-un grup nou}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Activitate</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Evaluare: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> recenzie}few{Evaluare: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzii}other{Evaluare: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> de recenzii}}</translation> <translation id="7885132941432959125">Mută fila spre dreapta</translation> +<translation id="788914896430720926">Dorești să păstrezi secțiunea inactivă ordonată?</translation> <translation id="7939917283308035850">Nu s-a selectat <ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">Roșu</translation> <translation id="7961015016161918242">Niciodată</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Activitatea ta în filele incognito va fi eliminată de pe acest dispozitiv</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Creat acum <ph name="NUM_MONTHS_ONE" /> lună}few{Creat acum <ph name="NUM_MONTHS_MANY" /> luni}other{Creat acum <ph name="NUM_MONTHS_MANY" /> de luni}}</translation> <translation id="8820741577754260431">Vezi scăderile de prețuri din file</translation> +<translation id="883379923675618699">Chrome închide automat elementele din secțiunea inactivă pe care nu le-ai folosit timp de trei luni. Poți dezactiva această opțiune acum sau oricând din Setări.</translation> <translation id="8887921976452567404">Filele și grupurile închise pot fi redeschise din secțiunile File recente și Grupuri de file.</translation> <translation id="8915916167043355778">Închide-le pe toate</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Mută într-o fereastră nouă}few{Mută în altă fereastră}other{Mută în altă fereastră}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb index d8c986d..305fa88 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Цена на этот товар недавно снизилась с <ph name="PREVIOUS_PRICE" /> до <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Все одинаковые вкладки также будут добавляться в архив, за исключением недавно открытой</translation> <translation id="6193448654517602979">Выбрать вкладки</translation> +<translation id="6220820548421939212">Да</translation> <translation id="6228793724645064692">(оценка магазина)</translation> <translation id="6271513594716432922">Закрыть все неактивные вкладки</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Добавить вкладку в новую группу}one{Добавить вкладки в новую группу}few{Добавить вкладки в новую группу}many{Добавить вкладки в новую группу}other{Добавить вкладки в новую группу}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Действия</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Оценка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> отзыв}one{Оценка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> отзыв}few{Оценка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> отзыва}many{Оценка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> отзывов}other{Оценка: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> отзыва}}</translation> <translation id="7885132941432959125">Переместить вкладку вправо</translation> +<translation id="788914896430720926">Закрывать неиспользуемые вкладки автоматически?</translation> <translation id="7939917283308035850">Цвет "<ph name="COLOR_NAME" />" не выбран</translation> <translation id="7942349550061667556">Красный</translation> <translation id="7961015016161918242">Нет</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Информация о действиях на этих вкладках инкогнито будет удалена с устройства.</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Создано <ph name="NUM_MONTHS_ONE" /> месяц назад}one{Создано <ph name="NUM_MONTHS_MANY" /> месяц назад}few{Создано <ph name="NUM_MONTHS_MANY" /> месяца назад}many{Создано <ph name="NUM_MONTHS_MANY" /> месяцев назад}other{Создано <ph name="NUM_MONTHS_MANY" /> месяца назад}}</translation> <translation id="8820741577754260431">Показывать скидки на вкладках</translation> +<translation id="883379923675618699">Вкладки в Chrome, на которые вы не переходили 3 месяца, будут автоматически закрываться. Эту функцию всегда можно отключить в настройках.</translation> <translation id="8887921976452567404">Вернуть закрытые вкладки и группы можно в разделах "Недавние вкладки" и "Группы вкладок".</translation> <translation id="8915916167043355778">Закрыть все</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Перенести в другое окно}one{Перенести в другое окно}few{Перенести в другое окно}many{Перенести в другое окно}other{Перенести в другое окно}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb index da267571..d61bb4a9 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Priset på den här varan minskade nyligen från <ph name="PREVIOUS_PRICE" /> till <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Alla flikdubbletter arkiveras nu också, med undantag för den senast använda kopian.</translation> <translation id="6193448654517602979">Välj flikar</translation> +<translation id="6220820548421939212">Ja. Ja gärna</translation> <translation id="6228793724645064692">(butikens betyg)</translation> <translation id="6271513594716432922">Stänga alla inaktiva flikar</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Lägg till fliken i en ny grupp}other{Lägg till flikarna i en ny grupp}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Aktivitet</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> i betyg med <ph name="REVIEWS_COUNT_ONE" /> recension}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> i betyg med <ph name="REVIEWS_COUNT_MANY" /> recensioner}}</translation> <translation id="7885132941432959125">Flytta fliken åt höger</translation> +<translation id="788914896430720926">Vill du ha ordning och reda i avsnittet Inaktiva?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> har inte valts</translation> <translation id="7942349550061667556">Röd</translation> <translation id="7961015016161918242">Aldrig</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Aktivitet på de här inkognitoflikarna tas bort från enheten</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Skapades för <ph name="NUM_MONTHS_ONE" /> månad sedan}other{Skapades för <ph name="NUM_MONTHS_MANY" /> månader sedan}}</translation> <translation id="8820741577754260431">Se sänkta priser på flikar</translation> +<translation id="883379923675618699">Chrome stänger automatiskt objekt i avsnittet Inaktiva som du inte har använt på tre månader. Du kan inaktivera detta nu eller när som helst i inställningarna.</translation> <translation id="8887921976452567404">Du kan öppna dina stängda flikar och grupper på nytt från avsnittet Senaste flikar och avsnittet Flikgrupper.</translation> <translation id="8915916167043355778">Stäng alla</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Flytta till ett nytt fönster}other{Flytta till ett annat fönster}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb index c856917..c6243f18 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">இந்தப் பொருளின் விலை சமீபத்தில் <ph name="PREVIOUS_PRICE" /> இல் இருந்து <ph name="NEW_PRICE" /> ஆகக் குறைந்துள்ளது</translation> <translation id="6109251075362363230">மிகச் சமீபத்தில் பயன்படுத்தப்பட்ட நகல் தவிர்த்து, பிற எல்லா நகல் பக்கங்களும் இப்போது காப்பிடப்படும்.</translation> <translation id="6193448654517602979">தாவல்களைத் தேர்ந்தெடுக்கவும்</translation> +<translation id="6220820548421939212">ஆம். சரி.</translation> <translation id="6228793724645064692">(ஸ்டோர் ரேட்டிங்)</translation> <translation id="6271513594716432922">செயலில் இல்லாத பக்கங்களை மூடு</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{பக்கத்தைப் புதிய குழுவில் சேர்}other{பக்கங்களைப் புதிய குழுவில் சேர்}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">செயல்பாடு</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ ரேட்டிங்: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> மதிப்புரை}other{ரேட்டிங்: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> மதிப்புரைகள்}}</translation> <translation id="7885132941432959125">தாவலை வலதுபுறம் நகர்த்து</translation> +<translation id="788914896430720926">செயலில் இல்லாத பிரிவை ஒழுங்குபடுத்தலாமா?</translation> <translation id="7939917283308035850"><ph name="COLOR_NAME" /> தேர்ந்தெடுக்கப்படவில்லை</translation> <translation id="7942349550061667556">சிவப்பு</translation> <translation id="7961015016161918242">எப்போதும் இல்லை</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">இந்த மறைநிலைப் பக்கங்களில் நீங்கள் மேற்கொண்ட செயல்பாடுகள் குறித்த விவரங்கள் இந்தச் சாதனத்தில் இருந்து அகற்றப்படும்</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> மாதத்திற்கு முன் உருவாக்கப்பட்டது}other{<ph name="NUM_MONTHS_MANY" /> மாதங்களுக்கு முன் உருவாக்கப்பட்டது}}</translation> <translation id="8820741577754260431">தாவல்களில் விலைச் சரிவு குறித்துக் காட்டப்படும்</translation> +<translation id="883379923675618699">கடந்த 3 மாதங்களில் நீங்கள் பயன்படுத்தாதவற்றை Chrome தானாக மூடும். அமைப்புகளில் இதை இப்போது அல்லது எப்போது வேண்டுமானாலும் முடக்கலாம்.</translation> <translation id="8887921976452567404">மூடிய பக்கங்களையும் குழுக்களையும் ‘சமீபத்திய பக்கங்கள்’, ‘பக்கக் குழுக்கள்’ ஆகிய பிரிவுகளுக்குச் சென்று மீண்டும் திறக்கலாம்.</translation> <translation id="8915916167043355778">அனைத்தையும் மூடு</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{புதிய சாளரத்திற்கு நகர்த்தும்}other{வேறு சாளரத்திற்கு நகர்த்தும்}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb index 0c64b4e..eb0ffe0 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">Ціна на цей товар нещодавно знизилася з <ph name="PREVIOUS_PRICE" /> до <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">Тепер також архівуватимуться всі повторювані вкладки, за винятком тієї, що використовувалась останньою.</translation> <translation id="6193448654517602979">Виберіть вкладки</translation> +<translation id="6220820548421939212">Так, видаляти</translation> <translation id="6228793724645064692">(оцінка магазину)</translation> <translation id="6271513594716432922">Закрити всі неактивні вкладки</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{Додати вкладку в нову групу}one{Додати вкладки в нову групу}few{Додати вкладки в нову групу}many{Додати вкладки в нову групу}other{Додати вкладки в нову групу}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">Дії</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Оцінка – <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> відгук}one{Оцінка – <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> відгук}few{Оцінка – <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> відгуки}many{Оцінка – <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> відгуків}other{Оцінка – <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> відгуку}}</translation> <translation id="7885132941432959125">Перемістити вкладку праворуч</translation> +<translation id="788914896430720926">Видаляти неактивні вкладки?</translation> <translation id="7939917283308035850">Не вибрано: <ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">Червоний</translation> <translation id="7961015016161918242">Ніколи</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">Дані про ваші дії на цих анонімних вкладках буде вилучено з пристрою</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{Створено <ph name="NUM_MONTHS_ONE" /> місяць тому}one{Створено <ph name="NUM_MONTHS_MANY" /> місяць тому}few{Створено <ph name="NUM_MONTHS_MANY" /> місяці тому}many{Створено <ph name="NUM_MONTHS_MANY" /> місяців тому}other{Створено <ph name="NUM_MONTHS_MANY" /> місяця тому}}</translation> <translation id="8820741577754260431">Переглядайте зниження цін на вкладках</translation> +<translation id="883379923675618699">Chrome автоматично закриває об’єкти в розділі "Неактивні вкладки", які ви не використовували протягом 3 місяців. Ви можете будь-коли вимкнути цю функцію в налаштуваннях.</translation> <translation id="8887921976452567404">Закриті вкладки й групи можна знову відкрити в розділах "Останні вкладки" й "Групи вкладок".</translation> <translation id="8915916167043355778">Закрити всі</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{Перемістити в нове вікно}one{Перемістити в інше вікно}few{Перемістити в інше вікно}many{Перемістити в інше вікно}other{Перемістити в інше вікно}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb index 0eee2a6..7474f17 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">这件商品的价格最近从 <ph name="PREVIOUS_PRICE" />降至 <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">现在,所有重复的标签页也将归档,最近使用的副本除外。</translation> <translation id="6193448654517602979">选择标签页</translation> +<translation id="6220820548421939212">是,整理</translation> <translation id="6228793724645064692">(商店评分)</translation> <translation id="6271513594716432922">关闭所有闲置标签页</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{向新分组中添加标签页}other{向新分组中添加标签页}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">活动</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{当前评分是 <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />,共有 <ph name="REVIEWS_COUNT_ONE" /> 条评价}other{当前评分是 <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />,共有 <ph name="REVIEWS_COUNT_MANY" /> 条评价}}</translation> <translation id="7885132941432959125">右移标签页</translation> +<translation id="788914896430720926">要整理“闲置”部分吗?</translation> <translation id="7939917283308035850">未选择<ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">红色</translation> <translation id="7961015016161918242">一律不</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">您在这些无痕式标签页中的活动记录将从此设备上移除</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{创建时间:<ph name="NUM_MONTHS_ONE" /> 个月前}other{创建时间:<ph name="NUM_MONTHS_MANY" /> 个月前}}</translation> <translation id="8820741577754260431">查看您打开的标签页上的降价商品</translation> +<translation id="883379923675618699">Chrome 会自动关闭“闲置”部分中 3 个月内未曾使用的标签页。您可以现在关闭此功能,也可以随时在“设置”中进行关闭。</translation> <translation id="8887921976452567404">您可以从“最近打开的标签页”部分和“标签页分组”部分重新打开已关闭的标签页和分组。</translation> <translation id="8915916167043355778">全部关闭</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{移至新窗口}other{移至其他窗口}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb index 6d5366f..cdb18a9b 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">呢件商品嘅價格最近由 <ph name="PREVIOUS_PRICE" /> 減到 <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">所有重複的分頁現在亦會封存 (最近使用的重複分頁除外)。</translation> <translation id="6193448654517602979">選取分頁</translation> +<translation id="6220820548421939212">是,我同意</translation> <translation id="6228793724645064692">(商店評分)</translation> <translation id="6271513594716432922">關閉所有閒置分頁</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{將分頁加入新群組}other{將分頁加入新群組}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">活動</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" /> 分,滿分係 <ph name="RATING_BASELINE" /> 分,有 <ph name="REVIEWS_COUNT_ONE" /> 則評論}other{<ph name="CURRENT_RATING" /> 分,滿分係 <ph name="RATING_BASELINE" /> 分,有 <ph name="REVIEWS_COUNT_MANY" /> 則評論}}</translation> <translation id="7885132941432959125">移去右邊</translation> +<translation id="788914896430720926">要整理閒置部分嗎?</translation> <translation id="7939917283308035850">冇揀到<ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">紅色</translation> <translation id="7961015016161918242">從來沒有</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">系統將會從此裝置移除你在這些無痕式分頁中的活動</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> 個月前建立}other{<ph name="NUM_MONTHS_MANY" /> 個月前建立}}</translation> <translation id="8820741577754260431">在分頁上查看降價資料</translation> +<translation id="883379923675618699">Chrome 會自動關閉閒置部分中 3 個月未曾使用的項目。你可以現在或隨時在「設定」中關閉此功能。</translation> <translation id="8887921976452567404">你可以在「最近開啟的分頁」和「分頁群組」部分重新開啟已關閉的分頁和群組。</translation> <translation id="8915916167043355778">全部關閉</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{移至新視窗}other{移至其他視窗}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb index 39f91f1..684ca7b 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb
@@ -123,6 +123,7 @@ <translation id="6054741997831917303">這個商品的價格最近從 <ph name="PREVIOUS_PRICE" />降為 <ph name="NEW_PRICE" /></translation> <translation id="6109251075362363230">現在也會封存所有重複的分頁 (最近使用的重複分頁除外)。</translation> <translation id="6193448654517602979">選取分頁</translation> +<translation id="6220820548421939212">是,我同意</translation> <translation id="6228793724645064692">(商店評分)</translation> <translation id="6271513594716432922">關閉所有閒置分頁</translation> <translation id="6313830465749181217">{TABS_COUNT,plural, =1{將分頁加入新群組}other{將分頁加入新群組}}</translation> @@ -171,6 +172,7 @@ <translation id="7853202427316060426">活動</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{<ph name="CURRENT_RATING" /> 分 (滿分 <ph name="RATING_BASELINE" />),有 <ph name="REVIEWS_COUNT_ONE" /> 則評論}other{<ph name="CURRENT_RATING" /> 分 (滿分 <ph name="RATING_BASELINE" />),有 <ph name="REVIEWS_COUNT_MANY" /> 則評論}}</translation> <translation id="7885132941432959125">將分頁向右移</translation> +<translation id="788914896430720926">要整理「閒置分頁」部分嗎?</translation> <translation id="7939917283308035850">未選取<ph name="COLOR_NAME" /></translation> <translation id="7942349550061667556">紅色</translation> <translation id="7961015016161918242">一律不要</translation> @@ -197,6 +199,7 @@ <translation id="8730999928494395583">你在這些無痕分頁中的活動將從這部裝置上移除</translation> <translation id="875848103419578654">{NUM_MONTHS,plural, =1{<ph name="NUM_MONTHS_ONE" /> 個月前建立}other{<ph name="NUM_MONTHS_MANY" /> 個月前建立}}</translation> <translation id="8820741577754260431">在分頁上查看降價資訊</translation> +<translation id="883379923675618699">Chrome 會自動關閉「閒置分頁」部分中 3 個月未曾使用的項目。你隨時可以前往「設定」關閉這項功能。</translation> <translation id="8887921976452567404">你可以在「最近開啟的分頁」和「分頁群組」部分重新開啟已關閉的分頁和群組。</translation> <translation id="8915916167043355778">全部關閉</translation> <translation id="8917994835293470029">{WINDOW_COUNT,plural, =1{移到新視窗}other{移到其他視窗}}</translation>
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupDialogPTTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupDialogPTTest.java index e6d3fdbb7..69dd935 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupDialogPTTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupDialogPTTest.java
@@ -51,10 +51,7 @@ @Batch(Batch.PER_CLASS) // TODO(https://crbug.com/392634251): Fix line height when elegant text height is used with Roboto // or enable Google Sans (Text) in //chrome/ tests on Android T+. -@DisableFeatures({ - ChromeFeatureList.ANDROID_ELEGANT_TEXT_HEIGHT, - ChromeFeatureList.TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID -}) +@DisableFeatures({ChromeFeatureList.ANDROID_ELEGANT_TEXT_HEIGHT}) @EnableFeatures(ChromeFeatureList.DATA_SHARING) public class TabGroupDialogPTTest { @Rule @@ -66,7 +63,7 @@ @Rule public ChromeRenderTestRule mRenderTestRule = ChromeRenderTestRule.Builder.withPublicCorpus() - .setRevision(2) + .setRevision(3) .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_TAB_GROUPS) .build();
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayoutPTTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayoutPTTest.java index 0a71d17c..9325db30 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayoutPTTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayoutPTTest.java
@@ -15,7 +15,6 @@ import static org.chromium.base.GarbageCollectionTestUtils.canBeGarbageCollected; import static org.chromium.base.test.transit.TransitAsserts.assertFinalDestination; import static org.chromium.chrome.browser.flags.ChromeFeatureList.ANDROID_ELEGANT_TEXT_HEIGHT; -import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; @@ -77,7 +76,7 @@ @Batch(Batch.PER_CLASS) // TODO(https://crbug.com/392634251): Fix line height when elegant text height is used with Roboto // or enable Google Sans (Text) in //chrome/ tests on Android T+. -@DisableFeatures({ANDROID_ELEGANT_TEXT_HEIGHT, TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID}) +@DisableFeatures({ANDROID_ELEGANT_TEXT_HEIGHT}) public class TabSwitcherLayoutPTTest { private static final String TEST_URL = "/chrome/test/data/android/google.html"; @@ -88,7 +87,7 @@ @Rule public ChromeRenderTestRule mRenderTestRule = ChromeRenderTestRule.Builder.withPublicCorpus() - .setRevision(6) + .setRevision(7) .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_HUB) .build();
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherListEditorPTTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherListEditorPTTest.java index 2eb7e9e..c6038b9 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherListEditorPTTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherListEditorPTTest.java
@@ -57,11 +57,7 @@ @Batch(Batch.PER_CLASS) // TODO(https://crbug.com/392634251): Fix line height when elegant text height is used with Roboto // or enable Google Sans (Text) in //chrome/ tests on Android T+. -@DisableFeatures({ - ChromeFeatureList.DATA_SHARING, - ChromeFeatureList.ANDROID_ELEGANT_TEXT_HEIGHT, - ChromeFeatureList.TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID -}) +@DisableFeatures({ChromeFeatureList.DATA_SHARING, ChromeFeatureList.ANDROID_ELEGANT_TEXT_HEIGHT}) public class TabSwitcherListEditorPTTest { @Rule public AutoResetCtaTransitTestRule mCtaTestRule = @@ -183,6 +179,8 @@ @Test @MediumTest @RequiresRestart("crbug.com/378502216") + // TODO(crbug.com/417767506) New tab group's card isn't scrolled to + @DisableFeatures(ChromeFeatureList.TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID) public void testCreate10TabsAndCreateTabGroupOf4() { WebPageStation firstPage = mCtaTestRule.startOnBlankPage(); WebPageStation pageStation = @@ -206,6 +204,7 @@ @Test @MediumTest @RequiresRestart("crbug.com/378502216") + @DisableFeatures(ChromeFeatureList.TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID) public void testCreate2TabGroups() { WebPageStation pageStation = mCtaTestRule.startOnBlankPage(); pageStation = @@ -236,6 +235,7 @@ @Test @MediumTest + @DisableFeatures(ChromeFeatureList.TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID) public void testUndoCreateTabGroup() { WebPageStation firstPage = mCtaTestRule.startOnBlankPage(); @@ -257,7 +257,12 @@ NewTabGroupDialogFacility<RegularTabSwitcherStation> dialog = editor.openAppMenuWithEditor().groupTabs(); dialog.pressDone(); - TabBinningUtil.assertBinsEqual(tabModel, group(secondTabId, firstTabId), thirdTabId); + if (ChromeFeatureList.sTabGroupParityBottomSheetAndroid.isEnabled()) { + TabBinningUtil.assertBinsEqual(tabModel, group(firstTabId, secondTabId), thirdTabId); + } else { + // This is the actual behavior, but it's not ideal. + TabBinningUtil.assertBinsEqual(tabModel, group(secondTabId, firstTabId), thirdTabId); + } // Group all tabs; needed to bypass the New Tab Group dialog editor = tabSwitcher.openAppMenu().clickSelectTabs();
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java index e8555dd..fa55ac48 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilitiesUnitTest.java
@@ -7,8 +7,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import android.os.Build; - import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -16,7 +14,6 @@ import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; -import org.robolectric.util.ReflectionHelpers; import org.chromium.base.BaseSwitches; import org.chromium.base.ThreadUtils; @@ -83,16 +80,4 @@ assertFalse(TabUiFeatureUtilities.shouldUseListMode()); } - - @Test - public void testTabDragToCreateInstance_withAllowlistedOEM() { - ReflectionHelpers.setStaticField(Build.class, "MANUFACTURER", "samsung"); - assertTrue(TabUiFeatureUtilities.isTabDragToCreateInstanceSupported()); - } - - @Test - public void testTabDragToCreateInstance_withNonAllowlistedOEM() { - ReflectionHelpers.setStaticField(Build.class, "MANUFACTURER", "other"); - assertTrue(TabUiFeatureUtilities.isTabDragToCreateInstanceSupported()); - } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index fb7d82b3..daab295 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -253,7 +253,6 @@ import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate; import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegateProvider; import org.chromium.chrome.browser.tasks.tab_management.TabModelNotificationDotManager; -import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.chrome.browser.tasks.tab_management.TabUiUtils; import org.chromium.chrome.browser.tasks.tab_management.TabsSettings; import org.chromium.chrome.browser.theme.ThemeModuleUtils; @@ -1636,6 +1635,17 @@ IntentUtils.safeGetStringExtra(intent, Browser.EXTRA_APPLICATION_ID), Tab.INVALID_TAB_ID, intent); + if (tab == null) { + StringBuilder errMsg = new StringBuilder(); + Uri uri = Uri.parse(url); + errMsg.append("Tab creation failed in destination window:\n") + .append(" - Incognito: ") + .append(tabGroupMetadata.isIncognito) + .append(" - Scheme: ") + .append(uri.getScheme()) + .append("\n"); + assert false : errMsg.toString(); + } // Restores the correct tab order by adding the tab to the front. `tabIdsToUrls` were // stored in reverse to preserve open positions (see {@link // TabGroupMetadataExtractor#extractTabGroupMetadata}). @@ -2374,7 +2384,6 @@ } private boolean maybeLaunchDraggedTabOrGroupInWindow(Intent intent) { - if (!TabUiFeatureUtilities.isTabDragToCreateInstanceSupported()) return false; @Nullable TabGroupMetadata tabGroupMetadata = IntentHandler.getTabGroupMetadata(intent); return tabGroupMetadata != null ? maybeLaunchDraggedTabGroupInWindow(intent, tabGroupMetadata) @@ -2398,7 +2407,11 @@ RecordHistogram.recordBooleanHistogram(HISTOGRAM_DRAGGED_TAB_OPENED_NEW_WINDOW, false); return false; } + boolean isTabInGroup = tab.getTabGroupId() != null; + mMultiInstanceManager.moveTabToWindow(this, tab, /* atIndex= */ 0); + + if (isTabInGroup) RecordUserAction.record("MobileToolbarReorderTab.TabRemovedFromGroup"); RecordHistogram.recordBooleanHistogram(HISTOGRAM_DRAGGED_TAB_OPENED_NEW_WINDOW, true); DragDropMetricUtils.recordDragDropType( ChromeDragDropUtils.getDragDropTypeFromIntent(intent),
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 9521b47..0944c40 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
@@ -104,7 +104,6 @@ import org.chromium.chrome.browser.tasks.tab_management.TabListNotificationHandler; import org.chromium.chrome.browser.tasks.tab_management.TabOverflowMenuCoordinator; import org.chromium.chrome.browser.tasks.tab_management.TabShareUtils; -import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.chrome.browser.tasks.tab_management.TabUiThemeProvider; import org.chromium.chrome.browser.tasks.tab_management.TabUiUtils; import org.chromium.chrome.browser.user_education.UserEducationHelper; @@ -124,6 +123,7 @@ import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.util.ColorUtils; import org.chromium.ui.util.MotionEventUtils; +import org.chromium.ui.util.XrUtils; import org.chromium.ui.widget.RectProvider; import java.util.ArrayList; @@ -4817,7 +4817,7 @@ } private void sendMoveWindowBroadcast(View view, float startXInView, float startYInView) { - if (!TabUiFeatureUtilities.isTabDragAsWindowEnabled()) return; + if (!XrUtils.isXrDevice()) return; if (mWindowAndroid.getActivity().get() == null) return; // The start position is in the view coordinate system and related to the top left position
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSource.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSource.java index da270b77..0fda60b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSource.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSource.java
@@ -104,7 +104,6 @@ // Last drag positions relative to the source view. Set when drag starts or is moved within // view. private float mLastXDp; - private int mLastAction; private boolean mHoveringInStrip; // Tracks whether the current drag has ever left the source strip. @@ -353,7 +352,7 @@ res = onDragStart(dragEvent.getX(), dragEvent.getClipDescription()); break; case DragEvent.ACTION_DRAG_ENDED: - res = onDragEnd(dragEvent.getResult(), mLastAction == DragEvent.ACTION_DRAG_EXITED); + res = onDragEnd(dragEvent.getResult()); break; case DragEvent.ACTION_DRAG_ENTERED: // We'll trigger #onDragEnter when handling the following ACTION_DRAG_LOCATION so we @@ -391,7 +390,6 @@ } break; } - mLastAction = dragEvent.getAction(); return res; } @@ -568,7 +566,7 @@ return true; } - private boolean onDragEnd(boolean dropHandled, boolean didExitToolbar) { + private boolean onDragEnd(boolean dropHandled) { mHoveringInStrip = false; // No-op for destination strip. @@ -576,21 +574,6 @@ return false; } - // If tab was dragged and dropped out of source toolbar but the drop was not handled, - // move to a new window. - Tab tabBeingDragged = - ChromeDragDropUtils.getTabFromGlobalState( - getDragDropGlobalState(/* dragEvent= */ null)); - // TODO(crbug.com/404149905): Update app launch using OS when XR moves to Android 15. - if (XrUtils.isXrDevice() && didExitToolbar && !dropHandled && tabBeingDragged != null) { - - // Record user action if a grouped tab is moved to a new window. - recordTabRemovedFromGroupUserAction(); - - // Hence move the tab to a new Chrome window. - mMultiInstanceManager.moveTabToNewWindow(tabBeingDragged); - } - // Get the drag source Chrome instance id before it is cleared as it may be closed. int sourceInstanceId = DragDropGlobalState.getState(sDragTrackerToken).getDragSourceInstance(); @@ -824,13 +807,11 @@ private boolean shouldAllowGroupDragToCreateInstance(Token groupId) { int groupSize = mCurrentTabGroupModelFilterSupplier.get().getTabCountForGroup(groupId); - return mTabModelSelector.getTotalTabCount() > groupSize - && TabUiFeatureUtilities.isTabDragToCreateInstanceSupported(); + return mTabModelSelector.getTotalTabCount() > groupSize; } private boolean shouldAllowTabDragToCreateInstance() { - return hasMultipleTabs(mTabModelSelector) - && TabUiFeatureUtilities.isTabDragToCreateInstanceSupported(); + return hasMultipleTabs(mTabModelSelector); } private boolean hasMultipleTabs(TabModelSelector tabModelSelector) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate.java index c1cba63..565ec9e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegate.java
@@ -32,6 +32,7 @@ import org.chromium.ui.dragdrop.DropDataAndroid; import org.chromium.ui.dragdrop.DropDataProviderImpl; import org.chromium.ui.dragdrop.DropDataProviderUtils; +import org.chromium.ui.util.XrUtils; /** Delegate for browser related functions used by Drag and Drop. */ public class ChromeDragAndDropBrowserDelegate implements DragAndDropBrowserDelegate { @@ -170,16 +171,27 @@ // This invocation is wrapped in a try-catch block to allow backporting of the // ClipData.Item.Builder() class on pre-V devices. On pre-V devices not supporting this, // state will be cached on the first failure to avoid subsequent invalid attempts. - if (sClipDataItemBuilderNotFound) return null; - try { - return new ClipData.Item.Builder() - .setText(clipDataText) - .setIntentSender(pendingIntent.getIntentSender()) - .build(); - } catch (NoClassDefFoundError e) { - Log.w(TAG, e.toString()); - sClipDataItemBuilderNotFound = true; + if (!sClipDataItemBuilderNotFound) { + try { + return new ClipData.Item.Builder() + .setText(clipDataText) + .setIntentSender(pendingIntent.getIntentSender()) + .build(); + } catch (NoClassDefFoundError e) { + Log.w(TAG, e.toString()); + sClipDataItemBuilderNotFound = true; + } } + + // This is to handle the pending intent on a SysUI level when the drop occurs outside of the + // source window. The API is available only on Android XR and should not be used on other + // platforms. + if (XrUtils.isXrDevice()) { + Intent wrapperIntent = new Intent(); + wrapperIntent.putExtra("system_handled_intent", pendingIntent); + return new ClipData.Item(clipDataText, wrapperIntent, /* uri= */ null); + } + return null; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java index 19c9bd2..983dc9a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
@@ -11,6 +11,7 @@ import android.app.ActivityManager.AppTask; import android.content.Context; import android.content.Intent; +import android.net.Uri; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.os.Bundle; @@ -68,7 +69,6 @@ import org.chromium.chrome.browser.tabmodel.TabPersistentStore; import org.chromium.chrome.browser.tabwindow.TabWindowManager; import org.chromium.chrome.browser.tabwindow.WindowId; -import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities; import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils; import org.chromium.chrome.browser.util.AndroidTaskUtils; import org.chromium.components.browser_ui.desktop_windowing.DesktopWindowStateManager; @@ -78,11 +78,13 @@ import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.tab_group_sync.TabGroupSyncService; import org.chromium.ui.modaldialog.ModalDialogManager; +import org.chromium.ui.util.XrUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; class MultiInstanceManagerApi31 extends MultiInstanceManagerImpl implements ActivityStateListener { @@ -327,12 +329,46 @@ destWindowId, tabGroupMetadata.isIncognito); int tabGroupSizeAfterReparent = destWindowModelFilter.getTabCountForGroup(tabGroupMetadata.tabGroupId); + int tabGroupSizeDiff = tabGroupSizeBeforeReparent - tabGroupSizeAfterReparent; RecordHistogram.recordCount1000Histogram( - "Android.Reparent.TabGroup.GroupSize.Diff", - tabGroupSizeBeforeReparent - tabGroupSizeAfterReparent); + "Android.Reparent.TabGroup.GroupSize.Diff", tabGroupSizeDiff); + + // Log any missing URLs when the tab group size changes during reparenting. + if (tabGroupSizeDiff != 0) { + handleGroupSizeDiff( + tabGroupMetadata.tabIdsToUrls, + destWindowModelFilter.getTabsInGroup(tabGroupMetadata.tabGroupId), + tabGroupMetadata.isIncognito); + } }); } + private void handleGroupSizeDiff( + List<Map.Entry<Integer, String>> tabsToUrlsList, + List<Tab> destGroupedTabs, + boolean isIncognito) { + Set<Integer> destTabIds = new HashSet<>(); + for (Tab tab : destGroupedTabs) { + destTabIds.add(tab.getId()); + } + + StringBuilder errMsg = new StringBuilder(); + errMsg.append("Tab group size before reparenting: ") + .append(tabsToUrlsList.size()) + .append(", isIncognito: ") + .append(isIncognito) + .append("\nMissing URL schemes:\n"); + for (Entry<Integer, String> entry : tabsToUrlsList) { + int tabId = entry.getKey(); + String url = entry.getValue(); + if (!destTabIds.contains(tabId)) { + Uri uri = Uri.parse(url); + errMsg.append("- ").append(uri.getScheme()).append("\n"); + } + } + assert false : errMsg.toString(); + } + private Intent createIntentForGeneralReparenting( ChromeTabbedActivity targetActivity, int tabAtIndex) { assert targetActivity != null; @@ -1264,7 +1300,7 @@ // or if the app is in a desktop window, and the source instance is known. if (instanceId == INVALID_WINDOW_ID) return false; - return TabUiFeatureUtilities.isTabDragAsWindowEnabled() + return XrUtils.isXrDevice() || AppHeaderUtils.isAppInDesktopWindow(mDesktopWindowStateManagerSupplier.get()); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java index 46cd8db..09fabb5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/appmenu/TabbedAppMenuPTTest.java
@@ -7,7 +7,6 @@ import static org.junit.Assert.assertEquals; import static org.chromium.base.test.transit.TransitAsserts.assertFinalDestination; -import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID; import androidx.test.filters.LargeTest; @@ -19,7 +18,6 @@ import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Feature; -import org.chromium.base.test.util.Features.DisableFeatures; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerChrome; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -45,7 +43,6 @@ /** Public Transit tests for the app menu. */ @RunWith(ChromeJUnit4ClassRunner.class) @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) -@DisableFeatures(TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID) @Batch(Batch.PER_CLASS) public class TabbedAppMenuPTTest { @Rule @@ -55,7 +52,7 @@ @Rule public final ChromeRenderTestRule mRenderTestRule = ChromeRenderTestRule.Builder.withPublicCorpus() - .setRevision(0) + .setRevision(1) .setDescription("App menu") .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_APP_MENU) .build();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java index 0b953d8..4592df173 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -1959,7 +1959,6 @@ @Test @LargeTest - @EnableFeatures({ExternalIntentsFeatures.BLOCK_FRAME_RENAVIGATIONS_NAME}) public void testWindowRenavigation() throws Exception { String finalUrl = mTestServer.getURL(HELLO_PAGE); mActivityTestRule.startMainActivityOnBlankPage(); @@ -1975,7 +1974,6 @@ @Test @LargeTest - @EnableFeatures({ExternalIntentsFeatures.BLOCK_FRAME_RENAVIGATIONS_NAME}) public void testWindowRenavigationServerRedirect() throws Exception { String finalUrl = mTestServer.getURL(HELLO_PAGE); mActivityTestRule.startMainActivityOnBlankPage(); @@ -1995,7 +1993,6 @@ @Test @LargeTest - @EnableFeatures({ExternalIntentsFeatures.BLOCK_FRAME_RENAVIGATIONS_NAME}) public void testWindowServerRedirect() throws Exception { mActivityTestRule.startMainActivityOnBlankPage(); TestParams params =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java index 03c381a..0165569 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoNotificationServiceTest.java
@@ -6,12 +6,10 @@ import static org.junit.Assert.assertTrue; -import android.app.NotificationManager; import android.app.PendingIntent; import android.app.PendingIntent.CanceledException; import android.content.Context; import android.content.Intent; -import android.service.notification.StatusBarNotification; import android.util.Pair; import androidx.test.core.app.ApplicationProvider; @@ -23,7 +21,6 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.chromium.base.ContextUtils; import org.chromium.base.ThreadUtils; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.test.util.CommandLineFlags; @@ -31,6 +28,7 @@ import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.PayloadCallbackHelper; import org.chromium.chrome.browser.customtabs.CustomTabsIntentTestUtils; import org.chromium.chrome.browser.customtabs.IncognitoCustomTabActivityTestRule; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -43,9 +41,12 @@ import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.transit.ChromeTransitTestRules; import org.chromium.chrome.test.transit.FreshCtaTransitTestRule; +import org.chromium.components.browser_ui.notifications.BaseNotificationManagerProxy.StatusBarNotificationProxy; +import org.chromium.components.browser_ui.notifications.BaseNotificationManagerProxyFactory; import org.chromium.content_public.browser.LoadUrlParams; import java.io.File; +import java.util.List; import java.util.concurrent.Callable; /** Tests for the Incognito Notification service. */ @@ -95,11 +96,8 @@ Matchers.greaterThanOrEqualTo(1)); }); - Context context = ContextUtils.getApplicationContext(); - NotificationManager nm = - (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); boolean isIncognitoNotificationDisplayed = false; - for (StatusBarNotification statusBarNotification : nm.getActiveNotifications()) { + for (StatusBarNotificationProxy statusBarNotification : getActiveNotifications()) { if (IncognitoNotificationManager.INCOGNITO_TABS_OPEN_TAG.equals( statusBarNotification.getTag())) { isIncognitoNotificationDisplayed = true; @@ -281,4 +279,11 @@ Matchers.is(expectedCount)); }); } + + private static List<? extends StatusBarNotificationProxy> getActiveNotifications() { + PayloadCallbackHelper<List<? extends StatusBarNotificationProxy>> helper = + new PayloadCallbackHelper(); + BaseNotificationManagerProxyFactory.create().getActiveNotifications(helper::notifyCalled); + return helper.getOnlyPayloadBlocking(); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordSavingIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordSavingIntegrationTest.java index 3e707cd..d08a3e9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordSavingIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/PasswordSavingIntegrationTest.java
@@ -125,7 +125,6 @@ DeviceRestriction.RESTRICTION_TYPE_NON_AUTO, GmsCoreVersionRestriction.RESTRICTION_TYPE_VERSION_GE_22W30 }) - @DisabledTest(message = "https://crbug.com/371014579") // TODO(crbug/1475346): Add integration tests for automotive save password flow. public void testSavingNewPassword() throws InterruptedException, TimeoutException { mActivityTestRule.loadUrl(mActivityTestRule.getTestServer().getURL(SIGNIN_FORM_URL));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSourceTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSourceTest.java index f0e0b57..671d5bc0 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSourceTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSourceTest.java
@@ -549,9 +549,8 @@ * <pre> * A] drop in tab strip - source instance (ie: reorder within strip). * B] drop in toolbar container (but outside of tab strip) - source instance. - * C] drop outside of toolbar container with sub flows: - * C.1] With drag as tab FF - no-op. - * C.2] With drag as window FF - open new window. + * C] drop outside of toolbar container - not implemented. Should be handled by + * {@link ChromeDragAndDropBrowserDelegateUnitTest}. * D] Test (A) for drop in destination instance with sub flows: * D.1] drop in current model (i.e. drop incognito tab on incognito strip). * D.2] drop in different model (i.e.: drop standard tab on incognito strip). @@ -594,77 +593,6 @@ doTestOnDragDropInToolbarContainerSource(/* isGroupDrag= */ true); } - /** - * Test for tab drag {@link #ONDRAG_TEST_CASES} - Scenario C.1 - XR-specific flow currently does - * not support moving tab groups. - */ - @Test - public void test_onDrag_dropOutsideToolbarContainer() { - XrUtils.setXrDeviceForTesting(true); - HistogramWatcher histogramExpectation = - HistogramWatcher.newBuilder() - .expectNoRecords("Android.DragDrop.Tab.FromStrip.Result") - .expectNoRecords("Android.DragDrop.Tab.FromStrip.Result.DesktopWindow") - .expectNoRecords("Android.DragDrop.Tab.Type") - .expectNoRecords("Android.DragDrop.Tab.Type.DesktopWindow") - .expectNoRecords("Android.DragDrop.Tab.ReorderStripWithDragDrop") - .build(); - new DragEventInvoker(/* isGroupDrag= */ false, /* isGroupShared= */ false) - .dragExit(mSourceInstance) - .verifyShadowVisibility(true) - .end(false); - - // Verify appropriate events are generated. - // Strip prepares for drop on drag enter. - verify(mSourceStripLayoutHelper, times(1)) - .handleDragEnter(anyFloat(), anyFloat(), anyBoolean(), anyBoolean()); - // Strip clears state for drop on drag exit. - verify(mSourceStripLayoutHelper, times(1)).handleDragExit(anyBoolean(), anyBoolean()); - // Verify moveTabToNewWindow is called since drop is outside strip. - verify(mSourceMultiInstanceManager, times(1)).moveTabToNewWindow(mTabBeingDragged); - // Verify tab is not moved since drop is outside strip. - verify(mSourceMultiInstanceManager, times(0)).moveTabToWindow(any(), any(), anyInt()); - // Verify tab cleared. - verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); - // Verify destination strip not invoked. - verifyNoInteractions(mDestStripLayoutHelper); - histogramExpectation.assertExpected(); - } - - /** - * Test for {@link #ONDRAG_TEST_CASES} - Scenario C.2 - XR-specific flow currently does not - * support moving tab groups. - */ - @Test - public void test_onDrag_dropOutsideToolbarContainer_dragAsWindow() { - XrUtils.setXrDeviceForTesting(true); - // Verify tab is successfully dropped as a window. - verifyDropOutsideToolbarContainerAsWindow(); - - // Verify the user action `TabRemovedFromGroup` is not recorded. - assertEquals( - "TabRemovedFromGroup should not be recorded as the tab being dragged is not in a" - + " tab group", - 0, - mUserActionTest.getActionCount("MobileToolbarReorderTab.TabRemovedFromGroup")); - } - - @Test - public void test_dragAsWindow_recordTabRemovedFromGroup() { - XrUtils.setXrDeviceForTesting(true); - // The tab being dragged is in a tab group. - when(mTabGroupModelFilter.isTabInTabGroup(mTabBeingDragged)).thenReturn(true); - - // Verify tab is successfully dropped as a window. - verifyDropOutsideToolbarContainerAsWindow(); - - // Verify the user action`TabRemovedFromGroup` is recorded. - assertEquals( - "TabRemovedFromGroup should be recorded", - 1, - mUserActionTest.getActionCount("MobileToolbarReorderTab.TabRemovedFromGroup")); - } - @Test public void test_onDrag_unhandledDropOutside_maxChromeInstances() { doTestUnhandledDropOutsideWithMaxInstances( @@ -1105,27 +1033,6 @@ histogramExpectation.assertExpected(); } - private void verifyDropOutsideToolbarContainerAsWindow() { - new DragEventInvoker(/* isGroupDrag= */ false, /* isGroupShared= */ false) - .dragExit(mSourceInstance) - .verifyShadowVisibility(true) - .end(false); - - // Verify appropriate events are generated. - // Strip prepares for drop on drag enter. - verify(mSourceStripLayoutHelper, times(1)) - .handleDragEnter(anyFloat(), anyFloat(), anyBoolean(), anyBoolean()); - // Strip clears state for drop on drag exit. - verify(mSourceStripLayoutHelper, times(1)).handleDragExit(anyBoolean(), anyBoolean()); - // Verify Since the drop is outside the TabToolbar area the tab will be move to a new - // Chrome Window. - verify(mSourceMultiInstanceManager, times(1)).moveTabToNewWindow(mTabBeingDragged); - // Verify tab cleared. - verify(mSourceStripLayoutHelper, times(1)).stopReorderMode(); - // Verify destination strip not invoked. - verifyNoInteractions(mDestStripLayoutHelper); - } - private void doTestUnhandledDropOutsideWithMaxInstances( boolean isInDesktopWindow, boolean isGroupDrag) { String resultHistogram = @@ -1743,7 +1650,6 @@ .moveTabGroupToWindow(any(), eq(mTabGroupMetadata), anyInt()); } else { // Verify tab is not moved. - verify(mSourceMultiInstanceManager, times(0)).moveTabToNewWindow(mTabBeingDragged); verify(mSourceMultiInstanceManager, times(0)).moveTabToWindow(any(), any(), anyInt()); } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java index c816289f..6428343 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java
@@ -7,6 +7,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; @@ -399,7 +400,13 @@ OneshotSupplier<ProfileProvider> profileProviderSupplier, TabCreatorManager tabCreatorManager, NextTabPolicySupplier nextTabPolicySupplier) { - return new MockTabModelSelector(mProfile, mIncognitoProfile, 0, 0, null); + MockTabModelSelector mockTabModelSelector = + Mockito.spy( + new MockTabModelSelector( + mProfile, mIncognitoProfile, 0, 0, null)); + when(mockTabModelSelector.getTabGroupModelFilterProvider()) + .thenReturn(mTabGroupModelFilterProvider); + return mockTabModelSelector; } @Override @@ -1316,13 +1323,40 @@ @Test @EnableFeatures(ChromeFeatureList.TAB_STRIP_GROUP_DRAG_DROP_ANDROID) public void testReparentGroupToRunningActivity() { - doTestReparentGroupToRunningActivity(/* isGroupShared= */ false); + doTestReparentGroupToRunningActivity( + /* isGroupShared= */ false, /* expectedDestTabCount= */ 3); } @Test @EnableFeatures(ChromeFeatureList.TAB_STRIP_GROUP_DRAG_DROP_ANDROID) public void testReparentGroupToRunningActivity_sharedTabGroup() { - doTestReparentGroupToRunningActivity(/* isGroupShared= */ true); + doTestReparentGroupToRunningActivity( + /* isGroupShared= */ true, /* expectedDestTabCount= */ 3); + } + + @Test + @EnableFeatures(ChromeFeatureList.TAB_STRIP_GROUP_DRAG_DROP_ANDROID) + public void testReparentGroupToRunningActivity_groupSizeDifferent() { + when(mTabGroupModelFilter.getTabsInGroup(any())).thenReturn(Arrays.asList(mTab1, mTab2)); + + // Verify AssertionError and its message when tab group sizes differ. + StringBuilder expectedErrMsg = new StringBuilder(); + expectedErrMsg + .append("Tab group size before reparenting: ") + .append(3) + .append(", isIncognito: ") + .append(false) + .append("\nMissing URL schemes:\n") + .append("- ") + .append("http\n"); + AssertionError error = + assertThrows( + AssertionError.class, + () -> { + doTestReparentGroupToRunningActivity( + /* isGroupShared= */ false, /* expectedDestTabCount= */ 2); + }); + assertEquals(expectedErrMsg.toString(), error.getMessage()); } @Test @@ -1601,22 +1635,26 @@ } } - private void doTestReparentGroupToRunningActivity(boolean isGroupShared) { + private void doTestReparentGroupToRunningActivity( + boolean isGroupShared, int expectedDestTabCount) { HistogramWatcher histogramExpectation = HistogramWatcher.newBuilder() .expectIntRecord("Android.Reparent.TabGroup.GroupSize", 3) - .expectAnyRecord("Android.Reparent.TabGroup.GroupSize.Diff") + .expectIntRecord( + "Android.Reparent.TabGroup.GroupSize.Diff", + 3 - expectedDestTabCount) .expectAnyRecord("Android.Reparent.TabGroup.Duration") .build(); // Setup. mMultiInstanceManager.mTestBuildInstancesList = true; + when(mTabGroupModelFilter.getTabCountForGroup(any())).thenReturn(expectedDestTabCount); ArrayList<Map.Entry<Integer, String>> tabIdsToUrls = new ArrayList<>( List.of( - Map.entry(1, "https://www.amazon.com"), - Map.entry(2, "https://www.youtube.com"), - Map.entry(3, "https://www.facebook.com"))); + Map.entry(TAB_ID_1, TAB_URL_1.getSpec()), + Map.entry(TAB_ID_2, TAB_URL_2.getSpec()), + Map.entry(TAB_ID_3, TAB_URL_3.getSpec()))); TabGroupMetadata tabGroupMetadata = new TabGroupMetadata( /* rootId= */ -1,
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 45a276f..8a9efb7 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1170,6 +1170,7 @@ <translation id="1796588414813960292">ድምፅ የሚያስፈልጋቸው ባህሪዎች አይሰሩም</translation> <translation id="1797117170091578105">የእርስዎን የChromebook ቁልፍ ሰሌዳ በመጠቀም ይጫወቱ። ቁልፎችን ለተወሰኑ እርምጃዎች ማበጀት ይችላሉ።</translation> <translation id="1798335429200675510">ረቂቅ ለመፍጠር ወይም ነባር ሥራን ለማጣራት በጽሑፍ ሳጥን ውስጥ በቀኝ ጠቅ ያድርጉ፣ በGoogle ሰው ሠራሽ አስተውሎት የተጎላበተ። በአሁኑ ጊዜ ውስን የሆነ ተገኝነት ነው ያለው።</translation> +<translation id="1799852120691957794">ከቀዳሚ ክፍለ ጊዜው መስኮቶችን ወደነበሩበት መመለስ አይቻልም</translation> <translation id="180203835522132923">+ O፣ ከዚያ Wን ይፈልጉ</translation> <translation id="1802624026913571222">ክዳኑ ሲዘጋ ተኛ</translation> <translation id="1802687198411089702">ይህ ገፅ ምላሽ እየሰጠ አይደለም። እሱን መጠበቅ ወይም ትተው መውጣት ይችላል።</translation> @@ -2362,6 +2363,7 @@ <translation id="2610374175948698697">በመሣሪያዎ ላይ ፋይሎችን ወይም አቃፊዎችን መመልከት ይቻላል</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">በMicrosoft መለያዎ ይግቡ እና በመቀጠል እንደገና ይሞክሩ</translation> +<translation id="2611702650078660078">ስህተት ተከስቷል</translation> <translation id="2611776654555141051">የአራት ማዕዘን መሣሪያ</translation> <translation id="2612676031748830579">የካርድ ቁጥር</translation> <translation id="261305050785128654">የሚናገሩትን ቋንቋዎች ድር ጣቢያዎች እንዲያውቁ ያድርጉ። በሚቻልበት ጊዜ በእነዚያ ቋንቋዎች ይዘትን ያሳያሉ።</translation> @@ -2722,6 +2724,7 @@ <translation id="2849936225196189499">ዋነኛ</translation> <translation id="285033512555869047">ዝግ ነው</translation> <translation id="2850541429955027218">ገጽታ አክል</translation> +<translation id="2852045827873867442">የበይነመረብ ግንኙነት ያስፈልጋል።</translation> <translation id="285237063405807022">(በመጫን ላይ)</translation> <translation id="2853121255651601031">የይለፍ ቃሉ ተቀምጧል</translation> <translation id="2855243985454069333">ታሪክን ከሁሉም ከተመሳሰሉ መሣሪያዎች ይሰርዛል</translation> @@ -5434,6 +5437,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 የተባዛ</translation> <translation id="4780321648949301421">ገፅ አስቀምጥ እንደ…</translation> <translation id="4780558987886269159">ለሥራ</translation> +<translation id="4781633367688946589">ወደ አዲስ ክፍለ ጊዜ ቀጥል</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ከእርስዎ ዲጂታል የኪስ ቦርሳ ላይ ግላዊ መረጃን መጠቀም ይፈልጋል።</translation> <translation id="4785719467058219317">በዚህ ድር ጣቢያ ያልተመዘገበ የደህንነት ቁልፍ እየተጠቀሙ ነው</translation> <translation id="4785914069240823137">ከርክምን ሰርዝ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 91b9743..0cd91136 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -3170,6 +3170,7 @@ <translation id="3188465121994729530">معدل الانتقال</translation> <translation id="3189187154924005138">مؤشّر الماوس الكبير</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{تم حفظ كلمة مرور واحدة وبيانات أخرى على هذا الجهاز فقط. ولاستخدامها على أجهزتك الأخرى، يجب حفظها في حسابك على Google.}zero{تم حفظ {PASSWORD_COUNT} كلمة مرور وبيانات أخرى على هذا الجهاز فقط. ولاستخدامها على أجهزتك الأخرى، يجب حفظها في حسابك على Google.}two{تم حفظ كلمتَي مرور ({PASSWORD_COUNT}) وبيانات أخرى على هذا الجهاز فقط. ولاستخدامهما على أجهزتك الأخرى، يجب حفظهما في حسابك على Google.}few{تم حفظ {PASSWORD_COUNT} كلمات مرور وبيانات أخرى على هذا الجهاز فقط. ولاستخدامها على أجهزتك الأخرى، يجب حفظها في حسابك على Google.}many{تم حفظ {PASSWORD_COUNT} كلمة مرور وبيانات أخرى على هذا الجهاز فقط. ولاستخدامها على أجهزتك الأخرى، يجب حفظها في حسابك على Google.}other{تم حفظ {PASSWORD_COUNT} كلمة مرور وبيانات أخرى على هذا الجهاز فقط. ولاستخدامها على أجهزتك الأخرى، يجب حفظها في حسابك على Google.}}</translation> +<translation id="319044078641740013">يجب مزامنة السجلّ وعلامات التبويب مع <ph name="ACCOUNT_EMAIL" /> للانتقال بسهولة إلى المواقع الإلكترونية التي زرتها.</translation> <translation id="3190558889382726167">تم حفظ كلمة المرور</translation> <translation id="3192586965067888278">يُرجى وصف المشكلة بالتفصيل. سيتم إرسال الملاحظات إلى فريق المراجعة لدى Google، ومن الممكن أن تُستخدم لتحسين منتجات وخدمات Google أو تطويرها.</translation> <translation id="3192947282887913208">ملفات صوتية</translation> @@ -10349,6 +10350,7 @@ <translation id="8280848878018088610">أمواج تتصادم في البحر ومدينة وقلعة خياليتان في الخلفية، في أجواء مظلمة</translation> <translation id="828180235270931531">الطابعات الأخرى المتاحة</translation> <translation id="8281886186245836920">التخطّي</translation> +<translation id="8283802069507225582">يجب مزامنة السجلّ وعلامات التبويب مع <ph name="ACCOUNT_EMAIL" /> لمواصلة التصفّح من حيث توقفت على الأجهزة الأخرى.</translation> <translation id="8284279544186306258">جميع مواقع <ph name="WEBSITE_1" /></translation> <translation id="8284326494547611709">الترجمة والشرح</translation> <translation id="8286036467436129157">تسجيل الدخول</translation> @@ -11026,6 +11028,7 @@ <translation id="8754200782896249056"><p>عند تشغيل <ph name="PRODUCT_NAME" /> من خلال بيئة معتمدة لسطح المكتب، سيتم استخدام إعدادات الخادم الوكيل للنظام. ومع ذلك، يحتمل إما أن يكون نظامك غير مدعم أو أنه ربما حدثت مشكلة أثناء تشغيل إعداد نظامك.</p> <p>لكن لا يزال بإمكانك الإعداد من خلال سطر الأوامر. يُرجى الاطّلاع على <code>man <ph name="PRODUCT_BINARY_NAME" /></code> للمزيد من المعلومات عن المتغيرات لكل من العلامات والبيئة.</p></translation> +<translation id="8754810799862630650">يجب مزامنة السجلّ وعلامات التبويب مع <ph name="ACCOUNT_EMAIL" /> للاطّلاع على علامات التبويب المفتوحة من أجهزة الكمبيوتر والهواتف الأخرى.</translation> <translation id="8755175579224030324">تنفيذ المهام المتعلّقة بالأمان في مؤسستك، مثل إدارة الشهادات والمفاتيح المُخزَّنة على الجهاز</translation> <translation id="875532100880844232">اختَر إجراءً لكل مفتاح في <ph name="DEVICE_NAME" />.</translation> <translation id="8755376271068075440">أ&كبر</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index ed14c6ea..e022d3b 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1169,6 +1169,7 @@ <translation id="1796588414813960292">ধ্বনিৰ আৱশ্যক হোৱা সুবিধাসমূহে কাম নকৰিব</translation> <translation id="1797117170091578105">আপোনাৰ Chromebook কীব’ৰ্ড ব্যৱহাৰ কৰি খেলক। নিৰ্দিষ্ট কাৰ্যৰ বাবে আপুনি কী কাষ্টমাইজ কৰিব পাৰে।</translation> <translation id="1798335429200675510">এটা খচৰা সৃষ্টি কৰিবলৈ অথবা ইতিমধ্যে থকা কাম মসৃণ কৰিবলৈ পাঠৰ বাকচটোত ৰাইট ক্লিক কৰক, যিটো Google AIৰ দ্বাৰ সঞ্চালিত। বৰ্তমান সীমিতৰূপত উপলব্ধ।</translation> +<translation id="1799852120691957794">আপোনাৰ পূৰ্বৱৰ্তী ছেশ্বনৰ পৰা ৱিণ্ড’ পুনঃস্থাপন কৰিব নোৱাৰি</translation> <translation id="180203835522132923">Search + O, তাৰ পাছত W</translation> <translation id="1802624026913571222">ক’ভাৰটো বন্ধ কৰিলে সুপ্ত অৱস্থালৈ নিয়ক</translation> <translation id="1802687198411089702">এই পৃষ্ঠাটোৱে সঁহাৰি জনোৱা নাই। আপুনি পৃষ্ঠাটোৱে সঁহাৰি জনোৱালৈ অপেক্ষা কৰিব পাৰে বা বাহিৰ হ’ব পাৰে।</translation> @@ -2364,6 +2365,7 @@ <translation id="2610374175948698697">আপোনাৰ ডিভাইচত ফাইল বা ফ’ল্ডাৰসমূহ চাব পাৰে</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">আপোনাৰ Microsoft একাউণ্টত ছাইন ইন কৰক আৰু তাৰ পাছত পুনৰ চেষ্টা কৰক</translation> +<translation id="2611702650078660078">কিবা আসোঁৱাহ হ’ল</translation> <translation id="2611776654555141051">আয়তক্ষেত্ৰৰ সঁজুলি</translation> <translation id="2612676031748830579">কার্ড নম্বৰ</translation> <translation id="261305050785128654">আপুনি কোৱা ভাষাটো ৱেবছাইটসমূহক জনাওক। যেতিয়া সম্ভৱ হয়, এইবোৰে সেই ভাষাসমূহত উপলব্ধ সমল দেখুৱাব।</translation> @@ -2724,6 +2726,7 @@ <translation id="2849936225196189499">জটিল</translation> <translation id="285033512555869047">বন্ধ আছে</translation> <translation id="2850541429955027218">থীম যোগ কৰক</translation> +<translation id="2852045827873867442">ইণ্টাৰনেট সংযোগৰ প্ৰয়োজন।</translation> <translation id="285237063405807022">(ল’ড কৰি থকা হৈছে)</translation> <translation id="2853121255651601031">পাছৱৰ্ড ছেভ কৰা হ’ল</translation> <translation id="2855243985454069333">আটাইবোৰ ছিংক কৰা ডিভাইচৰ পৰা ইতিহাস মচে</translation> @@ -3282,6 +3285,7 @@ <translation id="3269689705184377744">{COUNT,plural, =1{ফাইল}one{# টা ফাইল}other{# টা ফাইল}}</translation> <translation id="326999365752735949">diff ডাউনল'ড কৰি থকা হৈছে</translation> <translation id="3270965368676314374">আপোনাৰ কম্পিউটাৰৰ পৰা ফট’, সংগীত আৰু অন্য মিডিয়া পঢ়ক, সলনি কৰক আৰু মচক</translation> +<translation id="3275464924531706548"><ph name="HEADER" /> সংকোচন কৰক</translation> <translation id="3275778809241512831">আপোনাৰ আভ্যন্তৰীণ সুৰক্ষা চাবিটো বৰ্তমান অসুৰক্ষিত। আপুনি এইটোৰ জৰিয়তে ব্যৱহাৰ কৰা সেৱাসমূহৰ পৰা অনুগ্ৰহ কৰি এইটো আঁতৰাওক। সমস্যাটো সমাধান কৰিবলৈ, অনুগ্ৰহ কৰি সুৰক্ষাৰ চাবিটো ৰিছেট কৰক।</translation> <translation id="3275778913554317645">ৱিণ্ড’ হিচাপে খোলক</translation> <translation id="3277214528693754078">পাঠৰ কাৰ্ছৰডালৰ জৰিয়তে নেভিগে’ট কৰক (caret browsing)</translation> @@ -3613,6 +3617,7 @@ <translation id="3510471875518562537">এই ঠিকনাটো আপোনাৰ iPhoneত ব্যৱহাৰ কৰক</translation> <translation id="3511200754045804813">পুনঃস্কেন কৰক</translation> <translation id="3511307672085573050">লিংকৰ ঠি&কনা প্ৰতিলিপি কৰক</translation> +<translation id="3511358375261756531"><ph name="HEADER" /> বিস্তাৰ কৰক</translation> <translation id="351152300840026870">নিৰ্দিষ্ট-প্ৰস্থৰ ফণ্ট</translation> <translation id="3511528412952710609">চুটি</translation> <translation id="3513019849832307207">যোগদান কৰক আৰু খোলক</translation> @@ -5435,6 +5440,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • ১ টা ডুপ্লিকেট</translation> <translation id="4780321648949301421">এই হিচাপ ছেভ কৰক…</translation> <translation id="4780558987886269159">কৰ্মস্থানৰ বাবে</translation> +<translation id="4781633367688946589">নতুন ছেশ্বনলৈ অব্যাহত ৰাখক</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" />এ আপোনাৰ ডিজিটেল ৱালেটৰ পৰা ব্যক্তিগত তথ্য ব্যৱহাৰ কৰিব বিচাৰে।</translation> <translation id="4785719467058219317">আপুনি ব্যৱহাৰ কৰি থকা সুৰক্ষা চাবিটো এই ৱেবছাইটটোত পঞ্জীকৃত নহয়</translation> <translation id="4785914069240823137">ক্ৰপ কৰাটো বাতিল কৰক</translation> @@ -6164,6 +6170,7 @@ <translation id="5296536303670088158">আপোনাৰ ওচৰত ক্ষতিকাৰক ৱেবছাইটৰ বিৰুদ্ধে Chromeৰ আটাইতকৈ শক্তিশালী সুৰক্ষা ব্যৱস্থা আছে</translation> <translation id="5297005732522718715">টেডাৰিং কনফিগাৰেশ্বন ৰিফ্ৰেশ্ব কৰক</translation> <translation id="5297082477358294722">পাছৱৰ্ড ছেভ কৰা হ'ল। আপোনাৰ <ph name="SAVED_PASSWORDS_STORE" />ত ছেভ হৈ থকা পাছৱৰ্ড চাওক আৰু পৰিচালনা কৰক।</translation> +<translation id="5297548311167268289"><ph name="RP_ID" />ত ছাইন ইন কৰক</translation> <translation id="5297946558563358707">অন্য কোনোবাই আপোনাৰ স্ক্ৰীনখন চালে, আপোনাৰ স্ক্ৰীনখনৰ একেবাৰে তলৰ সোঁফালে গোপনীয়তাৰ চকুৰ চিহ্নটো দেখুৱাওক</translation> <translation id="5297984209202974345"><ph name="STYLE" /> শৈলীত <ph name="SUBJECT" />ৰ শেহতীয়া AI থীম <ph name="INDEX" /></translation> <translation id="5298219193514155779">থীম সৃষ্টি কৰোঁতা</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 951e11d..5af9efe 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1158,6 +1158,7 @@ <translation id="1796588414813960292">Səs tələb edən funksiyalar işləməyəcək</translation> <translation id="1797117170091578105">Chromebook klaviaturanızdan istifadə edərək oynayın. Xüsusi hərəkətlər üçün düymələri fərdiləşdirə bilərsiniz.</translation> <translation id="1798335429200675510">Google AI tərəfindən dəstəklənən qaralama yaratmaq və ya mövcud işi təkmilləşdirmək üçün mətn qutusuna sağ düymə ilə toxunun. Hazırda məhdud əlçatanlığa malikdir.</translation> +<translation id="1799852120691957794">Əvvəlki sessiyanızdan pəncərələri bərpa etmək olmur</translation> <translation id="180203835522132923">Axtarış + O, sonra W</translation> <translation id="1802624026913571222">Qapaq bağlandıqda yuxu rejiminə keçsin</translation> <translation id="1802687198411089702">Səhifəyə daxil olmaq alınmadı. Gözləyin və ya çıxın.</translation> @@ -2352,6 +2353,7 @@ <translation id="2610374175948698697">Cihazda fayl və ya qovluqlara baxa bilər</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Microsoft hesabına daxil olub, yenidən cəhd edin</translation> +<translation id="2611702650078660078">Xəta baş verdi</translation> <translation id="2611776654555141051">Düzbucaqlı Aləti</translation> <translation id="2612676031748830579">Kart nömrəsi</translation> <translation id="261305050785128654">Veb-saytlara danışdığınız dilləri bilmək imkanı verin. Onlar mümkün olduqda həmin dillərdə kontent göstərəcək.</translation> @@ -2712,6 +2714,7 @@ <translation id="2849936225196189499">Kritik</translation> <translation id="285033512555869047">Bağlıdır</translation> <translation id="2850541429955027218">Tema əlavə edin</translation> +<translation id="2852045827873867442">İnternet bağlantısı tələb olunur.</translation> <translation id="285237063405807022">(yüklənir)</translation> <translation id="2853121255651601031">Parol Yadda Saxlandı</translation> <translation id="2855243985454069333">Bütün sinxronlaşdırılmış cihazlardan tarixçəni silir</translation> @@ -5424,6 +5427,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 dublikat</translation> <translation id="4780321648949301421">Səhifəni yadda saxlama formatı:</translation> <translation id="4780558987886269159">İş üçün</translation> +<translation id="4781633367688946589">Yeni sessiyaya davam edin</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> rəqəmsal pulqabınızdakı şəxsi məlumatlardan istifadə etmək istəyir.</translation> <translation id="4785719467058219317">Bu veb saytda qeydiyyatda olmayan təhlükəsizlik açarından istifadə edirsiniz</translation> <translation id="4785914069240823137">Kəsilməni ləğv edin</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 19ee300..73922e9f 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1165,6 +1165,7 @@ <translation id="1796588414813960292">Функцыі, для якіх патрэбны гук, не будуць працаваць</translation> <translation id="1797117170091578105">Гуляйце, выкарыстоўваючы клавіятуру Chromebook. Клавішы можна наладзіць такім чынам, каб яны выконвалі канкрэтныя дзеянні.</translation> <translation id="1798335429200675510">Націсніце правай кнопкай мышы на тэкставае поле, каб стварыць чарнавік або дапрацаваць існуючае змесціва з дапамогай штучнага інтэлекту ад Google. Функцыя цяпер даступная не ўсім карыстальнікам.</translation> +<translation id="1799852120691957794">Не ўдалося аднавіць вокны з папярэдняга сеанса</translation> <translation id="180203835522132923">Пошук + O, затым W</translation> <translation id="1802624026913571222">Пры закрыцці вечка пераводзіць прыладу ў рэжым сну</translation> <translation id="1802687198411089702">Старонка не адказвае. Можна пачакаць або закрыць яе.</translation> @@ -2354,6 +2355,7 @@ <translation id="2610374175948698697">Файлы, якім дазволена праглядаць файлы і папкі на прыладзе</translation> <translation id="2610780100389066815">Падпісванне даверанага спіса Microsoft</translation> <translation id="261114180663074524">Увайдзіце ва ўліковы запіс Microsoft і паўтарыце спробу</translation> +<translation id="2611702650078660078">Адбылася памылка</translation> <translation id="2611776654555141051">Інструмент "Прамавугольнік"</translation> <translation id="2612676031748830579">Нумар карткі</translation> <translation id="261305050785128654">Укажыце для вэб-сайтаў, якімі мовамі вы валодаеце. Вэб-сайты будуць па магчымасці паказваць змесціва на гэтых мовах.</translation> @@ -2714,6 +2716,7 @@ <translation id="2849936225196189499">Крытычна важнае</translation> <translation id="285033512555869047">Закрытая</translation> <translation id="2850541429955027218">Дадаць тэму</translation> +<translation id="2852045827873867442">Патрабуецца падключэнне да інтэрнэту.</translation> <translation id="285237063405807022">(загружаецца)</translation> <translation id="2853121255651601031">Пароль захаваны</translation> <translation id="2855243985454069333">Гісторыя будзе выдалена з усіх сінхранізаваных прылад</translation> @@ -5426,6 +5429,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 копія</translation> <translation id="4780321648949301421">Захаваць старонку як...</translation> <translation id="4780558987886269159">Для працы</translation> +<translation id="4781633367688946589">Перайсці да новага сеанса</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> запытвае магчымасць выкарыстоўваць вашу асабістую інфармацыю з лічбавага кашалька.</translation> <translation id="4785719467058219317">Вы выкарыстоўваеце ключ бяспекі, не зарэгістраваны на гэтым вэб-сайце</translation> <translation id="4785914069240823137">Скасаваць абрэзку</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 2ea1809d..d4aad61 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -3174,6 +3174,7 @@ <translation id="3188465121994729530">Пълзяща средна стойност</translation> <translation id="3189187154924005138">Голям курсор</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 парола и други елементи са запазени само на това устройство. За да ги използвате на другите си устройства, запазете ги в профила си в Google.}other{{PASSWORD_COUNT} пароли и други елементи са запазени само на това устройство. За да ги използвате на другите си устройства, запазете ги в профила си в Google.}}</translation> +<translation id="319044078641740013">За да се връщате лесно към посетените от вас сайтове, синхронизирайте историята и разделите си с(ъс) <ph name="ACCOUNT_EMAIL" /></translation> <translation id="3190558889382726167">Паролата бе запазена</translation> <translation id="3192586965067888278">Опишете проблема подробно. Отзивите ще бъдат изпратени до Google за преглед от човек и може да се използват за подобряване или разработване на продуктите и услугите ни.</translation> <translation id="3192947282887913208">Аудиофайлове</translation> @@ -10348,6 +10349,7 @@ <translation id="8280848878018088610">Мрачна картина на разбиващи се в морето вълни на фона на фантастичен град и замък.</translation> <translation id="828180235270931531">Други налични принтери</translation> <translation id="8281886186245836920">Пропускане</translation> +<translation id="8283802069507225582">За да продължите оттам, откъдето сте прекъснали на други устройства, синхронизирайте историята и разделите си с(ъс) <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8284279544186306258">всички <ph name="WEBSITE_1" /> сайта</translation> <translation id="8284326494547611709">Надписи</translation> <translation id="8286036467436129157">Вход</translation> @@ -11025,6 +11027,7 @@ <translation id="8754200782896249056"><p>Когато изпълнявате <ph name="PRODUCT_NAME" /> в поддържана среда на компютър, ще се използват системните настройки за прокси сървър. Но системата ви или не се поддържа, или е възникнал проблем при стартирането на системната конфигурация.</p> <p>Можете обаче да конфигурирате чрез командния ред. Моля, вижте <code>man <ph name="PRODUCT_BINARY_NAME" /></code> за още информация за флагове и променливи на обкръжението.</p></translation> +<translation id="8754810799862630650">За да виждате отворените раздели от другите си компютри и телефони, синхронизирайте историята и разделите си с(ъс) <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8755175579224030324">Изпълнение на свързани със сигурността задачи за организацията ви, като например управление на сертификатите и ключовете, които се съхраняват на устройството</translation> <translation id="875532100880844232">Изберете действие за всеки клавиш на <ph name="DEVICE_NAME" /></translation> <translation id="8755376271068075440">&По-голям</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 1e2ad787..08270b5 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -2366,7 +2366,7 @@ <translation id="2610374175948698697">Može pregledati fajlove ili foldere na uređaju</translation> <translation id="2610780100389066815">Potpisivanje Microsoftove liste pouzdanih stavki</translation> <translation id="261114180663074524">Prijavite se na Microsoft račun, a zatim pokušajte ponovo</translation> -<translation id="2611702650078660078">Došlo je do pogreške</translation> +<translation id="2611702650078660078">Došlo je do greške</translation> <translation id="2611776654555141051">Alat za crtanje pravougaonika</translation> <translation id="2612676031748830579">Broj kartice</translation> <translation id="261305050785128654">Omogućite web lokacijama da znaju koje jezike govorite. Prikazivat će vam sadržaj na tim jezicima, kada je to moguće.</translation> @@ -5176,6 +5176,7 @@ <translation id="4585793705637313973">Uredite stranicu</translation> <translation id="4586275095964870617">Otvaranje web lokacije <ph name="URL" /> u alternativnom pregledniku nije uspjelo. Kontaktirajte administratora sistema.</translation> <translation id="4587589328781138893">Web lokacije</translation> +<translation id="4588497044036650559">Otvaranje stranice opcija proširenja stranice nove kartice u trenutačnoj kartici</translation> <translation id="4588749726511456218">Ubrzanje klizanja <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4589197033939192905">Izgleda da su <ph name="PASSWORD_DOMAIN" /> i <ph name="DOMAIN" /> povezani. Provjerite je li <ph name="DOMAIN" /> pouzdana web lokacija prije korištenja lozinke.</translation> <translation id="4589713469967853491">Zapisnici su uspješno ispisani u direktorij Preuzimanja.</translation> @@ -5442,7 +5443,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplikat</translation> <translation id="4780321648949301421">Sačuvaj stranicu kao...</translation> <translation id="4780558987886269159">Za posao</translation> -<translation id="4781633367688946589">Nastavi do nove sesije</translation> +<translation id="4781633367688946589">Nastavi na novu sesiju</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> želi koristiti lične informacije iz vašeg digitalnog novčanika.</translation> <translation id="4785719467058219317">Koristite sigurnosni ključ koji nije registriran na ovoj web lokaciji</translation> <translation id="4785914069240823137">Otkažite izrezivanje</translation> @@ -9157,6 +9158,7 @@ <translation id="7461924472993315131">PIN</translation> <translation id="746216226901520237">Sljedeći put će vaš telefon otključati vaš uređaj <ph name="DEVICE_TYPE" />. Pametno zaključavanje možete isključiti u Postavkama.</translation> <translation id="746329643760972486">MacOS</translation> +<translation id="7463985990119325874">Vaša organizacija upravlja načinom na koji se podaci koje prikupljaju ove značajke mogu upotrebljavati.</translation> <translation id="7464645554245611385">Posljednje ažuriranje kartice</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# otvorena kartica. Pritisnite da aktivirate/deaktivirate traku kartice}one{# otvorena kartica. Pritisnite da aktivirate/deaktivirate traku kartice}few{# otvorene kartice. Pritisnite da aktivirate/deaktivirate traku kartice}other{# otvorenih kartica. Pritisnite da aktivirate/deaktivirate traku kartice}}</translation> <translation id="7465635034594602553">Nešto nije uredu. Sačekajte nekoliko minuta i ponovo pokrenite aplikaciju <ph name="APP_NAME" />.</translation> @@ -11722,6 +11724,7 @@ <translation id="934244546219308557">Dajte naziv ovoj grupi</translation> <translation id="93480724622239549">Propust ili greška</translation> <translation id="9354763467503131">Dozvoljeno je tražiti instaliranje web aplikacija na uređaju</translation> +<translation id="936329857119665832">Otvara se u trenutačnoj kartici</translation> <translation id="936646668635477464">Kamera i mikrofon</translation> <translation id="936801553271523408">Dijagnostički podaci sistema</translation> <translation id="93766956588638423">Popravi ekstenziju</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 7ebcad5f..836cdaba 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1162,6 +1162,7 @@ <translation id="1796588414813960292">Les funcions que necessitin so no funcionaran</translation> <translation id="1797117170091578105">Juga utilitzant el teclat del Chromebook. Pots personalitzar les tecles perquè facin accions específiques.</translation> <translation id="1798335429200675510">Fes clic amb el botó dret en un quadre de text per crear un esborrany o polir el treball existent amb la tecnologia de la IA de Google. En aquests moments té una disponibilitat limitada.</translation> +<translation id="1799852120691957794">No es poden restaurar les finestres de la sessió anterior</translation> <translation id="180203835522132923">Cerca+O i, després, W</translation> <translation id="1802624026913571222">Posa en repòs quan es tanqui la tapa</translation> <translation id="1802687198411089702">La pàgina no respon. Pots esperar que respongui o pots sortir-ne.</translation> @@ -2353,6 +2354,7 @@ <translation id="2610374175948698697">Poden veure els fitxers o les carpetes del dispositiu</translation> <translation id="2610780100389066815">Signatura de llista de confiança de Microsoft</translation> <translation id="261114180663074524">Inicia la sessió al teu compte de Microsoft i torna-ho a provar</translation> +<translation id="2611702650078660078">S'ha produït un error</translation> <translation id="2611776654555141051">Eina de rectangle</translation> <translation id="2612676031748830579">Número de targeta</translation> <translation id="261305050785128654">Deixa que els llocs web sàpiguen els idiomes que parles. Quan sigui possible, mostraran el contingut en aquests idiomes.</translation> @@ -2713,6 +2715,7 @@ <translation id="2849936225196189499">Crítica</translation> <translation id="285033512555869047">tancat</translation> <translation id="2850541429955027218">Afegeix el tema</translation> +<translation id="2852045827873867442">Cal tenir connexió a Internet.</translation> <translation id="285237063405807022">(s'està carregant)</translation> <translation id="2853121255651601031">S'ha desat la contrasenya</translation> <translation id="2855243985454069333">Suprimeix l'historial de tots els dispositius sincronitzats</translation> @@ -5424,6 +5427,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplicat</translation> <translation id="4780321648949301421">Anomena i desa la pàgina...</translation> <translation id="4780558987886269159">Per a la feina</translation> +<translation id="4781633367688946589">Continua a la sessió nova</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vol utilitzar informació personal de la teva cartera digital.</translation> <translation id="4785719467058219317">Estàs utilitzant una clau de seguretat que no està registrada en aquest lloc web</translation> <translation id="4785914069240823137">Cancel·la la retallada</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index bda2148e..efee1f3 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -3165,6 +3165,7 @@ <translation id="3188465121994729530">Plovoucí průměr</translation> <translation id="3189187154924005138">Velký kurzor</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 heslo a další položky jsou uložené jen na tomto zařízení. Pokud je chcete používat i na jiných zařízeních, uložte je do svého účtu Google.}few{{PASSWORD_COUNT} hesla a další položky jsou uložené jen na tomto zařízení. Pokud je chcete používat i na jiných zařízeních, uložte je do svého účtu Google.}many{{PASSWORD_COUNT} hesla a další položky jsou uložené jen na tomto zařízení. Pokud je chcete používat i na jiných zařízeních, uložte je do svého účtu Google.}other{{PASSWORD_COUNT} hesel a další položky jsou uložené jen na tomto zařízení. Pokud je chcete používat i na jiných zařízeních, uložte je do svého účtu Google.}}</translation> +<translation id="319044078641740013">Pokud se chcete snadno vracet na navštívené weby, synchronizujte historii a karty do účtu <ph name="ACCOUNT_EMAIL" /></translation> <translation id="3190558889382726167">Heslo uloženo</translation> <translation id="3192586965067888278">Podrobně problém popište. Zpětná vazba bude odeslána společnosti Google ke kontrole člověkem a může být použita ke zlepšení nebo vývoji produktů a služeb Google.</translation> <translation id="3192947282887913208">Zvukové soubory</translation> @@ -3270,6 +3271,7 @@ <translation id="3269689705184377744">{COUNT,plural, =1{Soubor}few{# soubory}many{# souboru}other{# souborů}}</translation> <translation id="326999365752735949">Stahování souboru diff</translation> <translation id="3270965368676314374">Číst, měnit a mazat fotografie, hudbu a další média v počítači</translation> +<translation id="3275464924531706548">Sbalit <ph name="HEADER" /></translation> <translation id="3275778809241512831">Váš interní bezpečnostní klíč momentálně není bezpečný. Odeberte jej ze všech služeb, se kterými jste jej použili. Tento problém vyřešíte tím, že bezpečnostní klíč resetujete.</translation> <translation id="3275778913554317645">Otevřít jako okno</translation> <translation id="3277214528693754078">Navigovat pomocí textového kurzoru (procházení pomocí kurzoru)</translation> @@ -3601,6 +3603,7 @@ <translation id="3510471875518562537">Používejte tuto adresu na svém iPhonu</translation> <translation id="3511200754045804813">Vyhledat znovu</translation> <translation id="3511307672085573050">Kopírovat adr&esu odkazu</translation> +<translation id="3511358375261756531">Rozbalit <ph name="HEADER" /></translation> <translation id="351152300840026870">Písmo s pevnou šířkou</translation> <translation id="3511528412952710609">Krátká</translation> <translation id="3513019849832307207">Přidat se a otevřít</translation> @@ -6150,6 +6153,7 @@ <translation id="5296536303670088158">Máte nejsilnější zabezpečení prohlížeče Chrome proti škodlivým webům</translation> <translation id="5297005732522718715">Obnovit konfiguraci tetheringu</translation> <translation id="5297082477358294722">Heslo bylo uloženo. K zobrazení a správě uložených hesel můžete použít svůj <ph name="SAVED_PASSWORDS_STORE" />.</translation> +<translation id="5297548311167268289">Přihlášení k účtu <ph name="RP_ID" /></translation> <translation id="5297946558563358707">Když se na obrazovku dívá někdo další, zobrazit v pravém dolním rohu obrazovky ikona oka</translation> <translation id="5297984209202974345">Nedávný motiv vygenerovaný umělou inteligencí <ph name="INDEX" /> na téma <ph name="SUBJECT" /> ve stylu <ph name="STYLE" /></translation> <translation id="5298219193514155779">Autor motivu</translation> @@ -10331,6 +10335,7 @@ <translation id="8280848878018088610">Burácející mořské vlny s fantastickým městem a hradem v pozadí, v temné náladě.</translation> <translation id="828180235270931531">Další dostupné tiskárny</translation> <translation id="8281886186245836920">Přeskočit</translation> +<translation id="8283802069507225582">Pokud chcete pokračovat, kde jste skončili na jiných zařízeních, synchronizujte historii a karty do účtu <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8284279544186306258">všechny weby <ph name="WEBSITE_1" /></translation> <translation id="8284326494547611709">Titulky</translation> <translation id="8286036467436129157">Přihlásit se</translation> @@ -11007,6 +11012,7 @@ <translation id="8754200782896249056"><p>Při spuštění aplikace <ph name="PRODUCT_NAME" /> v podporovaném počítačovém prostředí se použijí systémová nastavení proxy serveru. Váš systém však buď není podporován, nebo došlo k problému se spuštěním konfigurace systému.</p> <p>Konfiguraci můžete provést pomocí příkazového řádku. Další informace o příznacích a proměnných prostředí zobrazíte zadáním příkazu: <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> +<translation id="8754810799862630650">Pokud chcete vidět otevřené karty z jiných počítačů a telefonů, synchronizujte historii a karty do účtu <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8755175579224030324">Provádět pro vaši organizaci úlohy týkající se zabezpečení, například spravovat certifikáty a klíče uložené v zařízení</translation> <translation id="875532100880844232">Vyberte akce jednotlivých kláves zařízení <ph name="DEVICE_NAME" /></translation> <translation id="8755376271068075440">Větší</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 3ca8043..9702ab7 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -1174,6 +1174,7 @@ <translation id="1796588414813960292">Ni fydd nodweddion sy'n gofyn am sain yn gweithio</translation> <translation id="1797117170091578105">Chwarae gan ddefnyddio'ch bysellfwrdd Chromebook. Gallwch personoleiddio bysellau i gamau gweithredu penodol.</translation> <translation id="1798335429200675510">De-gliciwch mewn blwch testun i greu drafft neu fireinio gwaith sy'n bodoli eisoes, wedi'i bweru gan AI Google. Argaeledd cyfyngedig ar hyn o bryd.</translation> +<translation id="1799852120691957794">Methu adfer ffenestri o'ch sesiwn flaenorol</translation> <translation id="180203835522132923">Search + O, yna W</translation> <translation id="1802624026913571222">Cysgu pan fydd y gorchudd ar gau</translation> <translation id="1802687198411089702">Nid yw'r dudalen yn ymateb. Gallwch aros amdani neu adael.</translation> @@ -2369,6 +2370,7 @@ <translation id="2610374175948698697">Yn gallu gweld ffeiliau neu ffolderi ar eich dyfais</translation> <translation id="2610780100389066815">Llofnodi Rhestr Ymddiried Microsoft</translation> <translation id="261114180663074524">Mewngofnodwch i'ch cyfrif Microsoft ac yna rhowch gynnig arall arni</translation> +<translation id="2611702650078660078">Bu gwall</translation> <translation id="2611776654555141051">Offeryn Petryal</translation> <translation id="2612676031748830579">Rhif y cerdyn</translation> <translation id="261305050785128654">Rhowch wybod i wefannau am yr ieithoedd rydych yn eu siarad. Byddant yn dangos cynnwys yn yr ieithoedd hynny, pan fo modd.</translation> @@ -2729,6 +2731,7 @@ <translation id="2849936225196189499">Critigol</translation> <translation id="285033512555869047">Wedi cau</translation> <translation id="2850541429955027218">Ychwanegu thema</translation> +<translation id="2852045827873867442">Mae angen cysylltiad rhyngrwyd.</translation> <translation id="285237063405807022">(wrthi'n llwytho)</translation> <translation id="2853121255651601031">Cadwyd y Cyfrinair</translation> <translation id="2855243985454069333">Yn dileu hanes o bob dyfais sydd wedi'i chysoni</translation> @@ -5443,6 +5446,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 tab dyblyg</translation> <translation id="4780321648949301421">Cadw Tudalen Fel...</translation> <translation id="4780558987886269159">Ar gyfer gwaith</translation> +<translation id="4781633367688946589">Parhau i sesiwn newydd</translation> <translation id="4784349455504343791">Mae <ph name="WEBSITE_ORIGIN" /> eisiau defnyddio gwybodaeth bersonol o'ch waled ddigidol.</translation> <translation id="4785719467058219317">Rydych yn defnyddio allwedd ddiogelwch nad yw wedi'i chofrestru gyda'r wefan hon</translation> <translation id="4785914069240823137">Canslo Tocio</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 54890cd..0f492aaa 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1172,6 +1172,7 @@ <translation id="1796588414813960292">Funktioner, der skal bruge lyd, fungerer ikke</translation> <translation id="1797117170091578105">Spil ved hjælp af dit Chromebook-tastatur. Du kan tilpasse taster, så de tildeles bestemte handlinger.</translation> <translation id="1798335429200675510">Højreklik i et tekstfelt for at oprette et udkast eller justere eksisterende tekstarbejde – baseret på Google AI. Tilgængeligheden er begrænset i øjeblikket.</translation> +<translation id="1799852120691957794">Vinduerne fra din forrige session kan ikke gendannes</translation> <translation id="180203835522132923">Søgetasten+O efterfulgt af W</translation> <translation id="1802624026913571222">Gå i dvale, når skærmen er slået ned</translation> <translation id="1802687198411089702">Siden svarer ikke. Du kan vente på den eller afslutte.</translation> @@ -2368,6 +2369,7 @@ <translation id="2610374175948698697">Kan se filer eller mapper på din enhed</translation> <translation id="2610780100389066815">Microsoft-signering af tillidslister</translation> <translation id="261114180663074524">Log ind på din Microsoft-konto, og prøv igen</translation> +<translation id="2611702650078660078">Der opstod en fejl</translation> <translation id="2611776654555141051">Rektangelværktøj</translation> <translation id="2612676031748830579">Kortnummer</translation> <translation id="261305050785128654">Angiv for websites, hvilke sprog du taler. Så viser de indhold på disse sprog, når det er muligt.</translation> @@ -2728,6 +2730,7 @@ <translation id="2849936225196189499">Kritisk</translation> <translation id="285033512555869047">Lukket</translation> <translation id="2850541429955027218">Tilføj tema</translation> +<translation id="2852045827873867442">Dette kræver internetforbindelse.</translation> <translation id="285237063405807022">(indlæser)</translation> <translation id="2853121255651601031">Adgangskoden er blevet gemt</translation> <translation id="2855243985454069333">Sletter historikken fra alle synkroniserede enheder</translation> @@ -5442,6 +5445,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 dublet</translation> <translation id="4780321648949301421">Gem side som...</translation> <translation id="4780558987886269159">Til arbejde</translation> +<translation id="4781633367688946589">Fortsæt til ny session</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vil gerne bruge personlige oplysninger fra din digitale pung.</translation> <translation id="4785719467058219317">Du bruger en sikkerhedsnøgle, som ikke er registreret på dette website</translation> <translation id="4785914069240823137">Annuller beskæring</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 279bcdd..be406bf 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1159,6 +1159,7 @@ <translation id="1796588414813960292">Funktionen, die Ton erfordern, funktionieren dann nicht</translation> <translation id="1797117170091578105">Du kannst zum Spielen deine Chromebook-Tastatur verwenden und Tasten bestimmte Aktionen zuweisen.</translation> <translation id="1798335429200675510">Klicke mit der rechten Maustaste in ein Textfeld, um Vorschläge zu erstellen oder vorhandene Texte zu optimieren, die auf Google AI basieren. Derzeit nur eingeschränkt verfügbar.</translation> +<translation id="1799852120691957794">Fenster aus der vorherigen Sitzung können nicht wiederhergestellt werden</translation> <translation id="180203835522132923">Suchtaste + O, anschließend W</translation> <translation id="1802624026913571222">Beim Zuklappen in den Ruhemodus wechseln</translation> <translation id="1802687198411089702">Die Seite reagiert nicht. Du kannst warten, bis sie wieder reagiert, oder sie schließen.</translation> @@ -2350,6 +2351,7 @@ <translation id="2610374175948698697">Können Dateien und Ordner auf meinem Gerät ansehen</translation> <translation id="2610780100389066815">Microsoft-Vertrauenslistensignatur</translation> <translation id="261114180663074524">Melde dich in deinem Microsoft-Konto an und versuch es dann noch einmal</translation> +<translation id="2611702650078660078">Ein Fehler ist aufgetreten</translation> <translation id="2611776654555141051">Rechtecktool</translation> <translation id="2612676031748830579">Kartennummer</translation> <translation id="261305050785128654">Gib für Websites an, welche Sprachen du sprichst. Sofern möglich, werden Inhalte in diesen Sprachen angezeigt.</translation> @@ -2710,6 +2712,7 @@ <translation id="2849936225196189499">Kritisch</translation> <translation id="285033512555869047">Geschlossen</translation> <translation id="2850541429955027218">Design hinzufügen</translation> +<translation id="2852045827873867442">Eine Internetverbindung ist erforderlich.</translation> <translation id="285237063405807022">(wird geladen)</translation> <translation id="2853121255651601031">Passwort gespeichert</translation> <translation id="2855243985454069333">Löscht den Verlauf auf allen synchronisierten Geräten</translation> @@ -5422,6 +5425,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 Duplikat</translation> <translation id="4780321648949301421">Seite speichern unter...</translation> <translation id="4780558987886269159">Für die Arbeit</translation> +<translation id="4781633367688946589">Mit neuer Sitzung fortfahren</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> möchte personenbezogene Daten aus deinem digitalen Wallet verwenden.</translation> <translation id="4785719467058219317">Du verwendest einen Sicherheitsschlüssel, der nicht auf dieser Website registriert ist</translation> <translation id="4785914069240823137">Zuschneiden abbrechen</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 893586c..8041a5e 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1159,6 +1159,7 @@ <translation id="1796588414813960292">No se habilitarán las funciones que necesitan sonido.</translation> <translation id="1797117170091578105">Juega con el teclado de la Chromebook. Puedes personalizar las teclas para que realicen acciones específicas.</translation> <translation id="1798335429200675510">Haz clic con el botón derecho en el cuadro de texto para crear un borrador o mejorar el trabajo existente con la tecnología de IA de Google. Actualmente tiene disponibilidad limitada.</translation> +<translation id="1799852120691957794">No se pueden restablecer las ventanas de tu sesión anterior</translation> <translation id="180203835522132923">Tecla de búsqueda + O y, luego, W</translation> <translation id="1802624026913571222">Suspender cuando se cierra la tapa</translation> <translation id="1802687198411089702">La página no responde. Puedes esperar o salir.</translation> @@ -2350,6 +2351,7 @@ <translation id="2610374175948698697">Pueden ver archivos o carpetas del dispositivo</translation> <translation id="2610780100389066815">Firma de lista de confianza de Microsoft</translation> <translation id="261114180663074524">Accede a tu cuenta de Microsoft y vuelve a intentarlo</translation> +<translation id="2611702650078660078">Se produjo un error</translation> <translation id="2611776654555141051">Herramienta de rectángulo</translation> <translation id="2612676031748830579">Número de tarjeta</translation> <translation id="261305050785128654">Permite que los sitios web sepan los idiomas en los que hablas. De ser posible, los sitios mostrarán contenido en esos idiomas.</translation> @@ -2710,6 +2712,7 @@ <translation id="2849936225196189499">Crítico</translation> <translation id="285033512555869047">Cerrado</translation> <translation id="2850541429955027218">Agregar tema</translation> +<translation id="2852045827873867442">Se requiere una conexión a Internet.</translation> <translation id="285237063405807022">(cargando)</translation> <translation id="2853121255651601031">Se guardó la contraseña</translation> <translation id="2855243985454069333">Borra el historial de todos los dispositivos sincronizados</translation> @@ -3162,6 +3165,7 @@ <translation id="3188465121994729530">Promedio móvil</translation> <translation id="3189187154924005138">Cursor grande</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 contraseña y otros elementos se guardan solo en este dispositivo. Para usarlos en tus otros dispositivos, guárdalos en tu Cuenta de Google.}other{{PASSWORD_COUNT} contraseñas y otros elementos se guardan solo en este dispositivo. Para usarlos en tus otros dispositivos, guárdalos en tu Cuenta de Google.}}</translation> +<translation id="319044078641740013">Para volver fácilmente a los sitios que visitaste, sincroniza tu historial y tus pestañas con <ph name="ACCOUNT_EMAIL" /></translation> <translation id="3190558889382726167">Se guardó la contraseña</translation> <translation id="3192586965067888278">Describe el error de forma detallada. Se enviarán los comentarios a Google para su revisión humana y podrán usarse para mejorar o desarrollar productos y servicios de Google.</translation> <translation id="3192947282887913208">Archivos de audio</translation> @@ -5423,6 +5427,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplicado</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4780558987886269159">Para el trabajo</translation> +<translation id="4781633367688946589">Continuar a la nueva sesión</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> quiere usar información personal de tu billetera digital.</translation> <translation id="4785719467058219317">Estás usando una llave de seguridad que no se registró con este sitio web</translation> <translation id="4785914069240823137">Cancelar recorte</translation> @@ -10334,6 +10339,7 @@ <translation id="8280848878018088610">Olas rompiendo en el mar, con una ciudad fantástica y un castillo en el fondo, en un ambiente oscuro.</translation> <translation id="828180235270931531">Otras impresoras disponibles</translation> <translation id="8281886186245836920">Omitir</translation> +<translation id="8283802069507225582">Para retomar tu actividad desde donde la dejaste en otros dispositivos, sincroniza tu historial y tus pestañas con <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8284279544186306258">todos los sitios de <ph name="WEBSITE_1" /></translation> <translation id="8284326494547611709">Subtítulos</translation> <translation id="8286036467436129157">Acceder</translation> @@ -11011,6 +11017,7 @@ <translation id="8754200782896249056"><p>Al ejecutar <ph name="PRODUCT_NAME" /> en un entorno admitido de escritorio, se utiliza la configuración proxy del sistema. Sin embargo, o bien el sistema no es admitido, o hubo un problema al lanzar la configuración del sistema.</p> <p>Aún puedes establecer la configuración mediante la línea de comando. Consulta <code>man <ph name="PRODUCT_BINARY_NAME" /></code> para obtener más información sobre etiquetas y variables del entorno.</p></translation> +<translation id="8754810799862630650">Para ver las pestañas abiertas de tus otras computadoras y teléfonos, sincroniza el historial y las pestañas con <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8755175579224030324">Realizar tareas de seguridad para tu organización, como administrar las claves y los certificados almacenados en el dispositivo</translation> <translation id="875532100880844232">Para <ph name="DEVICE_NAME" />, elige una acción para cada tecla</translation> <translation id="8755376271068075440">&Mayor</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index ae0df2d..07b0fea 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1162,6 +1162,7 @@ <translation id="1796588414813960292">Las funciones que requieran reproducir sonido no funcionarán</translation> <translation id="1797117170091578105">Juega con el teclado de tu Chromebook. Puedes personalizar teclas con acciones específicas.</translation> <translation id="1798335429200675510">Haz clic con el botón derecho en un cuadro de texto para crear un borrador o perfeccionar un trabajo ya creado, con la tecnología de la IA de Google. Actualmente tiene disponibilidad limitada.</translation> +<translation id="1799852120691957794">No se pueden restaurar las ventanas de tu sesión anterior</translation> <translation id="180203835522132923">Tecla de búsqueda + O y, después, W</translation> <translation id="1802624026913571222">Suspender cuando se cierre la tapa</translation> <translation id="1802687198411089702">La página no responde. Puedes esperar a que lo haga o cerrarla.</translation> @@ -2354,6 +2355,7 @@ <translation id="2610374175948698697">Puede ver archivos o carpetas de tu dispositivo</translation> <translation id="2610780100389066815">Firma de listas de confianza de Microsoft</translation> <translation id="261114180663074524">Inicia sesión en tu cuenta de Microsoft y vuelve a intentarlo</translation> +<translation id="2611702650078660078">Se ha producido un error</translation> <translation id="2611776654555141051">Herramienta de rectángulo</translation> <translation id="2612676031748830579">Número de la tarjeta</translation> <translation id="261305050785128654">Permite que los sitios web sepan los idiomas que hablas. Si es posible, mostrarán contenido en esos idiomas.</translation> @@ -2714,6 +2716,7 @@ <translation id="2849936225196189499">Crítica</translation> <translation id="285033512555869047">Cerrado</translation> <translation id="2850541429955027218">Añadir tema</translation> +<translation id="2852045827873867442">Se necesita conexión a Internet.</translation> <translation id="285237063405807022">(cargando)</translation> <translation id="2853121255651601031">Contraseña guardada</translation> <translation id="2855243985454069333">Elimina el historial de todos los dispositivos sincronizados</translation> @@ -5427,6 +5430,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplicado</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4780558987886269159">Para el trabajo</translation> +<translation id="4781633367688946589">Continuar a una nueva sesión</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> quiere usar información personal de tu cartera digital.</translation> <translation id="4785719467058219317">Estás usando una llave de seguridad que no se ha registrado en este sitio web</translation> <translation id="4785914069240823137">Cancelar recorte</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index daab8f9..495739c9 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1163,6 +1163,7 @@ <translation id="1796588414813960292">Heli vajavad funktsioonid ei tööta</translation> <translation id="1797117170091578105">Mängige oma Chromebooki klaviatuuri kasutades. Saate klahvidele konkreetsed toimingud määrata.</translation> <translation id="1798335429200675510">Paremklikkige tekstikastis, et luua mustand või viimistleda olemasolevat tööd (toimib Google'i AI platvormil). See on hetkel piiratud saadavusega.</translation> +<translation id="1799852120691957794">Eelmise seansi aknaid ei saa taastada</translation> <translation id="180203835522132923">Otsinguklahv + O, seejärel W</translation> <translation id="1802624026913571222">Lülita unerežiimi, kui kaas on suletud</translation> <translation id="1802687198411089702">Leht ei reageeri. Võite oodata või väljuda.</translation> @@ -2357,6 +2358,7 @@ <translation id="2610374175948698697">Võivad teie seadmes faile ja kaustu vaadata</translation> <translation id="2610780100389066815">Microsoft Trusti loendi signeerimine</translation> <translation id="261114180663074524">Logige sisse oma Microsofti kontole ja proovige uuesti</translation> +<translation id="2611702650078660078">Ilmnes viga</translation> <translation id="2611776654555141051">Nelinurgatööriist</translation> <translation id="2612676031748830579">Kaardi number</translation> <translation id="261305050785128654">Andke veebisaitidele teada, milliseid keeli te räägite. Võimaluse korral kuvatakse sisu nendes keeltes.</translation> @@ -2717,6 +2719,7 @@ <translation id="2849936225196189499">Kriitiline</translation> <translation id="285033512555869047">Suletud</translation> <translation id="2850541429955027218">Lisa teema</translation> +<translation id="2852045827873867442">Vaja on internetiühendust.</translation> <translation id="285237063405807022">(laadimine)</translation> <translation id="2853121255651601031">Parool salvestati</translation> <translation id="2855243985454069333">Kustutab ajaloo kõigist sünkroonitud seadmetest</translation> @@ -5431,6 +5434,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplikaat</translation> <translation id="4780321648949301421">Salvesta leht &nimega...</translation> <translation id="4780558987886269159">Töö jaoks</translation> +<translation id="4781633367688946589">Jätka uues seansis</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> soovib kasutada teie digitaalsest rahakotist pärinevat isiklikku teavet.</translation> <translation id="4785719467058219317">Kasutate turvavõtit, mis ei ole sellel veebisaidil registreeritud</translation> <translation id="4785914069240823137">Kärpimisest loobumine</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index bdad716..f9ffe93 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -3163,6 +3163,7 @@ <translation id="3188465121994729530">Batez besteko mugimendua</translation> <translation id="3189187154924005138">Kurtsore handia</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 pasahitz eta beste elementu batzuk gailu honetan soilik gordeta daude. Beste gailuetan erabiltzeko, gorde itzazu Google-ko kontuan.}other{{PASSWORD_COUNT} pasahitz eta beste elementu batzuk gailu honetan soilik gordeta daude. Beste gailuetan erabiltzeko, gorde itzazu Google-ko kontuan.}}</translation> +<translation id="319044078641740013">Bisitatutako webguneetara erraz itzultzeko, sinkronizatu zure historia eta fitxak <ph name="ACCOUNT_EMAIL" /> kontuarekin</translation> <translation id="3190558889382726167">Gorde da pasahitza</translation> <translation id="3192586965067888278">Azaldu arazoa xehetasun osoz. Oharrak Google-ri bidaliko zaizkio gizaki batek berrikusteko, eta baliteke Google-ren produktuak eta zerbitzuak hobetzeko erabiltzea.</translation> <translation id="3192947282887913208">Audio-fitxategiak</translation> @@ -10327,6 +10328,7 @@ <translation id="8280848878018088610">Itsaso harrotua, estilo ilunean, atzeko planoan fantasiazko hiri bat eta gaztelu bat ikusten direla.</translation> <translation id="828180235270931531">Erabilgarri dauden beste inprimagailu batzuk</translation> <translation id="8281886186245836920">Saltatu</translation> +<translation id="8283802069507225582">Beste gailuetan utzitako tokitik jarraitzeko, sinkronizatu zure historia eta fitxak <ph name="ACCOUNT_EMAIL" /> kontuarekin</translation> <translation id="8284279544186306258"><ph name="WEBSITE_1" /> webguneak.</translation> <translation id="8284326494547611709">Azpitituluak</translation> <translation id="8286036467436129157">Hasi saioa</translation> @@ -11004,6 +11006,7 @@ <translation id="8754200782896249056"><p>Ordenagailu-ingurune bateragarri batean <ph name="PRODUCT_NAME" /> abiarazten duzunean, sistemaren proxy-ezarpenak erabiliko dira. Dena den, zure sistema ez da bateragarria edo arazo bat izan da sistemaren konfigurazioa kargatzean.</p> <p>Hala ere, agindu-lerroaren bidez konfigura dezakezu. Etengailuei eta ingurune-aldagaiei buruzko informazio gehiago lortzeko, ikusi <code>man <ph name="PRODUCT_BINARY_NAME" /></code>.</p></translation> +<translation id="8754810799862630650">Zure beste ordenagailu eta mugikorretan irekita dauzkazun fitxak ikusteko, sinkronizatu zure historia eta fitxak <ph name="ACCOUNT_EMAIL" /> kontuarekin</translation> <translation id="8755175579224030324">Erakundean segurtasunari lotutako zereginak gauzatu, hala nola gailuan gordetako ziurtagirien eta gakoen kudeaketa.</translation> <translation id="875532100880844232"><ph name="DEVICE_NAME" /> gailuan, hautatu tekla bakoitzaren ekintza</translation> <translation id="8755376271068075440">&Handiagoa</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 3cd17e3..dec4ec7ac 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1170,6 +1170,7 @@ <translation id="1796588414813960292">Ääntä edellyttävät ominaisuudet eivät enää toimi</translation> <translation id="1797117170091578105">Pelaa Chromebookin näppäimistöllä. Voit määrittää näppäimiä tietyille toiminnoille.</translation> <translation id="1798335429200675510">Klikkaa tekstikenttää kakkospainikkeella, niin voit kirjoittaa luonnoksen tai viimeistellä aiemmin luodun tehtävän Googlen tekoälyn avulla. Saatavuus on tällä hetkellä rajoitettu.</translation> +<translation id="1799852120691957794">Edellisen istunnon ikkunoita ei voi palauttaa</translation> <translation id="180203835522132923">Haku + O ja sitten W</translation> <translation id="1802624026913571222">Lepotila, kun kansi suljetaan</translation> <translation id="1802687198411089702">Tämä sivu ei vastaa. Voit odottaa sitä tai sulkea sen.</translation> @@ -2365,6 +2366,7 @@ <translation id="2610374175948698697">Saa nähdä laitteesi tiedostot tai kansiot</translation> <translation id="2610780100389066815">Microsoft-luottamusluettelon allekirjoitus</translation> <translation id="261114180663074524">Kirjaudu Microsoft-tilille ja yritä uudelleen</translation> +<translation id="2611702650078660078">Tapahtui virhe</translation> <translation id="2611776654555141051">Suorakulmiotyökalu</translation> <translation id="2612676031748830579">Kortin numero</translation> <translation id="261305050785128654">Kerro sivustoille, mitä kieliä osaat. Ne näyttävät mahdollisuuksien mukaan sisältöä kyseisillä kielillä.</translation> @@ -2725,6 +2727,7 @@ <translation id="2849936225196189499">Kriittinen</translation> <translation id="285033512555869047">Suljettu</translation> <translation id="2850541429955027218">Lisää teema</translation> +<translation id="2852045827873867442">Edellyttää internetyhteyttä.</translation> <translation id="285237063405807022">(ladataan)</translation> <translation id="2853121255651601031">Salasana tallennettu</translation> <translation id="2855243985454069333">Poistaa kaikkien synkronoitujen laitteiden historian</translation> @@ -5436,6 +5439,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 kopio</translation> <translation id="4780321648949301421">Tallenna sivu nimellä...</translation> <translation id="4780558987886269159">Työntekoon</translation> +<translation id="4781633367688946589">Jatka uuteen istuntoon</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> haluaa käyttää henkilökohtaisia tietoja digitaalisesta lompakostasi.</translation> <translation id="4785719467058219317">Käytät suojausavainta, jota ei ole rekisteröity tällä sivustolla.</translation> <translation id="4785914069240823137">Peru rajaus</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 44f6089..b8d16ad 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1159,6 +1159,7 @@ <translation id="1796588414813960292">સાઉન્ડની આવશ્યકતા હોય તેવી સુવિધાઓ કામ કરશે નહીં</translation> <translation id="1797117170091578105">તમારા Chromebook કીબોર્ડનો ઉપયોગ કરીને રમો. તમે ચોક્કસ ક્રિયાઓ માટે કી કસ્ટમાઇઝ કરી શકો છો.</translation> <translation id="1798335429200675510">Google AI દ્વારા સંચાલિત, ડ્રાફ્ટ બનાવ અથવા હાલના લખાણને સુધારવા માટે, ટેક્સ્ટ બૉક્સમાં રાઇટ ક્લિક કરો. હાલમાં મર્યાદિત ઉપલબ્ધતા છે.</translation> +<translation id="1799852120691957794">તમારા અગાઉના સત્રમાંની વિન્ડો રિસ્ટોર કરી શકતા નથી</translation> <translation id="180203835522132923">Search + O, પછી W</translation> <translation id="1802624026913571222">કવર બંધ કરવામાં આવે ત્યારે નિષ્ક્રિય કરો</translation> <translation id="1802687198411089702">પેજ પ્રતિસાદ આપી રહ્યું નથી. તમે તેની રાહ જોઈ શકો છો અથવા બહાર નીકળી શકો છો.</translation> @@ -2351,6 +2352,7 @@ <translation id="2610374175948698697">તમારા ડિવાઇસમાંની ફાઇલો અથવા ફોલ્ડરો જોઈ શકે છે</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">તમારા Microsoft એકાઉન્ટમાં સાઇન ઇન કરો અને પછી ફરી પ્રયાસ કરો</translation> +<translation id="2611702650078660078">ભૂલ આવી છે</translation> <translation id="2611776654555141051">લંબચોરસ ટૂલ</translation> <translation id="2612676031748830579">કાર્ડ નંબર</translation> <translation id="261305050785128654">તમે જે ભાષાઓ બોલો છો તે વેબસાઇટને જણાવો. જ્યારે શક્ય હશે ત્યારે તેઓ તે ભાષાઓમાં કન્ટેન્ટ બતાવશે.</translation> @@ -2711,6 +2713,7 @@ <translation id="2849936225196189499">ટીકાત્મક</translation> <translation id="285033512555869047">બંધ</translation> <translation id="2850541429955027218">થીમ ઉમેરો</translation> +<translation id="2852045827873867442">ઇન્ટરનેટ કનેક્શન આવશ્યક છે.</translation> <translation id="285237063405807022">(લોડ કરી રહ્યાં છીએ)</translation> <translation id="2853121255651601031">પાસવર્ડ સાચવ્યો</translation> <translation id="2855243985454069333">સિંક કરેલા બધા ડિવાઇસમાંથી ઇતિહાસ ડિલીટ કરે છે</translation> @@ -5425,6 +5428,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 ડુપ્લિકેટ</translation> <translation id="4780321648949301421">પેજ આ રીતે સાચવો...</translation> <translation id="4780558987886269159">ઑફિસ માટે</translation> +<translation id="4781633367688946589">નવા સત્રમાં આગળ વધો</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> તમારા ડિજિટલ વૉલેટમાંથી વ્યક્તિગત માહિતીનો ઉપયોગ કરવા માગે છે.</translation> <translation id="4785719467058219317">તમે આ વેબસાઇટમાં રજિસ્ટર ન થયેલા સુરક્ષા કોડનો ઉપયોગ કરી રહ્યા છો</translation> <translation id="4785914069240823137">કાપવાનું રદ કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 27d437e2..181956a 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -170,7 +170,7 @@ <translation id="1112998165730922436">कास्ट करने की प्रोसेस रोकी गई</translation> <translation id="1114102982691049955"><ph name="PRINTER_MANUFACTURER" /> <ph name="PRINTER_MODEL" /> (USB)</translation> <translation id="1114202307280046356">डायमंड</translation> -<translation id="1114525161406758033">लिड बंद होने पर सुलाएं (कम बैटरी मोड)</translation> +<translation id="1114525161406758033">लिड बंद होने पर स्लीप मोड चालू करें</translation> <translation id="1116639326869298217">आपकी पहचान की पुष्टि नहीं की जा सकी</translation> <translation id="1116694919640316211">इसके बारे में</translation> <translation id="1116779635164066733">यह सेटिंग "<ph name="NAME" />" एक्सटेंशन के ज़रिए लागू की गई है.</translation> @@ -1172,6 +1172,7 @@ <translation id="1796588414813960292">वे सुविधाएं काम नहीं करेंगी जिन्हें आवाज़ की ज़रूरत है</translation> <translation id="1797117170091578105">अपने Chromebook के कीबोर्ड की मदद से चलाएं. कीबोर्ड की कुंजियों को अपनी पसंद के मुताबिक, खास कार्रवाइयों के लिए सेट किया जा सकता है.</translation> <translation id="1798335429200675510">Google के एआई की मदद से, ड्राफ़्ट बनाने या मौजूदा काम को बेहतर बनाने के लिए, टेक्स्ट बॉक्स में राइट क्लिक करें. फ़िलहाल, यह सुविधा सीमित तौर पर उपलब्ध है.</translation> +<translation id="1799852120691957794">आपके पिछले सेशन वाली विंडो वापस नहीं लाई जा सकतीं</translation> <translation id="180203835522132923">Search + O, फिर W</translation> <translation id="1802624026913571222">लिड बंद होने पर स्लीप मोड चालू करें</translation> <translation id="1802687198411089702">पेज काम नहीं कर रहा है. आप इंतज़ार कर सकते हैं या बाहर निकल सकते हैं.</translation> @@ -2367,6 +2368,7 @@ <translation id="2610374175948698697">आपके डिवाइस पर, इन फ़ाइलों या फ़ोल्डर को देखने की अनुमति है</translation> <translation id="2610780100389066815">Microsoft विश्वास सूची हस्ताक्षर</translation> <translation id="261114180663074524">अपने Microsoft खाते में साइन इन करें और फिर से कोशिश करें</translation> +<translation id="2611702650078660078">कोई गड़बड़ी हुई</translation> <translation id="2611776654555141051">आयत बनाने का टूल</translation> <translation id="2612676031748830579">कार्ड नंबर</translation> <translation id="261305050785128654">वेबसाइटों को अपनी भाषा की जानकारी दें. इससे, जब भी मुमकिन होगा साइटें इन भाषाओं में कॉन्टेंट दिखाएंगी.</translation> @@ -2727,6 +2729,7 @@ <translation id="2849936225196189499">महत्वपूर्ण</translation> <translation id="285033512555869047">बंद हो गया है</translation> <translation id="2850541429955027218">थीम जोड़ें</translation> +<translation id="2852045827873867442">इंटरनेट कनेक्शन होना ज़रूरी है.</translation> <translation id="285237063405807022">(लोड हो रहा है)</translation> <translation id="2853121255651601031">पासवर्ड सेव किया गया</translation> <translation id="2855243985454069333">सिंक किए गए सभी डिवाइसों से ब्राउज़िंग इतिहास मिटा देता है</translation> @@ -5440,6 +5443,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 डुप्लीकेट</translation> <translation id="4780321648949301421">पेज को इस रूप में सेव करें...</translation> <translation id="4780558987886269159">काम के लिए</translation> +<translation id="4781633367688946589">नए सेशन में जारी रखें</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> को आपके डिजिटल वॉलेट से निजी जानकारी इस्तेमाल करनी है.</translation> <translation id="4785719467058219317">आप एक ऐसी 'सुरक्षा चाबी' इस्तेमाल कर रहे हैं जिसे इस वेबसाइट पर रजिस्टर नहीं किया गया है</translation> <translation id="4785914069240823137">कांट-छांट को रद्द करें</translation> @@ -6880,7 +6884,7 @@ <translation id="583281660410589416">अज्ञात</translation> <translation id="5832970156002835240">सभी साइटों पर अनुमति दें</translation> <translation id="5833397272224757657">आप जिन साइटों पर जाते हैं उनकी सामग्री के साथ ही ब्राउज़र गतिविधि और इंटरैक्शन का इस्तेमाल आपके मनमुताबिक बनाने के लिए करता है</translation> -<translation id="5833726373896279253">ये सेटिंग केवल मालिक द्वारा ही संशोधित की जा सकती हैं:</translation> +<translation id="5833726373896279253">इन सेटिंग को सिर्फ़ मालिक खाते से बदला जा सकता है:</translation> <translation id="5833746798680181492"><ph name="ALREADY_ASSIGNED_MESSAGE" /> <ph name="CONFLICTING_GESTURES_MESSAGE" /></translation> <translation id="5833899990800318936">साइटों को JavaScript इस्तेमाल करने की अनुमति न दें</translation> <translation id="583431638776747">साइट को ऐक्सेस नहीं किया जा सका</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index c45d52b..c63a914 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -5166,6 +5166,7 @@ <translation id="4585793705637313973">Uredi stranicu</translation> <translation id="4586275095964870617">URL <ph name="URL" /> nije moguće otvoriti u zamjenskom pregledniku. Obratite se administratoru sustava.</translation> <translation id="4587589328781138893">Web-lokacije</translation> +<translation id="4588497044036650559">Otvaranje stranice opcija proširenja stranice nove kartice u trenutačnoj kartici</translation> <translation id="4588749726511456218">Ubrzanje pomicanja <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="4589197033939192905">Čini se da su domene <ph name="PASSWORD_DOMAIN" /> i <ph name="DOMAIN" /> povezane. Prije nego što upotrijebite zaporku, provjerite je li domena <ph name="DOMAIN" /> pouzdana.</translation> <translation id="4589713469967853491">Zapisnici su uspješno zabilježeni u direktorij Preuzimanja.</translation> @@ -9142,6 +9143,7 @@ <translation id="7461924472993315131">Prikvači</translation> <translation id="746216226901520237">Sljedeći će put vaš telefon otključati vaš uređaj <ph name="DEVICE_TYPE" />. Smart Lock možete isključiti u Postavkama.</translation> <translation id="746329643760972486">MacOS</translation> +<translation id="7463985990119325874">Vaša organizacija upravlja načinom na koji se podaci koje prikupljaju ove značajke mogu upotrebljavati.</translation> <translation id="7464645554245611385">Posljednje ažuriranje ove kartice</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# otvorena kartica, pritisnite da biste uključili ili isključili vrpcu kartica}one{# otvorena kartica, pritisnite da biste uključili ili isključili vrpcu kartica}few{# otvorene kartice, pritisnite da biste uključili ili isključili vrpcu kartica}other{# otvorenih kartica, pritisnite da biste uključili ili isključili vrpcu kartica}}</translation> <translation id="7465635034594602553">Nešto nije u redu. Pričekajte nekoliko minuta, a zatim ponovo pokrenite <ph name="APP_NAME" />.</translation> @@ -11707,6 +11709,7 @@ <translation id="934244546219308557">Postavite naziv grupe</translation> <translation id="93480724622239549">Programska ili neka druga pogreška</translation> <translation id="9354763467503131">Dopušteno je tražiti instaliranje web-aplikacija na uređaju</translation> +<translation id="936329857119665832">Otvara se u trenutačnoj kartici</translation> <translation id="936646668635477464">Fotoaparat i mikrofon</translation> <translation id="936801553271523408">Podaci o dijagnozi sustava</translation> <translation id="93766956588638423">Popravi proširenje</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 43cabb1..59329f62 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -3165,6 +3165,7 @@ <translation id="3188465121994729530">Սահող միջին</translation> <translation id="3189187154924005138">Մեծ նշորդ</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 գաղտնաբառ և այլ տարրեր պահվում են միայն այս սարքում։ Մյուս սարքերում օգտագործելու համար պահեք դրանք ձեր Google հաշվում։}one{{PASSWORD_COUNT} գաղտնաբառ և այլ տարրեր պահվում են միայն այս սարքում։ Մյուս սարքերում օգտագործելու համար պահեք դրանք ձեր Google հաշվում։}other{{PASSWORD_COUNT} գաղտնաբառ և այլ տարրեր պահվում են միայն այս սարքում։ Մյուս սարքերում օգտագործելու համար պահեք դրանք ձեր Google հաշվում։}}</translation> +<translation id="319044078641740013">Համաժամացրեք ձեր պատմությունը և ներդիրները <ph name="ACCOUNT_EMAIL" /> հաշվում, որպեսզի հեշտությամբ վերադառնաք ձեր այցելած կայքեր</translation> <translation id="3190558889382726167">Գաղտնաբառը պահվեց</translation> <translation id="3192586965067888278">Մանրամասն նկարագրեք խնդիրը։ Կարծիքը կուղարկվի Google-ին՝ մասնագետի կողմից ստուգման համար, և կարող է օգտագործվել Google-ի պրոդուկտներն ու ծառայությունները բարելավելու կամ նորերը ստեղծելու նպատակով։</translation> <translation id="3192947282887913208">Աուդիո ֆայլեր</translation> @@ -10330,6 +10331,7 @@ <translation id="8280848878018088610">Ալեկոծված ծովի ալիքները՝ մռայլ ու ֆանտաստիկ քաղաքի և ամրոցի ֆոնին։</translation> <translation id="828180235270931531">Այլ հասանելի տպիչներ</translation> <translation id="8281886186245836920">Բաց թողնել</translation> +<translation id="8283802069507225582">Համաժամացրեք ձեր պատմությունը և ներդիրները <ph name="ACCOUNT_EMAIL" /> հաշվում, որպեսզի այլ սարքերում շարունակեք այնտեղից, որտեղ կանգ էիք առել</translation> <translation id="8284279544186306258">բոլոր <ph name="WEBSITE_1" /> կայքերը</translation> <translation id="8284326494547611709">Ենթագրեր</translation> <translation id="8286036467436129157">Մուտք գործել</translation> @@ -11007,6 +11009,7 @@ <translation id="8754200782896249056"><p><ph name="PRODUCT_NAME" />-ը աջակցվող աշխատասեղանի միջավայրում գործարկելիս՝ կօգտագործվեն պրոքսի-սերվերի համակարգի կարգավորումները: Սակայն, կամ ձեր համակարգը չի աջակցվում, կամ համակարգի կազմաձևումները չի հաջողվում գործարկել:</p> <p>Այնուամենայնիվ, դուք կարող եք կատարել կազմաձևումը հրամանատողի միջոցով: Դրոշների և միջավայրի փոփոխականների մասին լրացուցիչ տեղեկությունների համար ծանոթացեք <code>man <ph name="PRODUCT_BINARY_NAME" /></code> կոդին:</p></translation> +<translation id="8754810799862630650">Համաժամացրեք ձեր պատմությունը և ներդիրները <ph name="ACCOUNT_EMAIL" /> հաշվում, որպեսզի տեսնեք ձեր մյուս համակարգիչներում և հեռախոսներում բացված ներդիրները</translation> <translation id="8755175579224030324">Ձեր կազմակերպության համար կատարել անվտանգությանն առնչվող առաջադրանքներ, օրինակ՝ հավաստագրերի և սարքում պահված բանալիների կառավարում</translation> <translation id="875532100880844232"><ph name="DEVICE_NAME" /> լրասարքի համար ընտրեք յուրաքանչյուր ստեղնի գործողությունը</translation> <translation id="8755376271068075440">&Ավելի մեծ</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 5cd04b9b..b24d8a6c 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1171,6 +1171,7 @@ <translation id="1796588414813960292">Fitur yang memerlukan suara tidak akan berfungsi</translation> <translation id="1797117170091578105">Mainkan dengan keyboard Chromebook. Anda dapat menyesuaikan tombol untuk tindakan tertentu.</translation> <translation id="1798335429200675510">Klik kanan di kotak teks untuk membuat draf atau memperbaiki pekerjaan yang ada, didukung teknologi AI Google. Saat ini ketersediaannya terbatas.</translation> +<translation id="1799852120691957794">Tidak dapat memulihkan jendela dari sesi sebelumnya</translation> <translation id="180203835522132923">Search + O, lalu W</translation> <translation id="1802624026913571222">Tidur saat cover ditutup</translation> <translation id="1802687198411089702">Halaman tidak merespons. Anda dapat menunggunya atau keluar.</translation> @@ -2366,6 +2367,7 @@ <translation id="2610374175948698697">Dapat melihat file atau folder di perangkat Anda</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Login ke akun Microsoft, lalu coba lagi</translation> +<translation id="2611702650078660078">Terjadi error</translation> <translation id="2611776654555141051">Alat Kotak</translation> <translation id="2612676031748830579">Nomor kartu</translation> <translation id="261305050785128654">Izinkan situs mengetahui bahasa yang Anda gunakan. Situs akan menampilkan konten dalam bahasa tersebut, jika memungkinkan.</translation> @@ -2726,6 +2728,7 @@ <translation id="2849936225196189499">Kritis</translation> <translation id="285033512555869047">Ditutup</translation> <translation id="2850541429955027218">Tambahkan tema</translation> +<translation id="2852045827873867442">Memerlukan koneksi internet.</translation> <translation id="285237063405807022">(memuat)</translation> <translation id="2853121255651601031">Sandi Sudah Disimpan</translation> <translation id="2855243985454069333">Menghapus histori dari semua perangkat yang disinkronkan</translation> @@ -5440,6 +5443,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplikat</translation> <translation id="4780321648949301421">Simpan Halaman Sebagai...</translation> <translation id="4780558987886269159">Untuk bekerja</translation> +<translation id="4781633367688946589">Lanjutkan ke sesi baru</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ingin menggunakan info pribadi dari dompet digital Anda.</translation> <translation id="4785719467058219317">Anda menggunakan kunci keamanan yang tidak terdaftar di situs ini</translation> <translation id="4785914069240823137">Batalkan Pemangkasan</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index cf0d258..c8da518 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -3168,6 +3168,7 @@ <translation id="3188465121994729530">Media spostamento</translation> <translation id="3189187154924005138">Puntatore grande</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 password e altri elementi sono salvati solo su questo dispositivo. Per usarli sugli altri dispositivi, salvali nel tuo Account Google.}other{{PASSWORD_COUNT} password e altri elementi sono salvati solo su questo dispositivo. Per usarli sugli altri dispositivi, salvali nel tuo Account Google.}}</translation> +<translation id="319044078641740013">Per tornare facilmente ai siti che hai visitato, sincronizza la cronologia e le schede con <ph name="ACCOUNT_EMAIL" /></translation> <translation id="3190558889382726167">Password salvata</translation> <translation id="3192586965067888278">Descrivi il problema in modo dettagliato. Il feedback verrà inviato a Google per la revisione umana e potrebbe essere utilizzato per migliorare o sviluppare i prodotti e i servizi Google.</translation> <translation id="3192947282887913208">File audio</translation> @@ -3273,6 +3274,7 @@ <translation id="3269689705184377744">{COUNT,plural, =1{File}other{# file}}</translation> <translation id="326999365752735949">Download delle differenze in corso...</translation> <translation id="3270965368676314374">Leggere, modificare ed eliminare foto, musica e altri contenuti multimediali del computer</translation> +<translation id="3275464924531706548">Comprimi <ph name="HEADER" /></translation> <translation id="3275778809241512831">Il tuo token di sicurezza interno al momento non è sicuro. Rimuovilo dai servizi con cui l'hai utilizzato. Per risolvere il problema, reimposta il token di sicurezza.</translation> <translation id="3275778913554317645">Apri come finestra</translation> <translation id="3277214528693754078">Naviga con il cursore di testo (navigazione con cursore)</translation> @@ -3604,6 +3606,7 @@ <translation id="3510471875518562537">Usa questo indirizzo sul tuo iPhone</translation> <translation id="3511200754045804813">Ripeti scansione</translation> <translation id="3511307672085573050">Copia indir&izzo link</translation> +<translation id="3511358375261756531">Espandi <ph name="HEADER" /></translation> <translation id="351152300840026870">Carattere a larghezza fissa</translation> <translation id="3511528412952710609">Breve</translation> <translation id="3513019849832307207">Entra e apri</translation> @@ -6156,6 +6159,7 @@ <translation id="5296536303670088158">Disponi della misura di sicurezza più efficace di Chrome contro siti web pericolosi</translation> <translation id="5297005732522718715">Aggiorna configurazione tethering</translation> <translation id="5297082477358294722">Password salvata. Visualizza e gestisci le password salvate in <ph name="SAVED_PASSWORDS_STORE" />.</translation> +<translation id="5297548311167268289">Accedi a <ph name="RP_ID" /></translation> <translation id="5297946558563358707">Quando qualcuno osserva il tuo schermo, mostra l'icona Privacy a forma di occhio nell'angolo inferiore destro dello schermo</translation> <translation id="5297984209202974345">Tema IA recente <ph name="INDEX" /> di <ph name="SUBJECT" />, in stile <ph name="STYLE" /></translation> <translation id="5298219193514155779">Tema creato da</translation> @@ -10334,6 +10338,7 @@ <translation id="8280848878018088610">Onde che si infrangono in mare, con una città fantastica e un castello sullo sfondo, in un'atmosfera cupa.</translation> <translation id="828180235270931531">Altre stampanti disponibili</translation> <translation id="8281886186245836920">Salta</translation> +<translation id="8283802069507225582">Per riprendere da dove avevi interrotto su altri dispositivi, sincronizza la cronologia e le schede con <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8284279544186306258">tutti i siti <ph name="WEBSITE_1" /></translation> <translation id="8284326494547611709">Sottotitoli codificati</translation> <translation id="8286036467436129157">Accedi</translation> @@ -11011,6 +11016,7 @@ <translation id="8754200782896249056"><p>Quando esegui <ph name="PRODUCT_NAME" /> in un ambiente desktop supportato, vengono utilizzate le impostazioni proxy del sistema. Tuttavia, il tuo sistema non è supportato o si è verificato un problema durante l'avvio della tua configurazione di sistema.</p> <p>Puoi comunque eseguire la configurazione tramite la riga di comando. Consulta <code>man <ph name="PRODUCT_BINARY_NAME" /></code> per avere ulteriori informazioni su contrassegni e variabili di ambiente.</p></translation> +<translation id="8754810799862630650">Per vedere le schede aperte dagli altri computer e smartphone, sincronizza la cronologia e le schede con <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8755175579224030324">Svolgimento di attività relative alla sicurezza per la tua organizzazione, ad esempio gestire le chiavi e i certificati memorizzati sul dispositivo</translation> <translation id="875532100880844232">Scegli un'azione per ogni tasto di: <ph name="DEVICE_NAME" /></translation> <translation id="8755376271068075440">Più &grande</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index b8332e0..9eb4086 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1161,6 +1161,7 @@ <translation id="1796588414813960292">音を使用する機能は動作しなくなります</translation> <translation id="1797117170091578105">Chromebook のキーボードを使ってプレイしましょう。特定の操作を行うキーをカスタマイズできます。</translation> <translation id="1798335429200675510">テキスト ボックスで右クリックすると、Google AI を活用して下書きを作成したり、既存の文章を手直ししたりできます。現在、限定的にご利用いただけます。</translation> +<translation id="1799852120691957794">前回のセッションからウィンドウを復元できません</translation> <translation id="180203835522132923">検索+O の後、W</translation> <translation id="1802624026913571222">ディスプレイを閉じたときにスリープ状態にする</translation> <translation id="1802687198411089702">ページが応答していません。しばらくお待ちいただくか、終了してください。</translation> @@ -2347,6 +2348,7 @@ <translation id="2610374175948698697">デバイスのファイルやフォルダを表示できる</translation> <translation id="2610780100389066815">Microsoft 信頼リストの署名</translation> <translation id="261114180663074524">Microsoft アカウントにログインして、もう一度お試しください</translation> +<translation id="2611702650078660078">エラーが発生しました</translation> <translation id="2611776654555141051">長方形ツール</translation> <translation id="2612676031748830579">カード番号</translation> <translation id="261305050785128654">お使いの言語を指定すると、可能な場合はウェブサイトのコンテンツが指定した言語で表示されます。</translation> @@ -2707,6 +2709,7 @@ <translation id="2849936225196189499">重要</translation> <translation id="285033512555869047">閉じています</translation> <translation id="2850541429955027218">テーマを追加</translation> +<translation id="2852045827873867442">インターネット接続が必要です。</translation> <translation id="285237063405807022">(読み込んでいます)</translation> <translation id="2853121255651601031">パスワードが保存されました</translation> <translation id="2855243985454069333">同期しているすべてのデバイスから履歴を削除します</translation> @@ -5416,6 +5419,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 件の重複</translation> <translation id="4780321648949301421">ページを別名で保存...</translation> <translation id="4780558987886269159">仕事向け</translation> +<translation id="4781633367688946589">新しいセッションに進む</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> は、デジタル ウォレットの個人情報の使用を求めています。</translation> <translation id="4785719467058219317">このウェブサイトに登録されていないセキュリティ キーを使用しています</translation> <translation id="4785914069240823137">切り抜きをキャンセル</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index f448de9..0805eca 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1162,6 +1162,7 @@ <translation id="1796588414813960292">ფუნქციები, რომლებიც ხმას საჭიროებს, არ იმუშავებს</translation> <translation id="1797117170091578105">ითამაშეთ თქვენი Chromebook კლავიატურის მეშვეობით. სურვილისამებრ, კლავიშების მორგებაც შეგიძლიათ, კონკრეტული მოქმედებები რომ შეასრულოთ.</translation> <translation id="1798335429200675510">ტექსტის ველში გამოიყენეთ მარჯვენა დაწკაპუნება, რომ Google-ის ხელოვნური ინტელექტის მეშვეობით შექმნათ მონახაზი, ან დახვეწოთ არსებული ნამუშევარი. ფუნქციის ხელმისაწვდომობა ამჟამად შეზღუდულია.</translation> +<translation id="1799852120691957794">წინა სესიიდან ფანჯრების აღდგენა შეუძლებელია</translation> <translation id="180203835522132923">Search + O, შემდეგ W</translation> <translation id="1802624026913571222">დაძინება თავსახურის დახურვისას</translation> <translation id="1802687198411089702">გვერდი არ რეაგირებს. შეგიძლიათ დაელოდოთ ან გამოხვიდეთ.</translation> @@ -2353,6 +2354,7 @@ <translation id="2610374175948698697">შეუძლია ფაილების ან საქაღალდეების ნახვა თქვენს მოწყობილობაზე</translation> <translation id="2610780100389066815">Microsoft-ის სანდო ელემენტების სიის ხელმოწერა</translation> <translation id="261114180663074524">შედით თქვენს Microsoft ანგარიშში და შემდეგ ცადეთ ხელახლა</translation> +<translation id="2611702650078660078">მოხდა შეცდომა</translation> <translation id="2611776654555141051">მართკუთხედის ხელსაწყო</translation> <translation id="2612676031748830579">ბარათის ნომერი</translation> <translation id="261305050785128654">აცნობეთ ვებსაიტებს, რომელ ენებზე საუბრობთ. მათზე კონტენტი, შეძლებისდაგვარად, ამ ენებზე გამოჩნდება.</translation> @@ -2713,6 +2715,7 @@ <translation id="2849936225196189499">კრიტიკული</translation> <translation id="285033512555869047">დაკეტილია</translation> <translation id="2850541429955027218">თემის დამატება</translation> +<translation id="2852045827873867442">საჭიროა ინტერნეტ-კავშირი.</translation> <translation id="285237063405807022">(იტვირთება)</translation> <translation id="2853121255651601031">პაროლი შენახულია</translation> <translation id="2855243985454069333">ისტორიის წაშლა ყველა სინქრონიზებული მოწყობილობიდან</translation> @@ -5427,6 +5430,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 დუბლიკატი</translation> <translation id="4780321648949301421">გვერდის შენახვა, როგორც…</translation> <translation id="4780558987886269159">სამსახურისთვის</translation> +<translation id="4781633367688946589">ახალი სესიით გაგრძელება</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ითხოვს, გამოიყენოს თქვენი პერსონალური ინფორმაცია თქვენი ციფრული საფულიდან.</translation> <translation id="4785719467058219317">თქვენ მიერ გამოყენებული უსაფრთხოების გასაღები არ არის რეგისტრირებული ამ ვებსაიტზე</translation> <translation id="4785914069240823137">ჩამოჭრის გაუქმება</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index eb977951..817b6a25 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1159,6 +1159,7 @@ <translation id="1796588414813960292">Дыбысты қажет ететін функциялар жұмыс істемейді.</translation> <translation id="1797117170091578105">Chromebook пернетақтасымен ойнаңыз. Пернелерді арнайы әрекеттерге тағайындауға болады.</translation> <translation id="1798335429200675510">Google AI арқылы нобай жасау немесе бар жұмысты жақсарту үшін мәтін ұясын тінтуірдің оң жақ түймесімен басыңыз. Әзірше қолжетімділігі шектеулі.</translation> +<translation id="1799852120691957794">Алдыңғы сеанс терезелері қалпына келмеді</translation> <translation id="180203835522132923">Search + O, одан кейін W</translation> <translation id="1802624026913571222">Қақпағы жабылғанда, ұйқы режиміне өту</translation> <translation id="1802687198411089702">Бет жауап бермеуде. Оны күтуге не жабуға болады.</translation> @@ -2350,6 +2351,7 @@ <translation id="2610374175948698697">Құрылғыңыздағы файлдарды немесе қалталарды көре алады</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Microsoft аккаунтыңызға кіріп, әрекетті қайталаңыз</translation> +<translation id="2611702650078660078">Қате орын алды.</translation> <translation id="2611776654555141051">Тікбұрыш құралы</translation> <translation id="2612676031748830579">Карта нөмірі</translation> <translation id="261305050785128654">Веб-сайттарға қандай тілдерде сөйлейтініңізді көрсетіңіз. Сонда мүмкіндігінше сол тілдердегі контент беріледі.</translation> @@ -2710,6 +2712,7 @@ <translation id="2849936225196189499">Маңызды</translation> <translation id="285033512555869047">Жабық</translation> <translation id="2850541429955027218">Тақырып қосу</translation> +<translation id="2852045827873867442">Интернет байланысы қажет.</translation> <translation id="285237063405807022">(жүктеліп жатыр)</translation> <translation id="2853121255651601031">Құпия сөз сақталды</translation> <translation id="2855243985454069333">Тарихты барлық синхрондалған құрылғыдан жояды.</translation> @@ -3160,6 +3163,7 @@ <translation id="3188465121994729530">Орташа мәнді жылжыту</translation> <translation id="3189187154924005138">Үлкен көрсеткі</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 құпия сөз және басқа элементтер тек осы құрылғыға сақталды. Оларды басқа құрылғыларыңызда пайдалану үшін Google аккаунтына сақтаңыз.}other{{PASSWORD_COUNT} құпия сөз және басқа элементтер тек осы құрылғыға сақталды. Оларды басқа құрылғыларыңызда пайдалану үшін Google аккаунтына сақтаңыз.}}</translation> +<translation id="319044078641740013">Өзіңіз кірген сайттарға оңай оралу үшін тарих пен қойындыларды <ph name="ACCOUNT_EMAIL" /> аккаунтымен синхрондаңыз.</translation> <translation id="3190558889382726167">Құпия сөз сақталды</translation> <translation id="3192586965067888278">Мәселені толық сипаттап беріңіз. Пікіріңіз Google маманына тексеруге жіберіледі және Google өнімдері мен қызметтерін жақсару немесе әзірлеу үшін қолданылуы мүмкін.</translation> <translation id="3192947282887913208">Аудио файлдары</translation> @@ -3265,6 +3269,7 @@ <translation id="3269689705184377744">{COUNT,plural, =1{Файл}other{# файл}}</translation> <translation id="326999365752735949">Басқасын жүктеу</translation> <translation id="3270965368676314374">Компьютеріңізден фотосуреттерді, музыканы және басқа медиафайлдарды оқу, өзгерту және жою</translation> +<translation id="3275464924531706548"><ph name="HEADER" /> панелін жию</translation> <translation id="3275778809241512831">Ішкі қауіпсіздік кілті сенімді емес. Оны өзіңіз қолданатын қызметтердің барлығынан өшіріңіз. Бұл ақауды түзету үшін қауіпсіздік кілтін бастапқы күйге қайтарыңыз.</translation> <translation id="3275778913554317645">Терезе ретінде ашу</translation> <translation id="3277214528693754078">Мәтін курсорымен қозғалу (белсенді курсор режимі)</translation> @@ -3596,6 +3601,7 @@ <translation id="3510471875518562537">Бұл мекенжайды iPhone-да пайдаланыңыз</translation> <translation id="3511200754045804813">Қайта сканерлеу</translation> <translation id="3511307672085573050">Сілтеме мекен&жайын көшіру</translation> +<translation id="3511358375261756531"><ph name="HEADER" /> панелін жаю</translation> <translation id="351152300840026870">Ені бірыңғай қаріп</translation> <translation id="3511528412952710609">Қысқа</translation> <translation id="3513019849832307207">Қосылу және ашу</translation> @@ -5419,6 +5425,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 көшірме</translation> <translation id="4780321648949301421">Бетті басқаша сақтау…</translation> <translation id="4780558987886269159">Жұмыс үшін</translation> +<translation id="4781633367688946589">Жаңа сеанста жалғастыру</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> цифрлық әмияныңыздағы жеке ақпаратыңызды пайдалануға рұқсат сұрайды.</translation> <translation id="4785719467058219317">Веб-сайтта тіркелмеген қауіпсіздік кілтін пайдаланып жатырсыз.</translation> <translation id="4785914069240823137">Қиюдан бас тарту</translation> @@ -6146,6 +6153,7 @@ <translation id="5296536303670088158">Енді Chrome зиянды веб-сайттардан сенімді қорғайды.</translation> <translation id="5297005732522718715">Тетеринг конфигурациясын жаңарту</translation> <translation id="5297082477358294722">Құпия сөз сақталды. Сақталған құпия сөздерді <ph name="SAVED_PASSWORDS_STORE" /> бетінен көріңіз және басқарыңыз.</translation> +<translation id="5297548311167268289"><ph name="RP_ID" /> сайтына кіру</translation> <translation id="5297946558563358707">Егер әлдебіреу экраныңызға қараса, экранның оң жақ төменгі бөлігінде көз белгішесі шығады.</translation> <translation id="5297984209202974345">Келесі сипаттарға ие соңғы AI тақырыбы: <ph name="INDEX" />, <ph name="SUBJECT" />, <ph name="STYLE" /> стилі</translation> <translation id="5298219193514155779">Тақырыпты жасаған</translation> @@ -10321,6 +10329,7 @@ <translation id="8280848878018088610">Алыстан керемет қала мен қамал көрінетін теңіздегі дүлей толқынның қошқыл реңкті көрінісі.</translation> <translation id="828180235270931531">Басқа қолжетімді принтерлер</translation> <translation id="8281886186245836920">Өткізіп жіберу</translation> +<translation id="8283802069507225582">Тоқтаған жеріңізден басқа құрылғыда жалғастыру үшін тарих пен қойындыларды <ph name="ACCOUNT_EMAIL" /> аккаунтымен синхрондаңыз.</translation> <translation id="8284279544186306258">барлық <ph name="WEBSITE_1" /> сайттары</translation> <translation id="8284326494547611709">Титрлер</translation> <translation id="8286036467436129157">Кіру</translation> @@ -10998,6 +11007,7 @@ <translation id="8754200782896249056"><p>Қолдау көрсетілген жұмыс үстелі ортасына негізделген <ph name="PRODUCT_NAME" /> іске қосу кезінде, жүйенің прокси параметрлері пайдаланылады. Бірақ жүйеңізге қолдау көрсетілмеген немесе жүйелік конфигурацияңызды іске қосу кезінде ақау орын алды.</p> <p>Пәрмен жолы арқылы реттеуіңізге болады. Жалаушалар мен қоршаған орта айнымалылары туралы қосымша ақпарат алу үшін <code><ph name="PRODUCT_BINARY_NAME" /> нұсқаулығын</code> қараңыз.</p></translation> +<translation id="8754810799862630650">Ашық қойындыларды басқа компьютерлер мен телефондардан көру үшін тарих пен қойындыларды <ph name="ACCOUNT_EMAIL" /> аккаунтымен синхрондаңыз.</translation> <translation id="8755175579224030324">Құрылғыда сақталған сертификаттар мен кілттерді реттеу сияқты қауіпсіздікке қатысты тапсырмаларды ұйымыңыз үшін орындау</translation> <translation id="875532100880844232"><ph name="DEVICE_NAME" /> құрылғысы үшін әр пернеге әрекетті таңдаңыз</translation> <translation id="8755376271068075440">&Үлкенірек</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 75c9ed9a..7d3e1c6 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1171,6 +1171,7 @@ <translation id="1796588414813960292">មុខងារដែលត្រូវការសំឡេងនឹងមិនដំណើរការទេ</translation> <translation id="1797117170091578105">លេងដោយប្រើប្រាស់ក្ដារចុច Chromebook របស់អ្នក។ អ្នកអាចប្ដូរគ្រាប់ចុចឱ្យចងភ្ជាប់ទៅសកម្មភាពជាក់លាក់តាមបំណង។</translation> <translation id="1798335429200675510">ចុចម៉ៅស៍ខាងស្ដាំនៅក្នុងប្រអប់អក្សរ ដើម្បីបង្កើតសេចក្ដីព្រាង ឬកែលម្អស្នាដៃដែលមានស្រាប់ ដែលដំណើរការដោយ Google AI។ បច្ចុប្បន្ននេះ លទ្ធភាពដែលអាចប្រើបានមានកំណត់។</translation> +<translation id="1799852120691957794">មិនអាចស្ដារវិនដូពីវគ្គមុនរបស់អ្នកបានទេ</translation> <translation id="180203835522132923">Search + O បន្ទាប់មក W</translation> <translation id="1802624026913571222">ដេកនៅពេលបិទគម្រប</translation> <translation id="1802687198411089702">ទំព័រនេះមិនឆ្លើយតបទេ។ អ្នកអាចរង់ចាំឱ្យវាឆ្លើយតប ឬចាកចេញ។</translation> @@ -2366,6 +2367,7 @@ <translation id="2610374175948698697">អាចមើលឯកសារ ឬថតនៅលើឧបករណ៍របស់អ្នក</translation> <translation id="2610780100389066815">ការចុះហត្ថលេខាបញ្ជីទុកចិត្ត Microsoft</translation> <translation id="261114180663074524">ចូលគណនី Microsoft របស់អ្នក រួចព្យាយាមម្ដងទៀត</translation> +<translation id="2611702650078660078">មានបញ្ហាបានកើតឡើង</translation> <translation id="2611776654555141051">ឧបករណ៍បញ្ចូលរាងចតុកោណកែង</translation> <translation id="2612676031748830579">លេខកាត</translation> <translation id="261305050785128654">ប្រាប់ឱ្យគេហទំព័រដឹងអំពីភាសាដែលអ្នកនិយាយ។ គេហទំព័រទាំងនោះនឹងបង្ហាញខ្លឹមសារជាភាសាទាំងនោះ នៅពេលដែលអាច។</translation> @@ -2726,6 +2728,7 @@ <translation id="2849936225196189499">សំខាន់</translation> <translation id="285033512555869047">បិទ</translation> <translation id="2850541429955027218">បន្ថែមធីម</translation> +<translation id="2852045827873867442">តម្រូវឱ្យមានការតភ្ជាប់អ៊ីនធឺណិត។</translation> <translation id="285237063405807022">(កំពុងផ្ទុក)</translation> <translation id="2853121255651601031">បានរក្សាទុកពាក្យសម្ងាត់</translation> <translation id="2855243985454069333">លុបប្រវត្តិពីគ្រប់ឧបករណ៍ដែលបានធ្វើសមកាលកម្ម</translation> @@ -5438,6 +5441,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • ស្ទួន 1</translation> <translation id="4780321648949301421">រក្សាទុកទំព័រជា...</translation> <translation id="4780558987886269159">សម្រាប់ការងារ</translation> +<translation id="4781633367688946589">បន្តទៅវគ្គថ្មី</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ចង់ប្រើព័ត៌មានផ្ទាល់ខ្លួនពីកាបូបឌីជីថលរបស់អ្នក។</translation> <translation id="4785719467058219317">អ្នកកំពុងប្រើសោសុវត្ថិភាពដែលមិនបានចុះឈ្មោះជាមួយគេហទំព័រនេះ</translation> <translation id="4785914069240823137">បោះបង់ការច្រឹប</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 5b232997..138900b 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1165,6 +1165,7 @@ <translation id="1796588414813960292">ಧ್ವನಿಯ ಅಗತ್ಯವಿರುವ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ</translation> <translation id="1797117170091578105">ನಿಮ್ಮ Chromebook ಕೀಬೋರ್ಡ್ ಬಳಸಿ ಗೇಮ್ ಅನ್ನು ಆಡಿ. ನಿರ್ದಿಷ್ಟ ಕ್ರಿಯೆಗಳಿಗಾಗಿ ನೀವು ಕೀಗಳನ್ನು ಕಸ್ಟಮೈಸ್ ಮಾಡಬಹುದು.</translation> <translation id="1798335429200675510">ಡ್ರಾಫ್ಟ್ ಒಂದನ್ನು ರಚಿಸಲು ಅಥವಾ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಕೆಲಸವನ್ನು ರೀಫೈನ್ ಮಾಡಲು ಟೆಕ್ಸ್ಟ್ ಬಾಕ್ಸ್ ಒಂದರಲ್ಲಿ ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿ, Google AI ನಿಂದ ಚಾಲಿತ. ಪ್ರಸ್ತುತ ಸೀಮಿತ ಲಭ್ಯತೆಯನ್ನು ಹೊಂದಿದೆ.</translation> +<translation id="1799852120691957794">ನಿಮ್ಮ ಹಿಂದಿನ ಸೆಶನ್ನಿಂದ ವಿಂಡೋಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation> <translation id="180203835522132923">Search + O, ನಂತರ W</translation> <translation id="1802624026913571222">ಕವರ್ ಮುಚ್ಚಿದಾಗ ಸ್ಲೀಪ್ ಮೋಡ್ಗೆ ಬದಲಿಸಿ</translation> <translation id="1802687198411089702">ಪುಟವು ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ. ನೀವು ಅದಕ್ಕಾಗಿ ಕಾಯಬಹುದು ಅಥವಾ ನಿರ್ಗಮಿಸಬಹುದು.</translation> @@ -2359,6 +2360,7 @@ <translation id="2610374175948698697">ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಫೈಲ್ಗಳು ಅಥವಾ ಫೋಲ್ಡರ್ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">ನಿಮ್ಮ Microsoft ಖಾತೆಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ ಮತ್ತು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation> +<translation id="2611702650078660078">ದೋಷ ಸಂಭವಿಸಿದೆ</translation> <translation id="2611776654555141051">ಆಯತ ಟೂಲ್</translation> <translation id="2612676031748830579">ಕಾರ್ಡ್ ಸಂಖ್ಯೆ</translation> <translation id="261305050785128654">ನೀವು ಮಾತನಾಡುವ ಭಾಷೆಗಳನ್ನು ವೆಬ್ಸೈಟ್ಗಳಿಗೆ ತಿಳಿಸಿ. ಸಾಧ್ಯವಾದಾಗ, ವೆಬ್ಸೈಟ್ಗಳು ಆ ಭಾಷೆಗಳಲ್ಲಿ ಕಂಟೆಂಟ್ ಅನ್ನು ತೋರಿಸುತ್ತವೆ.</translation> @@ -2719,6 +2721,7 @@ <translation id="2849936225196189499">ಗಂಭೀರ</translation> <translation id="285033512555869047">ಮುಚ್ಚಿದೆ</translation> <translation id="2850541429955027218">ಥೀಮ್ ಸೇರಿಸು</translation> +<translation id="2852045827873867442">ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಅಗತ್ಯವಿದೆ.</translation> <translation id="285237063405807022">(ಲೋಡ್ ಆಗುತ್ತಿದೆ)</translation> <translation id="2853121255651601031">ಪಾಸ್ವರ್ಡ್ ಸೇವ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="2855243985454069333">ಎಲ್ಲಾ ಸಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳಿಂದ ಇತಿಹಾಸವನ್ನು ಅಳಿಸುತ್ತದೆ</translation> @@ -5432,6 +5435,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 ನಕಲು</translation> <translation id="4780321648949301421">ಇದರಂತೆ ಪುಟವನ್ನು ಉಳಿಸು...</translation> <translation id="4780558987886269159">ಉದ್ಯೋಗಕ್ಕಾಗಿ</translation> +<translation id="4781633367688946589">ಹೊಸ ಸೆಶನ್ಗೆ ಮುಂದುವರಿಯಿರಿ</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ನಿಮ್ಮ ಡಿಜಿಟಲ್ ವಾಲೆಟ್ನಿಂದ ವೈಯಕ್ತಿಕ ಮಾಹಿತಿಯನ್ನು ಬಳಸಲು ಬಯಸುತ್ತದೆ.</translation> <translation id="4785719467058219317">ಈ ವೆಬ್ಸೈಟ್ನೊಂದಿಗೆ ನೋಂದಾಯಿಸಿಲ್ಲದ ಭದ್ರತೆ ಕೀಯನ್ನು ನೀವು ಬಳಸುತ್ತಿದ್ದೀರಿ</translation> <translation id="4785914069240823137">ಕ್ರಾಪ್ ರದ್ದುಮಾಡಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 4ff0519..be5f0a4 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1171,6 +1171,7 @@ <translation id="1796588414813960292">소리가 필요한 기능이 작동하지 않습니다</translation> <translation id="1797117170091578105">Chromebook 키보드를 사용하여 플레이합니다. 특정 작업에 맞게 키를 맞춤설정할 수 있습니다.</translation> <translation id="1798335429200675510">텍스트 상자를 마우스 오른쪽 버튼으로 클릭하여 Google AI를 기반으로 초안을 작성하거나 기존 작업물을 다듬어 보세요. 현재는 제한적으로만 이용할 수 있습니다.</translation> +<translation id="1799852120691957794">이전 세션의 창을 복원할 수 없음</translation> <translation id="180203835522132923">검색 + O를 누른 후 W</translation> <translation id="1802624026913571222">커버를 닫으면 절전 모드 진입</translation> <translation id="1802687198411089702">페이지가 응답하지 않습니다. 페이지가 응답할 때까지 기다리거나 종료할 수 있습니다.</translation> @@ -2368,6 +2369,7 @@ <translation id="2610374175948698697">기기에 있는 파일 또는 폴더를 볼 수 있음</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Microsoft 계정에 로그인한 후 다시 시도해 보세요</translation> +<translation id="2611702650078660078">오류가 발생했습니다</translation> <translation id="2611776654555141051">직사각형 도구</translation> <translation id="2612676031748830579">카드 번호</translation> <translation id="261305050785128654">사용하는 언어를 웹사이트에 알려주세요. 가능한 경우 해당 언어로 콘텐츠가 표시됩니다.</translation> @@ -2728,6 +2730,7 @@ <translation id="2849936225196189499">중요</translation> <translation id="285033512555869047">닫힘</translation> <translation id="2850541429955027218">테마 추가</translation> +<translation id="2852045827873867442">인터넷 연결이 필요합니다</translation> <translation id="285237063405807022">(로드 중)</translation> <translation id="2853121255651601031">비밀번호 저장됨</translation> <translation id="2855243985454069333">동기화된 모든 기기에서 방문 기록 삭제</translation> @@ -5441,6 +5444,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 중복 1개</translation> <translation id="4780321648949301421">페이지를 다른 이름으로 저장...</translation> <translation id="4780558987886269159">업무용</translation> +<translation id="4781633367688946589">새 세션으로 계속</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" />에서 디지털 지갑의 개인 정보를 사용하려고 합니다.</translation> <translation id="4785719467058219317">이 웹사이트에 등록되지 않은 보안 키를 사용하고 있습니다.</translation> <translation id="4785914069240823137">자르기 취소</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 9af18be..bd8f71d 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1171,6 +1171,7 @@ <translation id="1796588414813960292">Добушту колдонгон функциялар иштебей калат</translation> <translation id="1797117170091578105">Chromebook баскычтобун колдонуп ойноңуз. Баскычтарды белгилүү бир аракеттерге ыңгайлаштыра аласыз.</translation> <translation id="1798335429200675510">Жумушчу вариантты түзүү же Google сунуштаган ЖИ технологиялары тарабынан иштетилген учурдагы ишти жакшыртуу үчүн текст кутусун чычкандын оң баскычы менен чыкылдатыңыз. Учурда жеткиликтүүлүгү чектелген.</translation> +<translation id="1799852120691957794">Мурунку сеансыңыздагы терезелерди калыбына келтирүү мүмкүн эмес</translation> <translation id="180203835522132923">Search + O, анан W</translation> <translation id="1802624026913571222">Уйку режимине капкагы жабылып турганда өтсүн</translation> <translation id="1802687198411089702">Бул баракча жооп бербей жатат. Аны күтсөңүз же болбосо чыгып кетсеңиз болот.</translation> @@ -2366,6 +2367,7 @@ <translation id="2610374175948698697">Түзмөгүңүздөгү файлдарды же папкаларды көрө алат</translation> <translation id="2610780100389066815">Microsoft Ишеним тизмесине кол коюу</translation> <translation id="261114180663074524">Microsoft аккаунтуңузга кирип, кайталап көрүңүз</translation> +<translation id="2611702650078660078">Ката кетти</translation> <translation id="2611776654555141051">"Тик бурчтук" куралы</translation> <translation id="2612676031748830579">Картанын номери</translation> <translation id="261305050785128654">Вебсайттар сиз тандаган тилдерди көрө алса, ошол тилдердеги мазмунду көрсөтөт.</translation> @@ -2726,6 +2728,7 @@ <translation id="2849936225196189499">Олуттуу</translation> <translation id="285033512555869047">Жабык</translation> <translation id="2850541429955027218">Тема кошуу</translation> +<translation id="2852045827873867442">Интернет байланышы талап кылынат.</translation> <translation id="285237063405807022">(жүктөлүүдө)</translation> <translation id="2853121255651601031">Сырсөз сакталды</translation> <translation id="2855243985454069333">Шайкештирилген бардык түзмөктөрүңүздөгү таржымал өчүрүлөт</translation> @@ -5440,6 +5443,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 кайталанма</translation> <translation id="4780321648949301421">Бетти төмөнкүдөй сактоо…</translation> <translation id="4780558987886269159">Жумуш үчүн</translation> +<translation id="4781633367688946589">Жаңы сеансты баштоо</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> электрондук капчыгыңыздагы жеке маалыматтарыңызды колдонгону жатат.</translation> <translation id="4785719467058219317">Бул вебсайтта катталбаган коопсуздук ачкычын колдонуп жатасыз</translation> <translation id="4785914069240823137">Кесүүнү жокко чыгаруу</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index c6759619..5afc162 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1169,6 +1169,7 @@ <translation id="1796588414813960292">ຄຸນສົມບັດທີ່ຕ້ອງການສຽງຈະໃຊ້ບໍ່ໄດ້</translation> <translation id="1797117170091578105">ຫຼິ້ນໂດຍໃຊ້ແປ້ນພິມ Chromebook ຂອງທ່ານ. ທ່ານສາມາດປັບແຕ່ງປຸ່ມເປັນຄຳສັ່ງສະເພາະຕ່າງໆໄດ້.</translation> <translation id="1798335429200675510">ຄລິກຂວາໃສ່ກ່ອງຂໍ້ຄວາມເພື່ອສ້າງຮ່າງ ຫຼື ປັບປ່ຽນການເຮັດວຽກທີ່ມີຢູ່ແລ້ວ, ຂັບເຄື່ອນໂດຍ Google AI. ປັດຈຸບັນມີຈຳນວນຈຳກັດ.</translation> +<translation id="1799852120691957794">ບໍ່ສາມາດກູ້ຄືນໜ້າຈໍຈາກເຊດຊັນກ່ອນໜ້າຂອງທ່ານໄດ້</translation> <translation id="180203835522132923">ຊອກຫາ + O, ຈາກນັ້ນ W</translation> <translation id="1802624026913571222">ພັກເຄື່ອງເມື່ອປິດຝາ</translation> <translation id="1802687198411089702">ໜ້ານີ້ບໍ່ຕອບສະໜອງ. ທ່ານສາມາດລໍຖ້າມັນ ຫຼື ອອກໄດ້.</translation> @@ -2365,6 +2366,7 @@ <translation id="2610374175948698697">ສາມາດເບິ່ງໄຟລ໌ ຫຼື ໂຟນເດີຢູ່ອຸປະກອນຂອງທ່ານໄດ້</translation> <translation id="2610780100389066815">ການລົງຊື່ເຂົ້າໃຊ້ລາຍຊື່ເຊື່ອໝັ້ນຂອງ Microsoft</translation> <translation id="261114180663074524">ເຂົ້າສູ່ລະບົບບັນຊີ Microsoft ຂອງທ່ານ ແລ້ວລອງໃໝ່</translation> +<translation id="2611702650078660078">ເກີດຂໍ້ຜິດພາດ</translation> <translation id="2611776654555141051">ເຄື່ອງມືສີ່ຫຼ່ຽມ</translation> <translation id="2612676031748830579">ເລກບັດ</translation> <translation id="261305050785128654">ແຈ້ງໃຫ້ເວັບໄຊຮູ້ພາສາທີ່ທ່ານເວົ້າ. ແລ້ວເວັບໄຊດັ່ງກ່າວຈະສະແດງເນື້ອຫາໃນພາສາເຫຼົ່ານັ້ນ, ເມື່ອເປັນໄປໄດ້.</translation> @@ -2725,6 +2727,7 @@ <translation id="2849936225196189499">ສໍາຄັນ</translation> <translation id="285033512555869047">ປິດແລ້ວ</translation> <translation id="2850541429955027218">ເພີ່ມຊຸດຮູບແບບ</translation> +<translation id="2852045827873867442">ຕ້ອງມີການເຊື່ອມຕໍ່ອິນເຕີເນັດ.</translation> <translation id="285237063405807022">(ກຳລັງໂຫຼດ)</translation> <translation id="2853121255651601031">ບັນທຶກລະຫັດຜ່ານໄວ້ແລ້ວ</translation> <translation id="2855243985454069333">ລຶບປະຫວັດອອກຈາກອຸປະກອນທຸກເຄື່ອງທີ່ຊິ້ງໄວ້</translation> @@ -5439,6 +5442,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 ແຖບທີ່ຊ້ຳກັນ</translation> <translation id="4780321648949301421">ບັນທຶກໜ້າເປັນ...</translation> <translation id="4780558987886269159">ສໍາລັບການເຮັດວຽກ</translation> +<translation id="4781633367688946589">ດຳເນີນການຕໍ່ໄປຫາເຊດຊັນໃໝ່</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ຕ້ອງການໃຊ້ຂໍ້ມູນສ່ວນຕົວຈາກກະເປົາດິຈິຕອນຂອງທ່ານ.</translation> <translation id="4785719467058219317">ທ່ານກຳລັງໃຊ້ກະແຈຄວາມປອດໄພທີ່ບໍ່ໄດ້ລົງທະບຽນນຳເວັບໄຊນີ້</translation> <translation id="4785914069240823137">ຍົກເລີກການຕັດ</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 90ff169..938329b1 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1167,6 +1167,7 @@ <translation id="1796588414813960292">Дуу чимээ шаардлагатай онцлогууд ажиллахгүй</translation> <translation id="1797117170091578105">Chromebook-н гараа ашиглан тоглоно уу. Та тодорхой үйлдлүүдийн товчийг өөрчлөх боломжтой.</translation> <translation id="1798335429200675510">Ноорог үүсгэх эсвэл одоо байгаа ажлыг боловсронгуй болгоход Google AI-аар дэмжигдсэн текстийн хайрцагт хулганын баруун талыг товшино уу. Одоогоор боломжтой байдал нь хязгаарлагдмал байна.</translation> +<translation id="1799852120691957794">Таны өмнөх харилцан үйлдлээс цонх сэргээх боломжгүй</translation> <translation id="180203835522132923">Search + O, дараа нь W</translation> <translation id="1802624026913571222">Хавтас хаалттай үед идэвхгүй болгох</translation> <translation id="1802687198411089702">Хуудас хариу өгөхгүй байна. Та хариу өгтөл нь хүлээх эсвэл гарах боломжтой.</translation> @@ -2362,6 +2363,7 @@ <translation id="2610374175948698697">Таны төхөөрөмжийн файл эсвэл фолдеруудыг харах боломжтой</translation> <translation id="2610780100389066815">Microsoft-ын Итгэлцлийн Жагсаалтад гарын үсэг зурах явц</translation> <translation id="261114180663074524">Microsoft бүртгэлдээ нэвтэрч, дараа дахин оролдоно уу</translation> +<translation id="2611702650078660078">Алдаа гарлаа</translation> <translation id="2611776654555141051">Тэгш өнцөгтийн хэрэгсэл</translation> <translation id="2612676031748830579">Картын дугаар</translation> <translation id="261305050785128654">Вебсайтуудад ярьдаг хэлнүүдээ мэдэгдээрэй. Тэд боломжтой үед тэдгээр хэлээрх контентыг харуулна.</translation> @@ -2722,6 +2724,7 @@ <translation id="2849936225196189499">Аюултай</translation> <translation id="285033512555869047">Хаалттай</translation> <translation id="2850541429955027218">Загвар нэмэх</translation> +<translation id="2852045827873867442">Интернэтэд холбогдох шаардлагатай.</translation> <translation id="285237063405807022">(ачаалж байна)</translation> <translation id="2853121255651601031">Нууц үгийг хадгалсан</translation> <translation id="2855243985454069333">Синк хийсэн бүх төхөөрөмжөөс түүхийг устгана</translation> @@ -5435,6 +5438,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 хуулбар</translation> <translation id="4780321648949301421">Хуудсыг... хэлбэрээр хадгалах</translation> <translation id="4780558987886269159">Ажилд зориулсан</translation> +<translation id="4781633367688946589">Шинэ харилцан үйлдэл рүү үргэлжлүүлэх</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> таны дижитал түрийвчээс хувийн мэдээллийг ашиглахыг хүсэж байна.</translation> <translation id="4785719467058219317">Та энэ веб сайтад бүртгүүлээгүй аюулгүй байдлын түлхүүрийг ашиглаж байна</translation> <translation id="4785914069240823137">Тайралтыг цуцална уу</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 9b0c0ef..230f6eb 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1170,6 +1170,7 @@ <translation id="1796588414813960292">साउंडची आवश्यकता असलेली वैशिष्ट्ये काम करणार नाहीत</translation> <translation id="1797117170091578105">तुमच्या Chromebook चा कीबोर्ड वापरून प्ले करा. तुम्ही विशिष्ट कृतींसाठी की कस्टमाइझ करू शकता.</translation> <translation id="1798335429200675510">Google AI वापरून मसुदा तयार करणे किंवा सध्याचे काम सुधारित करणे यासाठी टेक्स्ट बॉक्सवर राइट-क्लिक करा. सध्या मर्यादित उपलब्धता आहे.</translation> +<translation id="1799852120691957794">तुमच्या खाजगी सेशनमधील विंडो रिस्टोअर करू शकत नाही</translation> <translation id="180203835522132923">Search + O, त्यानंतर W</translation> <translation id="1802624026913571222">कव्हर बंद केल्यावर स्लीप मोड ऑन करा</translation> <translation id="1802687198411089702">पेज प्रतिसाद देत नाही. तुम्ही वाट पाहू शकता किंवा बाहेर पडू शकता.</translation> @@ -2365,6 +2366,7 @@ <translation id="2610374175948698697">तुमच्या डिव्हाइसवरील फाइल किंवा फोल्डर पाहू शकते</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">तुमच्या Microsoft खात्यामध्ये साइन इन करून पुन्हा प्रयत्न करा</translation> +<translation id="2611702650078660078">एरर आली:</translation> <translation id="2611776654555141051">आयत टूल</translation> <translation id="2612676031748830579">कार्ड नंबर</translation> <translation id="261305050785128654">तुम्ही बोलता त्या भाषा वेबसाइटना कळवा. शक्य असेल, तेव्हा ते त्या भाषांमध्ये आशय दाखवतील.</translation> @@ -2725,6 +2727,7 @@ <translation id="2849936225196189499">गंभीर</translation> <translation id="285033512555869047">बंद आहे</translation> <translation id="2850541429955027218">थीम जोडा</translation> +<translation id="2852045827873867442">इंटरनेट कनेक्शन आवश्यक आहे.</translation> <translation id="285237063405807022">(लोड करत आहे)</translation> <translation id="2853121255651601031">पासवर्ड सेव्ह केला</translation> <translation id="2855243985454069333">सर्व सिंक केलेल्या डिव्हाइसवरून इतिहास हटवते</translation> @@ -5437,6 +5440,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • १ डुप्लिकेट</translation> <translation id="4780321648949301421">पेज या फॉरमॅटमध्ये सेव्ह करा...</translation> <translation id="4780558987886269159">ऑफिससाठी</translation> +<translation id="4781633367688946589">नवीन सेशनमध्ये पुढे सुरू ठेवा</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> ला तुमच्या डिजिटल वॉलेटमधून वैयक्तिक माहिती वापरायची आहे.</translation> <translation id="4785719467058219317">तुम्ही या वेबसाइटवर नोंदणीकृत नसलेली सिक्युरिटी की वापरत आहात</translation> <translation id="4785914069240823137">क्रॉप रद्द करा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 318d042..bb04cfd 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1171,6 +1171,7 @@ <translation id="1796588414813960292">Ciri yang memerlukan bunyi tidak akan berfungsi</translation> <translation id="1797117170091578105">Main menggunakan papan kekunci Chromebook anda. Anda boleh menyesuaikan kekunci kepada tindakan tertentu.</translation> <translation id="1798335429200675510">Klik kanan dalam kotak teks untuk membuat draf atau memperhalus kerja sedia ada, dikuasakan oleh Google AI. Ketersediaan ciri ini terhad pada masa ini.</translation> +<translation id="1799852120691957794">Tidak dapat memulihkan tetingkap daripada sesi anda sebelum ini</translation> <translation id="180203835522132923">Cari + O, kemudian W</translation> <translation id="1802624026913571222">Tidur apabila penutup ditutup</translation> <translation id="1802687198411089702">Halaman tidak bertindak balas. Anda boleh menunggu atau keluar.</translation> @@ -2366,6 +2367,7 @@ <translation id="2610374175948698697">Boleh melihat fail atau folder pada peranti anda</translation> <translation id="2610780100389066815">Menandatangani Senarai Kepercayaan Microsoft</translation> <translation id="261114180663074524">Log masuk ke akaun Microsoft anda dan cuba lagi</translation> +<translation id="2611702650078660078">Ralat telah berlaku</translation> <translation id="2611776654555141051">Alat Segi Empat Tepat</translation> <translation id="2612676031748830579">Nombor kad</translation> <translation id="261305050785128654">Benarkan laman web mengetahui bahasa tuturan anda. Laman web ini akan menunjukkan kandungan dalam bahasa tersebut, jika boleh.</translation> @@ -2726,6 +2728,7 @@ <translation id="2849936225196189499">Kritikal</translation> <translation id="285033512555869047">Tertutup</translation> <translation id="2850541429955027218">Tambahkan tema</translation> +<translation id="2852045827873867442">Sambungan Internet diperlukan.</translation> <translation id="285237063405807022">(memuatkan)</translation> <translation id="2853121255651601031">Kata Laluan Disimpan</translation> <translation id="2855243985454069333">Memadamkan sejarah daripada semua peranti yang disegerakkan</translation> @@ -5440,6 +5443,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 pendua</translation> <translation id="4780321648949301421">Simpan Halaman Sebagai...</translation> <translation id="4780558987886269159">Untuk kerja</translation> +<translation id="4781633367688946589">Teruskan kepada sesi baharu</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> mahu menggunakan maklumat peribadi daripada dompet digital anda.</translation> <translation id="4785719467058219317">Anda menggunakan kunci keselamatan yang tidak berdaftar dengan laman web ini</translation> <translation id="4785914069240823137">Batalkan Pemangkasan</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 8d7e443c..6714cbc 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -3161,6 +3161,7 @@ <translation id="3188465121994729530">औसत चलायमान</translation> <translation id="3189187154924005138">ठुलो कर्सर</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{एउटा पासवर्ड र अन्य सामग्री यो डिभाइसमा मात्र सेभ गरिएका छन्। यो पासवर्ड आफ्ना अन्य डिभाइसमा प्रयोग गर्न यसलाई आफ्नो Google खातामा सेभ गर्नुहोस्।}other{{PASSWORD_COUNT} वटा पासवर्ड र अन्य सामग्री यो डिभाइसमा मात्र सेभ गरिएका छन्। यी पासवर्ड आफ्ना अन्य डिभाइसमा प्रयोग गर्न यिनलाई आफ्नो Google खातामा सेभ गर्नुहोस्।}}</translation> +<translation id="319044078641740013">आफूले खोलेका साइटहरू सजिलैसँग फेरि खोल्न आफ्ना ट्याब र हिस्ट्री <ph name="ACCOUNT_EMAIL" /> मा सिंक गर्नुहोस्</translation> <translation id="3190558889382726167">पासवर्ड सेभ गरियो</translation> <translation id="3192586965067888278">यो समस्या विस्तृत रूपमा वर्णन गर्नुहोस्। प्रतिक्रिया मानव समीक्षा गर्ने प्रयोजनका लागि Google मा पठाइने छ र Google का उत्पादन र सेवाहरूको गुणस्तर सुधार वा विकास गर्न यसको प्रयोग गर्न सकिन्छ।</translation> <translation id="3192947282887913208">अडियो फाइलहरू</translation> @@ -10329,6 +10330,7 @@ <translation id="8280848878018088610">ब्याकग्राउन्डमा सानदार सहर र किल्लाका साथै साथै समुद्रमा छालहरू उर्लिरहेको देखाइएको अँध्यारो रङ प्रयोग गरिएको चित्र।</translation> <translation id="828180235270931531">उपलब्ध अन्य प्रिन्टरहरू</translation> <translation id="8281886186245836920">स्किप गर्नुहोस्</translation> +<translation id="8283802069507225582">अन्य डिभाइसमा आफूले छाडेकै ठाउँबाट जारी राख्न आफ्ना ट्याब र हिस्ट्री <ph name="ACCOUNT_EMAIL" /> मा सिंक गर्नुहोस्</translation> <translation id="8284279544186306258">सबै <ph name="WEBSITE_1" /> साइटहरू</translation> <translation id="8284326494547611709">क्याप्सन</translation> <translation id="8286036467436129157">साइन इन गर्नुहोस्</translation> @@ -11006,6 +11008,7 @@ <translation id="8754200782896249056"><p>जब <ph name="PRODUCT_NAME" /> लाई एक समर्थित डेस्कटप वातावरण अन्तर्गत चालू गरिन्छ, प्रणाली प्रोक्सी सेटिङहरू प्रयोग हुनेछन्। तथापि, या त तपाईँको प्रणाली समर्थित छैन वा तपाईँको प्रणाली विन्यास सुरु गर्नमा समस्या थियो।</p> <p>तर तपाईँले अझै पनि आदेश रेखा मार्फत कन्फिगर गर्न सक्नुहुन्छ। कृपया फ्ल्याग र वातावरण चलहरूमा थप जानकारीको लागि <code>man <ph name="PRODUCT_BINARY_NAME" /></code> हेर्नुहोस्।</p></translation> +<translation id="8754810799862630650">आफ्ना अन्य कम्प्युटर तथा फोनमा खोलिएका ट्याबहरू हेर्न आफ्ना ट्याब र हिस्ट्री <ph name="ACCOUNT_EMAIL" /> मा सिंक गर्नुहोस्</translation> <translation id="8755175579224030324">आफ्नो संस्थाका लागि यो डिभाइसमा भण्डारण गरिएका प्रमाणपत्र तथा कुञ्जीहरू व्यवस्थापन गर्ने जस्ता सुरक्षासँग सम्बन्धित कार्यहरू गर्नुहोस्</translation> <translation id="875532100880844232"><ph name="DEVICE_NAME" /> मा हरेक कीका निम्ति एउटा कारबाही छनौट गर्नुहोस्</translation> <translation id="8755376271068075440">&ठूलो</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 8b44581..e81438b8 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1162,6 +1162,7 @@ <translation id="1796588414813960292">Functies die afhankelijk zijn van geluid, werken niet</translation> <translation id="1797117170091578105">Speel met het toetsenbord van je Chromebook. Je kunt toetsen aan specifieke acties toewijzen.</translation> <translation id="1798335429200675510">Klik met de rechtermuisknop in een tekstvak om een concept te maken of bestaand werk te verfijnen, mogelijk gemaakt door AI van Google. Deze functie is op dit moment beperkt beschikbaar.</translation> +<translation id="1799852120691957794">Kan vensters van je vorige sessie niet herstellen</translation> <translation id="180203835522132923">Zoeken + O, dan W</translation> <translation id="1802624026913571222">Slaapstand als de klep wordt gesloten</translation> <translation id="1802687198411089702">De pagina reageert niet. Je kunt wachten tot deze reageert of de pagina afsluiten.</translation> @@ -2353,6 +2354,7 @@ <translation id="2610374175948698697">Kan bestanden of mappen op je apparaat bekijken</translation> <translation id="2610780100389066815">Microsoft-vertrouwenslijsthandtekening</translation> <translation id="261114180663074524">Log in op je Microsoft-account en probeer het opnieuw</translation> +<translation id="2611702650078660078">Er is een fout opgetreden</translation> <translation id="2611776654555141051">Tool Rechthoek</translation> <translation id="2612676031748830579">Kaartnummer</translation> <translation id="261305050785128654">Laat websites weten welke talen je spreekt. Waar mogelijk tonen ze content in die talen.</translation> @@ -2713,6 +2715,7 @@ <translation id="2849936225196189499">Kritiek</translation> <translation id="285033512555869047">Gesloten</translation> <translation id="2850541429955027218">Thema toevoegen</translation> +<translation id="2852045827873867442">Internetverbinding vereist.</translation> <translation id="285237063405807022">(laden)</translation> <translation id="2853121255651601031">Wachtwoord opgeslagen</translation> <translation id="2855243985454069333">Hiermee wordt de geschiedenis van al je gesynchroniseerde apparaten verwijderd.</translation> @@ -5424,6 +5427,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplicaat</translation> <translation id="4780321648949301421">Bewaar pagina als...</translation> <translation id="4780558987886269159">Voor het werk</translation> +<translation id="4781633367688946589">Doorgaan naar nieuwe sessie</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> wil persoonlijke informatie uit je digitale portemonnee gebruiken.</translation> <translation id="4785719467058219317">Je gebruikt een beveiligingssleutel die niet is geregistreerd voor deze website</translation> <translation id="4785914069240823137">Bijsnijden annuleren</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 87da989..b67f7ddd 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1166,6 +1166,7 @@ <translation id="1796588414813960292">Funksjoner som krever lyd, kommer ikke til å virke</translation> <translation id="1797117170091578105">Spill med Chromebook-tastaturet. Du kan tilpasse taster til bestemte handlinger.</translation> <translation id="1798335429200675510">Høyreklikk i et tekstfelt for å opprette et utkast eller finjustere eksisterende tekst – basert på AI fra Google. Har begrenset tilgjengelighet for øyeblikket.</translation> +<translation id="1799852120691957794">Kan ikke gjenopprette vinduer fra forrige økt</translation> <translation id="180203835522132923">Søk + O og deretter W</translation> <translation id="1802624026913571222">Gå i hvilemodus når dekselet lukkes</translation> <translation id="1802687198411089702">Siden svarer ikke. Du kan vente på den eller avslutte.</translation> @@ -2360,6 +2361,7 @@ <translation id="2610374175948698697">Kan se filer og mapper på enheten</translation> <translation id="2610780100389066815">Signering med Microsoft-klareringsliste</translation> <translation id="261114180663074524">Logg på Microsoft-kontoen, og prøv igjen</translation> +<translation id="2611702650078660078">Det oppstod en feil:</translation> <translation id="2611776654555141051">Rektangelverktøy</translation> <translation id="2612676031748830579">Kortnummer</translation> <translation id="261305050785128654">Gi nettsteder beskjed om hvilke språk du snakker. Nettsteder viser innhold på disse språkene når det er mulig.</translation> @@ -2720,6 +2722,7 @@ <translation id="2849936225196189499">Kritisk</translation> <translation id="285033512555869047">Lukket</translation> <translation id="2850541429955027218">Legg til temaet</translation> +<translation id="2852045827873867442">Internettilkobling er nødvendig.</translation> <translation id="285237063405807022">(laster inn)</translation> <translation id="2853121255651601031">Passordet er lagret</translation> <translation id="2855243985454069333">Sletter loggen fra alle synkroniserte enheter</translation> @@ -5432,6 +5435,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplikat</translation> <translation id="4780321648949301421">L&agre side som</translation> <translation id="4780558987886269159">For jobb</translation> +<translation id="4781633367688946589">Fortsett til en ny økt</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vil bruke personopplysninger fra den digitale lommeboken din.</translation> <translation id="4785719467058219317">Du bruker en sikkerhetsnøkkel som ikke er registrert på dette nettstedet</translation> <translation id="4785914069240823137">Avbryt beskjæring</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index e895def..51b2f44 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -3269,6 +3269,7 @@ <translation id="3269689705184377744">{COUNT,plural, =1{ଫାଇଲ୍}other{#ଟି ଫାଇଲ୍}}</translation> <translation id="326999365752735949">diff ଡାଉନ୍ଲୋଡ୍ ହେଉଛି</translation> <translation id="3270965368676314374">ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟର୍ରୁ ଫଟୋ, ସଙ୍ଗୀତ ଓ ଅନ୍ୟ ମିଡିଆ ପଢ଼ନ୍ତୁ, ପରିବର୍ତ୍ତନ କରନ୍ତୁ ଏବଂ ଡିଲିଟ୍ କରନ୍ତୁ</translation> +<translation id="3275464924531706548"><ph name="HEADER" />କୁ ସଙ୍କୁଚିତ କରନ୍ତୁ</translation> <translation id="3275778809241512831">ଆପଣଙ୍କର ଆଭ୍ୟନ୍ତରୀଣ ସୁରକ୍ଷା କୀ ବର୍ତ୍ତମାନ ଅସୁରକ୍ଷିତ ଅଟେ। ଆପଣ ବ୍ୟବହାର କରୁଥିବା ଯେ କୌଣସି ସେବାଗୁଡ଼ିକରୁ ଦୟାକରି ଏହାକୁ କାଢ଼ି ଦିଅନ୍ତୁ। ସମସ୍ୟାର ସମାଧାନ କରିବା ପାଇଁ, ସୁରକ୍ଷା କୀକୁ ଦୟାକରି ରିସେଟ୍ କରନ୍ତୁ।</translation> <translation id="3275778913554317645">ୱିଣ୍ଡୋ ଭଳି ଖୋଲନ୍ତୁ</translation> <translation id="3277214528693754078">ଟେକ୍ସଟ କର୍ସର ମାଧ୍ୟମରେ ନାଭିଗେଟ କରନ୍ତୁ (କ୍ୟାରେଟ ବ୍ରାଉଜିଂ)</translation> @@ -3600,6 +3601,7 @@ <translation id="3510471875518562537">ଆପଣଙ୍କ iPhoneରେ ଏହି ଠିକଣାକୁ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="3511200754045804813">ପୁଣି ଥରେ ସ୍କାନ୍ କରନ୍ତୁ</translation> <translation id="3511307672085573050">ଲିଙ୍କ୍ ଠି&କଣା କପି କରନ୍ତୁ</translation> +<translation id="3511358375261756531"><ph name="HEADER" />କୁ ବିସ୍ତାର କରନ୍ତୁ</translation> <translation id="351152300840026870">ନିର୍ଦ୍ଧାରିତ -ମୋଟେଇ ଥିବା ଫଣ୍ଟ</translation> <translation id="3511528412952710609">ଛୋଟ</translation> <translation id="3513019849832307207">ଯୋଗ ଦେଇ ଖୋଲନ୍ତୁ</translation> @@ -6150,6 +6152,7 @@ <translation id="5296536303670088158">କ୍ଷତିକାରକ ୱେବସାଇଟଗୁଡ଼ିକଠାରୁ ରକ୍ଷା ପାଇବା ପାଇଁ ଆପଣଙ୍କ ପାଖରେ Chromeର ସବୁଠାରୁ ଶକ୍ତିଶାଳୀ ସୁରକ୍ଷା ଅଛି</translation> <translation id="5297005732522718715">ଟିଥରିଂ କନଫିଗରେସନକୁ ରିଫ୍ରେସ କରନ୍ତୁ</translation> <translation id="5297082477358294722">ପାସ୍ୱର୍ଡ ସେଭ୍ କରାଯାଇଛି। ଆପଣଙ୍କର <ph name="SAVED_PASSWORDS_STORE" />ରେ ସେଭ୍ ହୋଇଥିବା ପାସ୍ୱର୍ଡଗୁଡ଼ିକ ଦେଖନ୍ତୁ ଏବଂ ପରିଚାଳନା କରନ୍ତୁ।</translation> +<translation id="5297548311167268289"><ph name="RP_ID" />ରେ ସାଇନ ଇନ କରନ୍ତୁ</translation> <translation id="5297946558563358707">ଯେତେବେଳେ ଅନ୍ୟ କୌଣସି ବ୍ୟକ୍ତି ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ଦେଖନ୍ତି, ସେତେବେଳେ ଆପଣଙ୍କ ସ୍କ୍ରିନର ନିମ୍ନ ଡାହାଣ ପାର୍ଶ୍ୱରେ ଗୋପନୀୟତା ଆଖି ଆଇକନ ଦେଖାନ୍ତୁ</translation> <translation id="5297984209202974345"><ph name="STYLE" /> ଷ୍ଟାଇଲରେ <ph name="SUBJECT" />ର ବର୍ତ୍ତମାନର AI ଥିମ <ph name="INDEX" /></translation> <translation id="5298219193514155779">ଦ୍ଵାରା ଥିମ୍ ସୃଷ୍ଟି ହୋଇଛି</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index e2765eaa..90972cc 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1164,6 +1164,7 @@ <translation id="1796588414813960292">Funkcje, które wymagają dźwięku, nie będą działać</translation> <translation id="1797117170091578105">Graj przy użyciu klawiatury Chromebooka. Możesz dostosować klawisze do konkretnych działań.</translation> <translation id="1798335429200675510">Kliknij prawym przyciskiem myszy w polu tekstowym, aby utworzyć wersję roboczą lub dopracować już istniejącą pracę z wykorzystaniem AI od Google. Obecnie dostępność jest ograniczona.</translation> +<translation id="1799852120691957794">Nie można przywrócić okien z poprzedniej sesji</translation> <translation id="180203835522132923">Wyszukaj + O, a następnie W</translation> <translation id="1802624026913571222">Uśpij po zamknięciu pokrywy</translation> <translation id="1802687198411089702">Strona nie odpowiada. Możesz zaczekać lub ją zamknąć.</translation> @@ -2339,6 +2340,7 @@ <translation id="2610374175948698697">Możliwość wyświetlania plików i folderów na urządzeniu</translation> <translation id="2610780100389066815">Podpisywanie listy zaufania firmy Microsoft</translation> <translation id="261114180663074524">Zaloguj się na konto Microsoft i spróbuj jeszcze raz</translation> +<translation id="2611702650078660078">Wystąpił błąd</translation> <translation id="2611776654555141051">Narzędzie Prostokąt</translation> <translation id="2612676031748830579">Numer karty</translation> <translation id="261305050785128654">Informuj witryny o językach, którymi się posługujesz. Witryny w miarę możliwości będą wyświetlać treści w tych językach.</translation> @@ -2699,6 +2701,7 @@ <translation id="2849936225196189499">Krytyczne</translation> <translation id="285033512555869047">Zamknięta</translation> <translation id="2850541429955027218">Dodaj motyw</translation> +<translation id="2852045827873867442">Wymagane jest połączenie z internetem.</translation> <translation id="285237063405807022">(wczytuję)</translation> <translation id="2853121255651601031">Hasło zostało zapisane</translation> <translation id="2855243985454069333">Usuwa historię ze wszystkich zsynchronizowanych urządzeń</translation> @@ -5409,6 +5412,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 duplikat</translation> <translation id="4780321648949301421">Zapisz stronę jako...</translation> <translation id="4780558987886269159">Do pracy</translation> +<translation id="4781633367688946589">Przejdź do nowej sesji</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> chce używać danych osobowych z Twojego cyfrowego portfela.</translation> <translation id="4785719467058219317">Używasz klucza bezpieczeństwa, który nie jest zarejestrowany w tej witrynie</translation> <translation id="4785914069240823137">Anuluj przycinanie</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 6b6d770..2a125524 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2630,7 +2630,7 @@ <translation id="2781692009645368755">Google Pay</translation> <translation id="2782104745158847185">Erro ao instalar o aplicativo Linux</translation> <translation id="2783952358106015700">Usar sua chave de segurança com <ph name="APP_NAME" /></translation> -<translation id="2785267875302712148">Check-up de senha</translation> +<translation id="2785267875302712148">Check-up de Senha</translation> <translation id="2785279781154577715">Aparência do card de visualização ao passar o cursor sobre a guia</translation> <translation id="2785873697295365461">Descritores de arquivos</translation> <translation id="2785975315093449168">GTK</translation> @@ -3178,6 +3178,7 @@ <translation id="3188465121994729530">Média móvel</translation> <translation id="3189187154924005138">Cursor grande</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 senha e outros itens foram salvos apenas neste dispositivo. Salve na sua Conta do Google para usar em outros dispositivos.}one{{PASSWORD_COUNT} senha e outros itens foram salvos apenas neste dispositivo. Salve na sua Conta do Google para usar em outros dispositivos.}other{{PASSWORD_COUNT} senhas e outros itens foram salvos apenas neste dispositivo. Salve na sua Conta do Google para usar em outros dispositivos.}}</translation> +<translation id="319044078641740013">Para voltar facilmente aos sites visitados, sincronize o histórico e as guias com <ph name="ACCOUNT_EMAIL" /></translation> <translation id="3190558889382726167">Senha salva</translation> <translation id="3192586965067888278">Descreva o problema em detalhes. O feedback será enviado ao Google para revisão humana e poderá ser usado para melhorar ou desenvolver produtos e serviços do Google.</translation> <translation id="3192947282887913208">Arquivos de áudio</translation> @@ -3283,6 +3284,7 @@ <translation id="3269689705184377744">{COUNT,plural, =1{Arquivo}one{# arquivo}other{# arquivos}}</translation> <translation id="326999365752735949">Fazendo o download do diff</translation> <translation id="3270965368676314374">Ler, alterar e excluir fotos, músicas e outras mídias do seu computador</translation> +<translation id="3275464924531706548">Fechar <ph name="HEADER" /></translation> <translation id="3275778809241512831">Sua chave de segurança interna não é segura no momento. Remova-a de todos os serviços com os quais ela foi utilizada. Para resolver o problema, redefina a chave de segurança.</translation> <translation id="3275778913554317645">Abrir como janela</translation> <translation id="3277214528693754078">Navegar com o cursor de texto (Caret Browsing)</translation> @@ -3615,6 +3617,7 @@ <translation id="3510471875518562537">Use esse endereço no seu iPhone</translation> <translation id="3511200754045804813">Verificar novamente</translation> <translation id="3511307672085573050">Copiar &endereço do link</translation> +<translation id="3511358375261756531">Abrir <ph name="HEADER" /></translation> <translation id="351152300840026870">Fonte de largura pré-determinada</translation> <translation id="3511528412952710609">Pequeno</translation> <translation id="3513019849832307207">Entrar e abrir</translation> @@ -6167,6 +6170,7 @@ <translation id="5296536303670088158">Você tem a segurança reforçada do Chrome contra sites perigosos</translation> <translation id="5297005732522718715">Atualizar configuração do tethering</translation> <translation id="5297082477358294722">Senha salva. Veja e gerencie as senhas salvas na sua <ph name="SAVED_PASSWORDS_STORE" />.</translation> +<translation id="5297548311167268289">Fazer login em <ph name="RP_ID" /></translation> <translation id="5297946558563358707">Mostrar o ícone de olho no canto inferior direito da tela quando outra pessoa olhar para ela</translation> <translation id="5297984209202974345">Tema recente de IA <ph name="INDEX" /> de <ph name="SUBJECT" /> no estilo <ph name="STYLE" /></translation> <translation id="5298219193514155779">Tema criado por</translation> @@ -10351,6 +10355,7 @@ <translation id="8280848878018088610">Ondas quebrando no mar, com uma cidade e um castelo fantásticos ao fundo, em um ambiente escuro.</translation> <translation id="828180235270931531">Outras impressoras disponíveis</translation> <translation id="8281886186245836920">Pular</translation> +<translation id="8283802069507225582">Para continuar de onde parou em outros dispositivos, sincronize o histórico e as guias com <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8284279544186306258">todos os sites de <ph name="WEBSITE_1" /></translation> <translation id="8284326494547611709">Legendas</translation> <translation id="8286036467436129157">Fazer login</translation> @@ -11028,6 +11033,7 @@ <translation id="8754200782896249056"><p> Durante a execução do <ph name="PRODUCT_NAME" /> em um ambiente de computador compatível, serão utilizadas as configurações de proxy do sistema. No entanto, seu sistema não é suportado ou ocorreu um problema ao iniciar a configuração do sistema.</p> <p>Porém, você ainda pode configurar por meio da linha de comando. Consulte <code>man <ph name="PRODUCT_BINARY_NAME" /></code> para ver mais informações sobre variáveis de sinalizadores e ambiente.</p></translation> +<translation id="8754810799862630650">Para ver as guias abertas usando outros computadores e smartphones, sincronize o histórico e as guias com <ph name="ACCOUNT_EMAIL" /></translation> <translation id="8755175579224030324">Realizar tarefas relacionadas à segurança para sua organização, como gerenciar certificados e chaves armazenadas no dispositivo.</translation> <translation id="875532100880844232">Para o <ph name="DEVICE_NAME" />, escolha uma ação para cada tecla</translation> <translation id="8755376271068075440">&Maior</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 9f8c3d3..b70863f 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1163,6 +1163,7 @@ <translation id="1796588414813960292">Opțiunile care au nevoie de sunet nu vor funcționa</translation> <translation id="1797117170091578105">Joacă-te folosind tastatura Chromebookului. Poți personaliza cheile în funcție de anumite acțiuni.</translation> <translation id="1798335429200675510">Dă clic dreapta într-o casetă text pentru a crea o schiță sau pentru a rafina lucrările existente, bazate pe Google AI. Momentan are disponibilitate limitată.</translation> +<translation id="1799852120691957794">Nu se pot restabili ferestrele din sesiunea anterioară</translation> <translation id="180203835522132923">Tasta de căutare + O, apoi W</translation> <translation id="1802624026913571222">Când capacul este închis: modul inactiv</translation> <translation id="1802687198411089702">Pagina nu răspunde. Poți aștepta să răspundă sau o poți închide.</translation> @@ -2354,6 +2355,7 @@ <translation id="2610374175948698697">Poate să vadă fișierele sau dosarele de pe dispozitiv</translation> <translation id="2610780100389066815">Semnarea listei de încredere Microsoft</translation> <translation id="261114180663074524">Conectează-te la contul Microsoft și încearcă din nou</translation> +<translation id="2611702650078660078">A apărut o eroare</translation> <translation id="2611776654555141051">Instrument pentru dreptunghiuri</translation> <translation id="2612676031748830579">Număr card</translation> <translation id="261305050785128654">Permite site-urilor să afle limbile pe care le vorbești. Acestea vor afișa conținutul în limbile respective, dacă este posibil.</translation> @@ -2714,6 +2716,7 @@ <translation id="2849936225196189499">Critic</translation> <translation id="285033512555869047">Închis</translation> <translation id="2850541429955027218">Adaugă o temă</translation> +<translation id="2852045827873867442">Este necesară o conexiune la internet.</translation> <translation id="285237063405807022">(se încarcă)</translation> <translation id="2853121255651601031">Parola a fost salvată</translation> <translation id="2855243985454069333">Șterge istoricul de pe toate dispozitivele sincronizate</translation> @@ -5427,6 +5430,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • o dublură</translation> <translation id="4780321648949301421">Salvează pagina ca...</translation> <translation id="4780558987886269159">Pentru serviciu</translation> +<translation id="4781633367688946589">Continuă cu noua sesiune</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> dorește să-ți folosească informațiile cu caracter personal din portofelul digital.</translation> <translation id="4785719467058219317">Folosești o cheie de securitate care nu este înregistrată pe acest site</translation> <translation id="4785914069240823137">Anulează decuparea</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 4aeacf2..2b59bc3 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1164,6 +1164,7 @@ <translation id="1796588414813960292">Функции, которые используют звук, не будут работать</translation> <translation id="1797117170091578105">Играйте с помощью клавиатуры Chromebook. Клавиши можно настроить таким образом, чтобы они отвечали за выполнение определенных действий.</translation> <translation id="1798335429200675510">Нажмите правой кнопкой на текстовое поле, чтобы создать черновик или улучшить контент с помощью технологий ИИ от Google. Пока функция доступна не всем.</translation> +<translation id="1799852120691957794">Не удалось восстановить окна из предыдущего сеанса</translation> <translation id="180203835522132923">Поиск + O, затем W</translation> <translation id="1802624026913571222">Переходить в спящий режим при закрытии крышки</translation> <translation id="1802687198411089702">Страница не отвечает. Вы можете закрыть ее или дождаться ответа сервера.</translation> @@ -2355,6 +2356,7 @@ <translation id="2610374175948698697">Файлы, которым разрешено просматривать файлы и папки на устройстве</translation> <translation id="2610780100389066815">Подписывание списка доверия (Microsoft)</translation> <translation id="261114180663074524">Войдите в аккаунт Microsoft и повторите попытку.</translation> +<translation id="2611702650078660078">Произошла ошибка.</translation> <translation id="2611776654555141051">Инструмент "Прямоугольник"</translation> <translation id="2612676031748830579">Номер карты</translation> <translation id="261305050785128654">Укажите, какими языками вы владеете. Тогда контент на сайтах будет по возможности показываться на выбранных языках.</translation> @@ -2715,6 +2717,7 @@ <translation id="2849936225196189499">Критическое</translation> <translation id="285033512555869047">Закрытая</translation> <translation id="2850541429955027218">Добавить тему</translation> +<translation id="2852045827873867442">Требуется подключение к интернету.</translation> <translation id="285237063405807022">(загружается)</translation> <translation id="2853121255651601031">Пароль сохранен</translation> <translation id="2855243985454069333">История будет удалена со всех синхронизируемых устройств</translation> @@ -5429,6 +5432,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 копия</translation> <translation id="4780321648949301421">Сохранить страницу как...</translation> <translation id="4780558987886269159">Для работы</translation> +<translation id="4781633367688946589">Начать новый сеанс</translation> <translation id="4784349455504343791">Сайт <ph name="WEBSITE_ORIGIN" /> запрашивает разрешение на использование вашей личной информации из электронного кошелька.</translation> <translation id="4785719467058219317">Вы используете электронный ключ, который не зарегистрирован на этом сайте.</translation> <translation id="4785914069240823137">Отменить кадрирование</translation> @@ -8829,7 +8833,7 @@ <translation id="7235716375204803342">Загрузка действий...</translation> <translation id="7235737137505019098">На электронном ключе не хватает места для нового аккаунта.</translation> <translation id="7235873936132740888">Когда вы нажимаете на определенные типы ссылок, сайты могут выполнять специальные задачи, например создавать новое сообщение в почтовом клиенте или добавлять мероприятие в календарь.</translation> -<translation id="7237454422623102448">Открыть настройки системы</translation> +<translation id="7237454422623102448">Настройки системы</translation> <translation id="7237820815228048635">Для <ph name="EXAMPLE_DOMAIN_1" /> и <ph name="EXAMPLE_DOMAIN_2" />.</translation> <translation id="7238609589076576185">Диакритический знак вставлен.</translation> <translation id="7239108166256782787">Передача данных с устройства "<ph name="DEVICE_NAME" />" остановлена</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index a261feb..3060e8c0 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -3165,6 +3165,7 @@ <translation id="3188465121994729530">ගෙනයෑම් සාමාන්යය</translation> <translation id="3189187154924005138">විශාල කර්සරය</translation> <translation id="3189533916970342007">{PASSWORD_COUNT,plural, =1{1 මුරපදයක් සහ අනෙකුත් අයිතම මෙම උපාංගයට පමණක් සුරැකේ. ඒවා ඔබේ අනෙකුත් උපාංගවල භාවිතා කිරීම සඳහා, ඒවා ඔබේ Google ගිණුමේ සුරකින්න.}one{මුරපද {PASSWORD_COUNT}ක් සහ අනෙකුත් අයිතම මෙම උපාංගයට පමණක් සුරැකේ. ඒවා ඔබේ අනෙකුත් උපාංගවල භාවිතා කිරීම සඳහා, ඒවා ඔබේ Google ගිණුමේ සුරකින්න.}other{මුරපද {PASSWORD_COUNT}ක් සහ අනෙකුත් අයිතම මෙම උපාංගයට පමණක් සුරැකේ. ඒවා ඔබේ අනෙකුත් උපාංගවල භාවිතා කිරීම සඳහා, ඒවා ඔබේ Google ගිණුමේ සුරකින්න.}}</translation> +<translation id="319044078641740013">ඔබ පිවිසි අඩවි වෙත පහසුවෙන් ආපසු යාමට, ඔබේ ඉතිහාසය සහ පටිති <ph name="ACCOUNT_EMAIL" /> වෙත සමමුහුර්ත කරන්න</translation> <translation id="3190558889382726167">මුරපදය සුරැකිණි</translation> <translation id="3192586965067888278">ගැටලුව විස්තරාත්මකව විස්තර කරන්න. ප්රතිපෝෂණ මානව සමාලෝචනය සඳහා Google වෙත යවනු ලබන අතර Google නිෂ්පාදන සහ සේවා වැඩි දියුණු කිරීම හෝ සංවර්ධනය කිරීම සඳහා භාවිතා කළ හැක.</translation> <translation id="3192947282887913208">ශ්රව්ය ගොනුව</translation> @@ -3270,6 +3271,7 @@ <translation id="3269689705184377744">{COUNT,plural, =1{ගොනුව}one{ගොනු #}other{ගොනු #}}</translation> <translation id="326999365752735949">diff බාගනිමින්</translation> <translation id="3270965368676314374">ඔබගේ පරිගණකයෙන් ඡායාරූප, සංගීතය, සහ වෙනත් මාධ්යය කියවා, වෙනස් කර මකන්න</translation> +<translation id="3275464924531706548"><ph name="HEADER" /> හකුළන්න</translation> <translation id="3275778809241512831">ඔබේ අභ්යන්තර ආරක්ෂක යතුර දැනට සුරක්ෂිත නොවේ. ඔබ එය සමඟ භාවිත කිසියම් සේවාවලින් එය ඉවත් කරන්න. ගැටලුව විසඳීමට, ආරක්ෂක යතුර ප්රතිසාධන කරන්න.</translation> <translation id="3275778913554317645">කවුළුවක් විවෘත කරන්න</translation> <translation id="3277214528693754078">පෙළ කර්සරය සමග සංචාලනය කරන්න (කැරට් බ්රවුස් කිරීම)</translation> @@ -3601,6 +3603,7 @@ <translation id="3510471875518562537">ඔබේ iPhone හි මෙම ලිපිනය භාවිත කරන්න</translation> <translation id="3511200754045804813">නැවත ස්කෑන් කරන්න</translation> <translation id="3511307672085573050">සබැඳි ලිපිනය පෙන්වන්න</translation> +<translation id="3511358375261756531"><ph name="HEADER" /> දිග හරින්න</translation> <translation id="351152300840026870">අචල-පළලැති අකුරු</translation> <translation id="3511528412952710609">කොට</translation> <translation id="3513019849832307207">එකතු වී විවෘත කරන්න</translation> @@ -6153,6 +6156,7 @@ <translation id="5296536303670088158">ඔබට හානිකර වෙබ් අඩවිවලට එරෙහිව Chrome හි ශක්තිමත්ම ආරක්ෂාව ඇත</translation> <translation id="5297005732522718715">ටෙදරින් වින්යාසය නැවුම් කරන්න</translation> <translation id="5297082477358294722">මුරපදය සුරකින ලදි. ඔබගේ <ph name="SAVED_PASSWORDS_STORE" /> හි සුරකින ලද මුරපද බලන්න සහ කළමනාකරණය කරන්න.</translation> +<translation id="5297548311167268289"><ph name="RP_ID" /> වෙත පුරන්න</translation> <translation id="5297946558563358707">වෙනත් යම් කෙනෙකු ඔබගේ තිරය දෙස බලන විට, ඔබගේ තිරයේ පහළ දකුණේ ඇති පෞද්ගලිකත්ව අක්ෂි නිරූපකය පෙන්වන්න</translation> <translation id="5297984209202974345"><ph name="STYLE" /> විලාසය තුළ <ph name="SUBJECT" /> න් <ph name="INDEX" /> මෑත AI තේමාව</translation> <translation id="5298219193514155779">මෙමගින් සාදන ල තේමාව</translation> @@ -10332,6 +10336,7 @@ <translation id="8280848878018088610">මුහුදේ කඩා වැටෙන රළ, පසුබිමේ අපූරු නගරයක් සහ බලකොටුවක්, අඳුරු මනෝභාවයකින්.</translation> <translation id="828180235270931531">පවතින වෙනත් මුද්රක</translation> <translation id="8281886186245836920">මඟහරින්න</translation> +<translation id="8283802069507225582">ඔබ වෙනත් උපාංගවල නතර කළ තැනින් පටන් ගැනීමට, ඔබේ ඉතිහාසය සහ පටිති <ph name="ACCOUNT_EMAIL" /> වෙත සමමුහුර්ත කරන්න</translation> <translation id="8284279544186306258">සියලු <ph name="WEBSITE_1" /> අඩවි</translation> <translation id="8284326494547611709">සිරස්තල</translation> <translation id="8286036467436129157">පුරන්න</translation> @@ -11009,6 +11014,7 @@ <translation id="8754200782896249056"><p>සහාය දක්වන වැඩතල පරිසරයක් යටතේ <ph name="PRODUCT_NAME" /> ධාවන වන විට, පද්ධති ප්රොක්සි සැකසුම් භාවිතා කරනු ඇත. කෙසේ වුවත්, එක්කෝ ඔබගේ පද්ධතිය සහාය නොදක්වයි නැතහොත් ඔබගේ පද්ධති වින්යාසය දියත් කිරීමේ ගැටලුවක් විය.</p> <p>නමුත් තවමත් ඔබට විධාන පේළිය හරහා වින්යාස කළ හැක. කරුණාකර සලකුණු සහ පරිසර විචල්යවල වැඩිදුර තොරතුරු සඳහා <code>man <ph name="PRODUCT_BINARY_NAME" /></code> බලන්න.</p></translation> +<translation id="8754810799862630650">ඔබේ අනෙකුත් පරිගණක සහ දුරකථන වලින් විවෘත පටිති බැලීමට, ඔබේ ඉතිහාසය සහ පටිති <ph name="ACCOUNT_EMAIL" /> වෙත සමමුහුර්ත කරන්න</translation> <translation id="8755175579224030324">උපාංගයේ ගබඩා කළ සහතික සහ යතුරු කළමනාකරණය කිරීම යනාදි ඔබේ සංවිධානය සඳහා ආරක්ෂාවට අදාළ කාර්ය සිදු කිරීම</translation> <translation id="875532100880844232"><ph name="DEVICE_NAME" /> සඳහා, එක් එක් යතුර සඳහා ක්රියාවක් තෝරා ගන්න</translation> <translation id="8755376271068075440">විශාල (&L)</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 873e52e0..6495832 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -5180,6 +5180,7 @@ <translation id="4585793705637313973">Urejanje strani</translation> <translation id="4586275095964870617"><ph name="URL" /> ni bilo mogoče odpreti v nadomestnem brskalniku. Obrnite se na skrbnika sistema.</translation> <translation id="4587589328781138893">Spletna mesta</translation> +<translation id="4588497044036650559">Odpiranje strani z možnostmi razširitve za stran novega zavihka v trenutnem zavihku</translation> <translation id="4588749726511456218">Pospeševanje pomikanja <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="4589197033939192905">Videti je, da je med <ph name="PASSWORD_DOMAIN" /> in <ph name="DOMAIN" /> povezava. Preden uporabite to geslo, se prepričajte, da zaupate <ph name="DOMAIN" />.</translation> <translation id="4589713469967853491">Dnevniki so bili uspešno zapisani v mapo Prenosi.</translation> @@ -9165,6 +9166,7 @@ <translation id="7461924472993315131">Pripni</translation> <translation id="746216226901520237">Naslednjič bo telefon odklenil napravo <ph name="DEVICE_TYPE" />. Funkcijo Smart Lock lahko izklopite v nastavitvah.</translation> <translation id="746329643760972486">macOS</translation> +<translation id="7463985990119325874">Vaša organizacija upravlja, kako se morda uporabljajo podatki, ki jih zberejo te funkcije.</translation> <translation id="7464645554245611385">Zadnja posodobitev tega zavihka</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# odprt zavihek, pritisnite za preklop traka z zavihki}one{# odprt zavihek, pritisnite za preklop traka z zavihki}two{# odprta zavihka, pritisnite za preklop traka z zavihki}few{# odprti zavihki, pritisnite za preklop traka z zavihki}other{# odprtih zavihkov, pritisnite za preklop traka z zavihki}}</translation> <translation id="7465635034594602553">Prišlo je do napake. Počakajte nekaj minut, nato znova zaženite aplikacijo <ph name="APP_NAME" />.</translation> @@ -11731,6 +11733,7 @@ <translation id="934244546219308557">Poimenujte to skupino</translation> <translation id="93480724622239549">Napaka</translation> <translation id="9354763467503131">Dovoljeno je zahtevati namestitev spletnih aplikacij v napravi</translation> +<translation id="936329857119665832">Odpre se v trenutnem zavihku</translation> <translation id="936646668635477464">Kamera in mikrofon</translation> <translation id="936801553271523408">Sistemski diagnostični podatki</translation> <translation id="93766956588638423">Popravi razširitev</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index aa0a5d6..084f5a6 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -3267,6 +3267,7 @@ <translation id="3269689705184377744">{COUNT,plural, =1{Skedar}other{# skedarë}}</translation> <translation id="326999365752735949">Diferenca e shkarkimit</translation> <translation id="3270965368676314374">Lexo, ndrysho dhe fshi fotografi, muzikë dhe media të tjera nga kompjuteri yt</translation> +<translation id="3275464924531706548">Palos: <ph name="HEADER" /></translation> <translation id="3275778809241512831">Çelësi yt i brendshëm i sigurisë është aktualisht i pasigurt. Hiqe atë nga çdo shërbim me të cilin e ke përdorur. Për të zgjidhur problemin, rivendos çelësin e sigurisë.</translation> <translation id="3275778913554317645">Hape si dritare</translation> <translation id="3277214528693754078">Navigo me kursorin e tekstit (shfletimi me kursorin e tekstit)</translation> @@ -3598,6 +3599,7 @@ <translation id="3510471875518562537">Përdor këtë adresë në iPhone</translation> <translation id="3511200754045804813">Skano sërish</translation> <translation id="3511307672085573050">Kopjo adr&esën e lidhjes</translation> +<translation id="3511358375261756531">Zgjero: <ph name="HEADER" /></translation> <translation id="351152300840026870">Shkrim me gjerësi fikse</translation> <translation id="3511528412952710609">E shkurtër</translation> <translation id="3513019849832307207">Bashkohu dhe hap</translation> @@ -6148,6 +6150,7 @@ <translation id="5296536303670088158">Ti ke sigurinë më të fortë të Chrome kundër sajteve të dëmshme të uebit</translation> <translation id="5297005732522718715">Rifresko konfigurimin e ndarjes së internetit</translation> <translation id="5297082477358294722">Fjalëkalimi u ruajt. Shfaq dhe menaxho fjalëkalimet e ruajtura në <ph name="SAVED_PASSWORDS_STORE" />.</translation> +<translation id="5297548311167268289">Identifikohu në <ph name="RP_ID" /></translation> <translation id="5297946558563358707">Kur dikush tjetër shikon ekranin tënd, shfaq ikonën e "Syrit të privatësisë" në pjesën e poshtme djathtas të ekranit</translation> <translation id="5297984209202974345">Tema e fundit me IA <ph name="INDEX" /> nga "<ph name="SUBJECT" />", në stilin "<ph name="STYLE" />"</translation> <translation id="5298219193514155779">Tema u krijua nga</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 77f049ed..a4ecfb0 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1171,6 +1171,7 @@ <translation id="1796588414813960292">Funktioner som kräver ljud slutar fungera</translation> <translation id="1797117170091578105">Spela med tangentbordet på Chromebook. Du kan tilldela tangenter specifika funktioner.</translation> <translation id="1798335429200675510">Högerklicka i en textruta för att skapa ett utkast eller finjustera befintligt arbete med hjälp av Google AI. Har för närvarande begränsad tillgänglighet.</translation> +<translation id="1799852120691957794">Det gick inte att återställa fönster från din senaste session</translation> <translation id="180203835522132923">Sök + O, sedan W</translation> <translation id="1802624026913571222">Aktivera viloläge när fodralet stängs</translation> <translation id="1802687198411089702">Sidan svarar inte. Vänta tills den svarar eller avbryt.</translation> @@ -2366,6 +2367,7 @@ <translation id="2610374175948698697">Får visa filer eller mappar på enheten</translation> <translation id="2610780100389066815">Microsofts Signering av lista över betrodda certifikat</translation> <translation id="261114180663074524">Logga in på Microsoft-kontot och försök igen</translation> +<translation id="2611702650078660078">Något gick fel</translation> <translation id="2611776654555141051">Rektangelverktyg</translation> <translation id="2612676031748830579">Kortnummer</translation> <translation id="261305050785128654">Visa webbplatser vilka språk du talar. Om möjligt visas innehåll på de språken.</translation> @@ -2726,6 +2728,7 @@ <translation id="2849936225196189499">Kritiskt</translation> <translation id="285033512555869047">Stängd</translation> <translation id="2850541429955027218">Lägg till tema</translation> +<translation id="2852045827873867442">Internetanslutning krävs.</translation> <translation id="285237063405807022">(läser in)</translation> <translation id="2853121255651601031">Lösenordet sparades</translation> <translation id="2855243985454069333">Raderar historiken från alla synkroniserade enheter.</translation> @@ -5440,6 +5443,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 dubblett</translation> <translation id="4780321648949301421">Spara sida som...</translation> <translation id="4780558987886269159">För arbete</translation> +<translation id="4781633367688946589">Fortsätt till ny session</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> vill använda personliga uppgifter från din digitala plånbok.</translation> <translation id="4785719467058219317">Säkerhetsnyckeln som du använder är inte registrerad på den här webbplatsen</translation> <translation id="4785914069240823137">Avbryt beskärning</translation> @@ -5826,7 +5830,7 @@ <translation id="5059429103770496207">Visningsformat</translation> <translation id="5059526285558225588">Välj vad du vill dela</translation> <translation id="5060332552815861872">Det finns 1 skrivare att spara.</translation> -<translation id="5060419232449737386">Bildtextinställningar</translation> +<translation id="5060419232449737386">Textningsinställningar</translation> <translation id="5061270227873845372">Du har för närvarande <ph name="NUMBERED_ITEM_1" />, <ph name="NUMBERED_ITEM_2" />, <ph name="NUMBERED_ITEM_3" /> med mera. Organisationen kan se och hantera denna data</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Den här mappen innehåller ett bokmärke. Vill du ta bort den?}other{Den här mappen innehåller # bokmärken. Vill du ta bort den?}}</translation> <translation id="5061531353537614467">Tundra</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 211bcdbc..a47f3cb9f 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1171,6 +1171,7 @@ <translation id="1796588414813960292">ஒலியுடன் இயங்கும் அம்சங்கள் செயல்படாது</translation> <translation id="1797117170091578105">உங்கள் Chromebook கீபோர்டைப் பயன்படுத்தி விளையாடுங்கள். குறிப்பிட்ட செயல்களுக்கு பட்டன்களைப் பிரத்தியேகமாக்கலாம்.</translation> <translation id="1798335429200675510">வாக்கியப் பெட்டியில் வலது கிளிக் செய்து Google AI வழங்கும் கருவி மூலம் வரைவை உருவாக்கலாம், ஏற்கெனவே உள்ளவற்றை மேம்படுத்தலாம். தற்போது குறிப்பிட்ட நாடுகளில் மட்டுமே கிடைக்கிறது.</translation> +<translation id="1799852120691957794">உங்களின் முந்தைய அமர்வில் இருந்து சாளரங்களை மீட்டெடுக்க முடியவில்லை</translation> <translation id="180203835522132923">Search + O, அதன் பின்னர் W</translation> <translation id="1802624026913571222">கவர் மூடப்பட்டிருக்கும்போது உறக்கநிலைக்குச் செல்</translation> <translation id="1802687198411089702">பக்கம் செயல்படவில்லை. காத்திருக்கவும் அல்லது வெளியேறவும்.</translation> @@ -2366,6 +2367,7 @@ <translation id="2610374175948698697">உங்கள் சாதனத்தில் பார்ப்பதற்கான அணுகல் உள்ள ஃபைல்கள் அல்லது ஃபோல்டர்கள்</translation> <translation id="2610780100389066815">Microsoft Trust List Signing</translation> <translation id="261114180663074524">Microsoft கணக்கில் உள்நுழைந்து மீண்டும் முயலவும்</translation> +<translation id="2611702650078660078">பிழை ஏற்பட்டது</translation> <translation id="2611776654555141051">செவ்வகத்தைச் சேர்ப்பதற்கான கருவி</translation> <translation id="2612676031748830579">கார்டு எண்</translation> <translation id="261305050785128654">நீங்கள் பேசும் மொழிகளை இணையதளங்களுக்குத் தெரியப்படுத்துங்கள். கிடைக்கும்பட்சத்தில், அந்த மொழிகளில் உள்ளடக்கத்தை அவை காட்டும்.</translation> @@ -2726,6 +2728,7 @@ <translation id="2849936225196189499">சிக்கலான</translation> <translation id="285033512555869047">மூடப்பட்டுள்ளது</translation> <translation id="2850541429955027218">தீமினைச் சேர்</translation> +<translation id="2852045827873867442">இணைய இணைப்பு தேவை.</translation> <translation id="285237063405807022">(ஏற்றுகிறது)</translation> <translation id="2853121255651601031">கடவுச்சொல் சேமிக்கப்பட்டது</translation> <translation id="2855243985454069333">ஒத்திசைக்கப்பட்ட அனைத்து சாதனங்களில் இருந்தும் பதிவை நீக்கும்</translation> @@ -5440,6 +5443,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 நகல்</translation> <translation id="4780321648949301421">பக்கத்தை இவ்வாறு சேமி...</translation> <translation id="4780558987886269159">பணிக்கானது</translation> +<translation id="4781633367688946589">புதிய அமர்விற்குச் செல்லுங்கள்</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> உங்கள் டிஜிட்டல் வாலட்டில் உள்ள தனிப்பட்ட தகவல்களைப் பயன்படுத்த விரும்புகிறது.</translation> <translation id="4785719467058219317">இந்த இணையதளத்தில் பதிவுசெய்யப்படாத பாதுகாப்பு விசையைப் பயன்படுத்துகிறீர்கள்</translation> <translation id="4785914069240823137">செதுக்கியதை ரத்துசெய்யும்</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index dbdad68..f21ba15 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -24,7 +24,7 @@ <translation id="1010136228650201057">యూజర్ డేటా ఎన్క్రిప్షన్</translation> <translation id="1010225406377140704">కొత్త లింక్ కోసం అడగడానికి పంపినవారిని సంప్రదించండి</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{పేజీ ప్రతిస్పందించడం లేదు}other{పేజీలు ప్రతిస్పందించడం లేదు}}</translation> -<translation id="1011003645819296594">సేవ్ చేసిన పరికరాలు</translation> +<translation id="1011003645819296594">సేవ్ చేసిన డివైజ్లు</translation> <translation id="1011355516189274711">టెక్ట్స్-టు-స్పీచ్ వాల్యూమ్</translation> <translation id="1011431628606634753">Google Password Manager కోసం మీ రికవరీ PINను మార్చండి</translation> <translation id="1012794136286421601">మీ డాక్స్, షీట్లు, స్లయిడ్లు మరియు డ్రాయింగ్ల ఫైళ్లు సింక్ చేయబడుతున్నాయి. వీటిని ఆన్లైన్ లేదా ఆఫ్లైన్లో యాక్సెస్ చేయడానికి Google Drive యాప్ని తెరవండి.</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 5742e1b..080bbd6 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1174,6 +1174,7 @@ <translation id="1796588414813960292">Функції, яким потрібен звук, не працюватимуть</translation> <translation id="1797117170091578105">Грайте за допомогою клавіатури Chromebook. Ви можете налаштувати клавіші для певних дій.</translation> <translation id="1798335429200675510">Натисніть текстове поле правою кнопкою миші, щоб створити чернетку або покращити наявний текст завдяки ШІ від Google. Зараз ця функція доступна не для всіх.</translation> +<translation id="1799852120691957794">Не вдалося відновити вікна з попереднього сеансу</translation> <translation id="180203835522132923">Клавіша пошуку + O, а потім – W</translation> <translation id="1802624026913571222">Переходити в режим сну, коли кришка закрита</translation> <translation id="1802687198411089702">Сторінка не відповідає. Зачекайте або закрийте її.</translation> @@ -2369,6 +2370,7 @@ <translation id="2610374175948698697">Може переглядати файли або папки на пристрої</translation> <translation id="2610780100389066815">Підписування списку довіри Microsoft</translation> <translation id="261114180663074524">Увійдіть в обліковий запис Microsoft і повторіть спробу</translation> +<translation id="2611702650078660078">Сталася помилка</translation> <translation id="2611776654555141051">Інструмент "Прямокутник"</translation> <translation id="2612676031748830579">Номер картки</translation> <translation id="261305050785128654">Укажіть мови, якими ви розмовляєте. За можливості контент на вебсайтах відображатиметься цими мовами.</translation> @@ -2729,6 +2731,7 @@ <translation id="2849936225196189499">Вирішальні</translation> <translation id="285033512555869047">Закрито</translation> <translation id="2850541429955027218">Додати тему</translation> +<translation id="2852045827873867442">Потрібне інтернет-з’єднання.</translation> <translation id="285237063405807022">(завантажується)</translation> <translation id="2853121255651601031">Пароль збережено</translation> <translation id="2855243985454069333">Історію буде видалено з усіх синхронізованих пристроїв</translation> @@ -5443,6 +5446,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 копія</translation> <translation id="4780321648949301421">Зберегти сторінку як...</translation> <translation id="4780558987886269159">Для роботи</translation> +<translation id="4781633367688946589">Почати новий сеанс</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> хоче використовувати особисту інформацію з вашого цифрового гаманця.</translation> <translation id="4785719467058219317">Ви використовуєте ключ безпеки, не зареєстрований на цьому веб-сайті</translation> <translation id="4785914069240823137">Скасувати обрізування</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index e6343e5..c099bda4 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -5164,6 +5164,7 @@ <translation id="4585793705637313973">Sahifani tahrirlash</translation> <translation id="4586275095964870617"><ph name="URL" /> muqobil brauzerda ochilmadi. Tizim administratoriga muroojat qiling.</translation> <translation id="4587589328781138893">Sites</translation> +<translation id="4588497044036650559">Yangi varaq sahifasi kengaytmasining sozlamalari sahifasini joriy varaqda ochish</translation> <translation id="4588749726511456218">Varaqlash tezlatkichi <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="4589197033939192905"><ph name="PASSWORD_DOMAIN" /> va <ph name="DOMAIN" /> resurslari bogʻliq shekilli. Bu paroldan foydalanishdan oldin <ph name="DOMAIN" /> resursi ishonchli ekanini tekshiring.</translation> <translation id="4589713469967853491">Jurnallar odatda Yuklanmalar jildiga yoziladi.</translation> @@ -9139,6 +9140,7 @@ <translation id="7461924472993315131">Qadab qo‘yish</translation> <translation id="746216226901520237">Keyingi safar telefoningiz <ph name="DEVICE_TYPE" /> qurilmasini qulfdan chiqara oladi. Sozlamalar orqali Smart Lock funksiyasini faolsizlantirish mumkin.</translation> <translation id="746329643760972486">MacOS</translation> +<translation id="7463985990119325874">Tashkilotingiz bu funksiyalar orqali jamlangan axborotlar qanday ishlatilishini boshqaradi.</translation> <translation id="7464645554245611385">Bu varaqqa oid oxirgi xabar</translation> <translation id="7465522323587461835">{NUM_OPEN_TABS,plural, =1{# ta ochiq varaq, darchalar panelini yoqish uchun bosing}other{# ta ochiq varaq, darchalar panelini yoqish uchun bosing}}</translation> <translation id="7465635034594602553">Xatolik yuz berdi. Bir necha daqiqadan keyin <ph name="APP_NAME" /> ilovasini qaytadan ishga tushiring.</translation> @@ -11700,6 +11702,7 @@ <translation id="934244546219308557">Bu guruhni nomlang</translation> <translation id="93480724622239549">Nosozlik yoki xatolik</translation> <translation id="9354763467503131">Qurilmangizda veb ilovalarni oʻrnatish uchun ruxsat soʻrashi mumkin</translation> +<translation id="936329857119665832">Joriy varaqda ochiladi</translation> <translation id="936646668635477464">Kamera va mikrofon</translation> <translation id="936801553271523408">Tizim diagnostik ma’lumotlari</translation> <translation id="93766956588638423">Kengaytmani ta’mirlash</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index ddc581a1..c3c7c0b 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1157,6 +1157,7 @@ <translation id="1796588414813960292">所有需要使用声音的功能都将无法正常运行</translation> <translation id="1797117170091578105">使用 Chromebook 键盘玩游戏。您可以为特定操作自定义按键。</translation> <translation id="1798335429200675510">右键点击文本框即可创建草稿或润色现有作品,此功能由 Google AI 赋能。目前仅面向部分用户提供。</translation> +<translation id="1799852120691957794">无法恢复上一次会话中的窗口</translation> <translation id="180203835522132923">搜索键 + O,然后按 W</translation> <translation id="1802624026913571222">合盖后休眠</translation> <translation id="1802687198411089702">该页面没有响应。您可以继续等待,也可以退出。</translation> @@ -2345,6 +2346,7 @@ <translation id="2610374175948698697">可以查看您设备上的文件或文件夹</translation> <translation id="2610780100389066815">Microsoft 信任列表签名</translation> <translation id="261114180663074524">请登录您的 Microsoft 账号,然后重试</translation> +<translation id="2611702650078660078">发生了错误</translation> <translation id="2611776654555141051">矩形工具</translation> <translation id="2612676031748830579">卡号</translation> <translation id="261305050785128654">让网站知道您所用的语言。它们将尽可能以这些语言显示内容。</translation> @@ -2705,6 +2707,7 @@ <translation id="2849936225196189499">关键</translation> <translation id="285033512555869047">已关闭</translation> <translation id="2850541429955027218">添加主题背景</translation> +<translation id="2852045827873867442">需要联网。</translation> <translation id="285237063405807022">(加载中)</translation> <translation id="2853121255651601031">密码已保存</translation> <translation id="2855243985454069333">从所有已同步的设备中删除历史记录</translation> @@ -5416,6 +5419,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 个重复项</translation> <translation id="4780321648949301421">页面存储为...</translation> <translation id="4780558987886269159">用于工作</translation> +<translation id="4781633367688946589">继续新会话</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> 想使用您数字钱包中的个人信息。</translation> <translation id="4785719467058219317">您使用的安全密钥尚未在此网站注册</translation> <translation id="4785914069240823137">取消剪裁</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 74e6a23..1e777961 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1170,6 +1170,7 @@ <translation id="1796588414813960292">需要使用音訊的功能將無法運作</translation> <translation id="1797117170091578105">使用 Chromebook 鍵盤玩遊戲。您可為特定動作自訂按鍵。</translation> <translation id="1798335429200675510">在文字框中按一下右鍵,即可採用 Google AI 技術建立草稿或修正現有作品。此功能目前僅供部分使用者使用。</translation> +<translation id="1799852120691957794">無法從上一個工作階段還原視窗</translation> <translation id="180203835522132923">搜尋 + O,然後按 W</translation> <translation id="1802624026913571222">蓋上機蓋時進入休眠狀態</translation> <translation id="1802687198411089702">網頁沒有回應,您可以繼續等待或離開。</translation> @@ -2366,6 +2367,7 @@ <translation id="2610374175948698697">可查看裝置上的檔案或資料夾</translation> <translation id="2610780100389066815">Microsoft 信任清單簽署</translation> <translation id="261114180663074524">請登入 Microsoft 帳戶,然後再試一次</translation> +<translation id="2611702650078660078">發生錯誤</translation> <translation id="2611776654555141051">長方形工具</translation> <translation id="2612676031748830579">信用卡號碼</translation> <translation id="261305050785128654">如果網站知道你使用哪些語言,就會盡可能以這些語言顯示內容。</translation> @@ -2725,6 +2727,7 @@ <translation id="2849936225196189499">重要</translation> <translation id="285033512555869047">已關閉</translation> <translation id="2850541429955027218">新增主題</translation> +<translation id="2852045827873867442">需要互聯網連線。</translation> <translation id="285237063405807022">(正在載入)</translation> <translation id="2853121255651601031">密碼已儲存</translation> <translation id="2855243985454069333">從所有已同步的裝置刪除記錄</translation> @@ -5434,6 +5437,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 個重複的分頁</translation> <translation id="4780321648949301421">另存網頁…</translation> <translation id="4780558987886269159">工作時</translation> +<translation id="4781633367688946589">繼續新工作階段</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> 想使用你電子錢包中的個人資料。</translation> <translation id="4785719467058219317">您目前使用的安全密鑰並未在此網站註冊</translation> <translation id="4785914069240823137">取消裁剪</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index 9d2d0fd0..962b29f 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1162,6 +1162,7 @@ <translation id="1796588414813960292">需要使用音訊的功能將無法運作</translation> <translation id="1797117170091578105">使用 Chromebook 鍵盤玩遊戲。你可以為特定動作自訂按鍵。</translation> <translation id="1798335429200675510">在文字方塊中按一下滑鼠右鍵,即可運用 Google AI 技術建立草稿或修正現有作品。這項功能目前僅供部分使用者使用。</translation> +<translation id="1799852120691957794">無法還原上一個工作階段中的視窗</translation> <translation id="180203835522132923">搜尋鍵 + O 鍵,然後按下 W 鍵</translation> <translation id="1802624026913571222">蓋上機蓋時進入休眠狀態</translation> <translation id="1802687198411089702">網頁無回應。你可以等待網頁回應,也可以離開網頁。</translation> @@ -2353,6 +2354,7 @@ <translation id="2610374175948698697">可檢視裝置上的檔案或資料夾</translation> <translation id="2610780100389066815">Microsoft 信任清單簽署</translation> <translation id="261114180663074524">請登入 Microsoft 帳戶,然後再試一次</translation> +<translation id="2611702650078660078">發生錯誤</translation> <translation id="2611776654555141051">矩形工具</translation> <translation id="2612676031748830579">卡號</translation> <translation id="261305050785128654">網站會盡可能以你使用的語言顯示內容。</translation> @@ -2713,6 +2715,7 @@ <translation id="2849936225196189499">重要</translation> <translation id="285033512555869047">已關閉</translation> <translation id="2850541429955027218">新增主題</translation> +<translation id="2852045827873867442">必須連上網際網路。</translation> <translation id="285237063405807022">(載入中)</translation> <translation id="2853121255651601031">密碼已儲存</translation> <translation id="2855243985454069333">從所有已同步裝置上刪除歷史記錄</translation> @@ -5423,6 +5426,7 @@ <translation id="4779855924282373274"><ph name="URL" /> • 1 個重複的分頁</translation> <translation id="4780321648949301421">另存網頁...</translation> <translation id="4780558987886269159">工作</translation> +<translation id="4781633367688946589">繼續進入新工作階段</translation> <translation id="4784349455504343791"><ph name="WEBSITE_ORIGIN" /> 想要使用你在數位錢包中的個人資訊。</translation> <translation id="4785719467058219317">你目前使用的安全金鑰並未在這個網站註冊</translation> <translation id="4785914069240823137">取消裁剪</translation> @@ -11512,7 +11516,7 @@ <translation id="9101691533782776290">啟動應用程式</translation> <translation id="9102610709270966160">啟用擴充功能</translation> <translation id="9102864637938129124">網站和廣告主可以瞭解廣告成效。這項設定已開啟。</translation> -<translation id="9103341231213089378">如要投放,請前往「<ph name="IDS_MEDIA_ROUTER_LOCAL_DISCOVERY_PERMISSION_REJECTED_LINK" />」>「本機網路」>「Chrome」,將存取權授予 Chrome</translation> +<translation id="9103341231213089378">如要投放,請前往「<ph name="IDS_MEDIA_ROUTER_LOCAL_DISCOVERY_PERMISSION_REJECTED_LINK" />」>「區域網路」>「Chrome」並授予 Chrome 權限</translation> <translation id="9103868373786083162">按下即可返回,內容選單會顯示歷史記錄</translation> <translation id="9107096627210171112">翻譯(&R)...</translation> <translation id="9107624673674616016">彩色鉛筆</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index a91bafe..af1ff693 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -143,7 +143,10 @@ source_set("global_features") { sources = [ "global_features.h" ] deps = [ "//chrome/common:buildflags" ] - public_deps = [ "//base" ] + public_deps = [ + "//base", + "//build:branding_buildflags", + ] } source_set("shell_integration") { @@ -2602,7 +2605,10 @@ ] if (is_win && is_chrome_branded) { - deps += [ "//chrome/browser/win/installer_downloader" ] + deps += [ + "//chrome/browser/win/installer_downloader:controller", + "//chrome/browser/win/installer_downloader:infobar", + ] } # Platforms that have a network diagnostics dialog. All others fall through @@ -4422,10 +4428,6 @@ "//chrome/browser/ui/webui/top_chrome:impl", "//chrome/browser/ui/webui/whats_new", "//chrome/browser/ui/webui/whats_new:impl", - - # TODO(crbug.com/417774639): Remove this dependency when profiles_state.h - # get componentized. - "//chrome/browser/ui/search_engine_choice:impl", "//chrome/browser/upgrade_detector:build_state_observer", "//chrome/browser/web_applications", "//chrome/browser/web_applications:features", @@ -4555,10 +4557,6 @@ # gets modularized. "//chrome/browser/ui/privacy_sandbox:impl", - # TODO(crbug.com/417774639): Remove this circular dependency when profiles_state.h - # get componentized. - "//chrome/browser/ui/search_engine_choice:impl", - "//chrome/browser/ui/browser_window:impl", "//chrome/browser/ui/exclusive_access", "//chrome/browser/ui/views/toolbar", @@ -6147,6 +6145,7 @@ "//chrome/browser/background/glic:impl", "//chrome/browser/glic", "//chrome/browser/glic:impl", + "//chrome/browser/glic/fre", "//chrome/browser/glic/media", ] @@ -6154,6 +6153,7 @@ "//chrome/browser/background/glic:impl", "//chrome/browser/glic:impl", "//chrome/browser/glic/media", + "//chrome/browser/glic/fre", ] }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 1a076b2..b54d8da 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -6470,6 +6470,13 @@ flag_descriptions::kNewTabPageCustomizationDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kNewTabPageCustomization)}, + {"new-tab-page-customization-toolbar-button", + flag_descriptions::kNewTabPageCustomizationToolbarButtonName, + flag_descriptions::kNewTabPageCustomizationToolbarButtonDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kNewTabPageCustomizationToolbarButton)}, + {"android-app-integration-with-favicon", flag_descriptions::kAndroidAppIntegrationWithFaviconName, flag_descriptions::kAndroidAppIntegrationWithFaviconDescription, @@ -12396,6 +12403,12 @@ FEATURE_VALUE_TYPE(chrome::android::kTabletTabStripAnimation)}, #endif // BUILDFLAG(IS_ANDROID) + {"enable-secure-payment-confirmation-ux-refresh", + flag_descriptions::kSecurePaymentConfirmationUxRefreshName, + flag_descriptions::kSecurePaymentConfirmationUxRefreshDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kSecurePaymentConfirmationUxRefresh)}, + // Add new entries above this line. // NOTE: Adding a new flag requires adding a corresponding entry to enum
diff --git a/chrome/browser/actor/OWNERS b/chrome/browser/actor/OWNERS index 9bb5f816..7dc4b9d 100644 --- a/chrome/browser/actor/OWNERS +++ b/chrome/browser/actor/OWNERS
@@ -1,5 +1,4 @@ bokan@chromium.org -chasej@chromium.org mcnee@chromium.org mfoltz@chromium.org rodneyding@google.com
diff --git a/chrome/browser/android/webapk/webapk_sync_bridge.cc b/chrome/browser/android/webapk/webapk_sync_bridge.cc index 33b2239..105d35d 100644 --- a/chrome/browser/android/webapk/webapk_sync_bridge.cc +++ b/chrome/browser/android/webapk/webapk_sync_bridge.cc
@@ -506,14 +506,14 @@ // chrome/browser/web_applications/web_app_sync_bridge.cc's // WebAppSyncBridge::GetClientTag(). std::string WebApkSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_web_apk()); return ManifestIdStrToAppId(entity_data.specifics.web_apk().manifest_id()); } std::string WebApkSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetClientTag(entity_data); }
diff --git a/chrome/browser/android/webapk/webapk_sync_bridge.h b/chrome/browser/android/webapk/webapk_sync_bridge.h index 4682cb2..ba5e94c 100644 --- a/chrome/browser/android/webapk/webapk_sync_bridge.h +++ b/chrome/browser/android/webapk/webapk_sync_bridge.h
@@ -68,8 +68,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/chrome/browser/ash/OWNERS b/chrome/browser/ash/OWNERS index e15bae9..13a591b 100644 --- a/chrome/browser/ash/OWNERS +++ b/chrome/browser/ash/OWNERS
@@ -5,7 +5,6 @@ oshima@chromium.org xiyuan@chromium.org -afakhry@chromium.org #{LAST_RESORT_SUGGESTION} # This is for the common case of adding or renaming files. If you're doing # structural changes, use usual OWNERS rules.
diff --git a/chrome/browser/ash/app_mode/test/BUILD.gn b/chrome/browser/ash/app_mode/test/BUILD.gn index 63927ef97..0568e02 100644 --- a/chrome/browser/ash/app_mode/test/BUILD.gn +++ b/chrome/browser/ash/app_mode/test/BUILD.gn
@@ -25,6 +25,7 @@ "kiosk_iwa_device_attributes_browsertest.cc", "kiosk_iwa_permissions_browsertest.cc", "kiosk_iwa_update_browsertest.cc", + "kiosk_iwa_version_management_browsertest.cc", "kiosk_misconfigured_user_browsertest.cc", "kiosk_multi_chrome_app_browsertest.cc", "kiosk_self_hosted_chrome_app_browsertest.cc", @@ -56,6 +57,7 @@ "//components/services/app_service/public/cpp:app_types", "//components/web_package", "//components/web_package/test_support", + "//components/webapps/isolated_web_apps:isolated_web_apps", "//content/test:test_support", "//extensions/components/native_app_window", "//testing/gtest",
diff --git a/chrome/browser/ash/app_mode/test/kiosk_iwa_version_management_browsertest.cc b/chrome/browser/ash/app_mode/test/kiosk_iwa_version_management_browsertest.cc new file mode 100644 index 0000000..8e95ec0 --- /dev/null +++ b/chrome/browser/ash/app_mode/test/kiosk_iwa_version_management_browsertest.cc
@@ -0,0 +1,232 @@ +// 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 <optional> +#include <string> +#include <string_view> +#include <utility> +#include <vector> + +#include "ash/constants/ash_features.h" +#include "base/check_deref.h" +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/test/scoped_feature_list.h" +#include "base/version.h" +#include "chrome/browser/ash/app_mode/kiosk_app_launch_error.h" +#include "chrome/browser/ash/app_mode/kiosk_controller.h" +#include "chrome/browser/ash/app_mode/test/kiosk_mixin.h" +#include "chrome/browser/ash/app_mode/test/kiosk_test_utils.h" +#include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_update_server_mixin.h" +#include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h" +#include "chrome/browser/web_applications/isolated_web_apps/test/isolated_web_app_builder.h" +#include "chrome/browser/web_applications/isolated_web_apps/test/test_signed_web_bundle_builder.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/browser/web_applications/web_app_registrar.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" +#include "components/web_package/signed_web_bundles/signed_web_bundle_id.h" +#include "components/web_package/test_support/signed_web_bundles/key_pair.h" +#include "components/webapps/common/web_app_id.h" +#include "components/webapps/isolated_web_apps/update_channel.h" +#include "content/public/test/browser_test.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace ash { + +using kiosk::test::CurrentProfile; +using kiosk::test::LaunchAppManually; +using kiosk::test::TheKioskApp; +using kiosk::test::WaitKioskLaunched; + +namespace { + +constexpr char kTestAccountId[] = "kiosk-iwa-test@localhost"; + +constexpr char kTestIwaVersion1[] = "1"; +constexpr char kTestIwaVersion2[] = "2.0"; +constexpr char kTestIwaVersion3[] = "3.0.0"; + +constexpr char kChannelNameUnset[] = ""; +constexpr char kChannelNameDefault[] = "default"; +constexpr char kChannelNameBeta[] = "beta"; +constexpr char kChannelNameAlpha[] = "alpha"; +constexpr char kChannelNameUnknown[] = "unknown"; + +const web_app::UpdateChannel kChannelBeta = + web_app::UpdateChannel::Create(kChannelNameBeta).value(); +const web_app::UpdateChannel kChannelAlpha = + web_app::UpdateChannel::Create(kChannelNameAlpha).value(); + +constexpr std::string_view GetTestAccountId() { + return kTestAccountId; +} + +web_package::SignedWebBundleId GetTestWebBundleId() { + return web_app::test::GetDefaultEd25519WebBundleId(); +} + +web_package::test::KeyPair GetTestKeyPair() { + return web_app::test::GetDefaultEd25519KeyPair(); +} + +webapps::AppId GetTestWebAppId() { + return web_app::IsolatedWebAppUrlInfo::CreateFromSignedWebBundleId( + GetTestWebBundleId()) + .app_id(); +} + +web_app::WebAppProvider& GetWebAppProvider() { + return CHECK_DEREF(web_app::WebAppProvider::GetForWebApps(&CurrentProfile())); +} + +const web_app::WebApp& GetIsolatedWebApp(const webapps::AppId& app_id) { + return CHECK_DEREF(GetWebAppProvider().registrar_unsafe().GetAppById(app_id)); +} + +KioskMixin::Config CreateManualLaunchConfig(const std::string& update_channel, + const GURL& update_manifest_url) { + KioskMixin::IsolatedWebAppOption iwa_option( + /*account_id=*/GetTestAccountId(), + /*web_bundle_id=*/GetTestWebBundleId(), update_manifest_url, + update_channel); + + KioskMixin::Config kiosk_iwa_config = {/*name=*/"IsolatedWebApp", + /*auto_launch_account_id=*/{}, + {iwa_option}}; + return kiosk_iwa_config; +} + +} // namespace + +// Base class for Kiosk IWA version management fixtures. +class KioskIwaVersionManagementBaseTest + : public MixinBasedInProcessBrowserTest { + public: + // Factory method to create kiosk mixin configurations based on the url from + // IsolatedWebAppUpdateServerMixin. + using ConfigCreator = + base::OnceCallback<KioskMixin::Config(const GURL& update_manifest_url)>; + + explicit KioskIwaVersionManagementBaseTest(ConfigCreator config_creator) + : feature_list_(ash::features::kIsolatedWebAppKiosk), + iwa_server_mixin_(&mixin_host_), + kiosk_mixin_(&mixin_host_, + std::move(config_creator).Run(GetUpdateManifestUrl())) {} + + ~KioskIwaVersionManagementBaseTest() override = default; + KioskIwaVersionManagementBaseTest(const KioskIwaVersionManagementBaseTest&) = + delete; + KioskIwaVersionManagementBaseTest& operator=( + const KioskIwaVersionManagementBaseTest&) = delete; + + void AddTestBundle(std::string_view version, + std::optional<std::vector<web_app::UpdateChannel>> + channels = std::nullopt) { + iwa_server_mixin_.AddBundle( + web_app::IsolatedWebAppBuilder( + web_app::ManifestBuilder().SetVersion(version)) + .BuildBundle(GetTestKeyPair()), + std::move(channels)); + } + + private: + GURL GetUpdateManifestUrl() const { + return iwa_server_mixin_.GetUpdateManifestUrl(GetTestWebBundleId()); + } + + base::test::ScopedFeatureList feature_list_; + web_app::IsolatedWebAppUpdateServerMixin iwa_server_mixin_; + KioskMixin kiosk_mixin_; +}; + +struct KioskIwaUpdateChannelTestParams { + std::string input_channel_name; + std::optional<base::Version> expected_version; +}; + +// Tests how the first Kiosk IWA installation processes update channels. +class KioskIwaUpdateChannelTest + : public KioskIwaVersionManagementBaseTest, + public testing::WithParamInterface<KioskIwaUpdateChannelTestParams> { + public: + KioskIwaUpdateChannelTest() + : KioskIwaVersionManagementBaseTest( + KioskIwaWithCustomChannel(GetChannelName())) { + AddTestBundle(kTestIwaVersion1); + AddTestBundle(kTestIwaVersion2, {{kChannelBeta, kChannelAlpha}}); + AddTestBundle(kTestIwaVersion3, {{kChannelAlpha}}); + } + + protected: + static ConfigCreator KioskIwaWithCustomChannel( + const std::string& channel_name) { + return base::BindOnce(&CreateManualLaunchConfig, channel_name); + } + + static const std::string& GetChannelName() { + return GetParam().input_channel_name; + } + + static const std::optional<base::Version>& GetExpectedVersion() { + return GetParam().expected_version; + } + + void RunUnableToInstallChecks() { + RunUntilBrowserProcessQuits(); + EXPECT_EQ(KioskAppLaunchError::Error::kUnableToInstall, + KioskAppLaunchError::Get()); + EXPECT_FALSE(KioskController::Get().IsSessionStarting()); + } + + static void RunInstalledChecks() { + ASSERT_TRUE(WaitKioskLaunched()); + EXPECT_EQ(GetIsolatedWebApp(GetTestWebAppId()).isolation_data()->version(), + GetExpectedVersion()); + } +}; + +using KioskIwaUpdateChannelTestInstallSuccess = KioskIwaUpdateChannelTest; +IN_PROC_BROWSER_TEST_P(KioskIwaUpdateChannelTestInstallSuccess, + InstallsCorrectVersion) { + ASSERT_TRUE(LaunchAppManually(TheKioskApp())); + RunInstalledChecks(); +} + +INSTANTIATE_TEST_SUITE_P( + All, + KioskIwaUpdateChannelTestInstallSuccess, + testing::Values( + // Uses 'default' channel with unset policy. + KioskIwaUpdateChannelTestParams{ + .input_channel_name = kChannelNameUnset, + .expected_version = base::Version(kTestIwaVersion1)}, + // Explicitly set 'default' channel. + KioskIwaUpdateChannelTestParams{ + .input_channel_name = kChannelNameDefault, + .expected_version = base::Version(kTestIwaVersion1)}, + // Installs a different version for 'beta' + KioskIwaUpdateChannelTestParams{ + .input_channel_name = kChannelNameBeta, + .expected_version = base::Version(kTestIwaVersion2)}, + // Selects the latest version from multiple in 'alpha'. + KioskIwaUpdateChannelTestParams{ + .input_channel_name = kChannelNameAlpha, + .expected_version = base::Version(kTestIwaVersion3)})); + +using KioskIwaUpdateChannelTestInstallFail = KioskIwaUpdateChannelTest; +IN_PROC_BROWSER_TEST_P(KioskIwaUpdateChannelTestInstallFail, CannotInstall) { + ASSERT_TRUE(LaunchAppManually(TheKioskApp())); + RunUnableToInstallChecks(); +} + +INSTANTIATE_TEST_SUITE_P(All, + KioskIwaUpdateChannelTestInstallFail, + testing::Values( + // Cannot install when channel not found. + KioskIwaUpdateChannelTestParams{ + .input_channel_name = kChannelNameUnknown, + .expected_version = std::nullopt})); + +} // namespace ash
diff --git a/chrome/browser/ash/app_mode/test/kiosk_mixin.cc b/chrome/browser/ash/app_mode/test/kiosk_mixin.cc index 58c0f7ee..dabf5c8 100644 --- a/chrome/browser/ash/app_mode/test/kiosk_mixin.cc +++ b/chrome/browser/ash/app_mode/test/kiosk_mixin.cc
@@ -202,6 +202,12 @@ option.web_bundle_id.id()); account->mutable_isolated_kiosk_app()->set_update_manifest_url( option.update_manifest_url.spec()); + account->mutable_isolated_kiosk_app()->set_update_channel( + option.update_channel); + account->mutable_isolated_kiosk_app()->set_pinned_version( + option.pinned_version); + account->mutable_isolated_kiosk_app()->set_allow_downgrades( + option.allow_downgrades); } // Configures the Kiosk account given by `account_id` as the auto launch @@ -430,10 +436,16 @@ KioskMixin::IsolatedWebAppOption::IsolatedWebAppOption( std::string_view account_id, const web_package::SignedWebBundleId& web_bundle_id, - GURL update_manifest_url) + GURL update_manifest_url, + std::string update_channel, + std::string pinned_version, + bool allow_downgrades) : account_id(std::string(account_id)), web_bundle_id(web_bundle_id), - update_manifest_url(std::move(update_manifest_url)) {} + update_manifest_url(std::move(update_manifest_url)), + update_channel(std::move(update_channel)), + pinned_version(std::move(pinned_version)), + allow_downgrades(allow_downgrades) {} KioskMixin::IsolatedWebAppOption::IsolatedWebAppOption( const KioskMixin::IsolatedWebAppOption&) = default;
diff --git a/chrome/browser/ash/app_mode/test/kiosk_mixin.h b/chrome/browser/ash/app_mode/test/kiosk_mixin.h index f3f2101..e2435f04 100644 --- a/chrome/browser/ash/app_mode/test/kiosk_mixin.h +++ b/chrome/browser/ash/app_mode/test/kiosk_mixin.h
@@ -113,7 +113,10 @@ struct IsolatedWebAppOption { IsolatedWebAppOption(std::string_view account_id, const web_package::SignedWebBundleId& web_bundle_id, - GURL update_manifest_url); + GURL update_manifest_url, + std::string update_channel = "", + std::string pinned_version = "", + bool allow_downgrades = false); IsolatedWebAppOption(const IsolatedWebAppOption&); IsolatedWebAppOption(IsolatedWebAppOption&&); @@ -124,6 +127,9 @@ std::string account_id; web_package::SignedWebBundleId web_bundle_id; GURL update_manifest_url; + std::string update_channel; + std::string pinned_version; + bool allow_downgrades; }; // The account ID of the app that Kiosk should auto launch, as configured in
diff --git a/chrome/browser/ash/floating_sso/floating_sso_sync_bridge.cc b/chrome/browser/ash/floating_sso/floating_sso_sync_bridge.cc index b3c5088b..819d215 100644 --- a/chrome/browser/ash/floating_sso/floating_sso_sync_bridge.cc +++ b/chrome/browser/ash/floating_sso/floating_sso_sync_bridge.cc
@@ -168,12 +168,12 @@ } std::string FloatingSsoSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetClientTag(entity_data); } std::string FloatingSsoSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return entity_data.specifics.cookie().unique_key(); }
diff --git a/chrome/browser/ash/floating_sso/floating_sso_sync_bridge.h b/chrome/browser/ash/floating_sso/floating_sso_sync_bridge.h index e5cd71aa..bb87af3 100644 --- a/chrome/browser/ash/floating_sso/floating_sso_sync_bridge.h +++ b/chrome/browser/ash/floating_sso/floating_sso_sync_bridge.h
@@ -63,8 +63,10 @@ std::optional<syncer::ModelError> ApplyIncrementalSyncChanges( std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override;
diff --git a/chrome/browser/ash/floating_workspace/BUILD.gn b/chrome/browser/ash/floating_workspace/BUILD.gn index a31dcf0..87d9c990 100644 --- a/chrome/browser/ash/floating_workspace/BUILD.gn +++ b/chrome/browser/ash/floating_workspace/BUILD.gn
@@ -94,6 +94,7 @@ "//chrome/browser/ui/ash/multi_user", "//chrome/browser/ui/ash/session", "//chrome/browser/ui/ash/session:test_support", + "//chrome/browser/ui/webui/ash/floating_workspace:floating_workspace", "//chrome/test:test_support", "//chromeos/ash/components/login/session", "//chromeos/ash/components/network",
diff --git a/chrome/browser/ash/floating_workspace/DEPS b/chrome/browser/ash/floating_workspace/DEPS index ad24539b..5b61cf03 100644 --- a/chrome/browser/ash/floating_workspace/DEPS +++ b/chrome/browser/ash/floating_workspace/DEPS
@@ -28,6 +28,7 @@ "+chrome/browser/ui/ash/multi_user", "+chrome/browser/ui/ash/session", "+chrome/browser/ui/settings_window_manager_chromeos.h", + "+chrome/browser/ui/webui/ash/floating_workspace", "+chrome/common/pref_names.h", "+chrome/grit", "+chrome/test/base",
diff --git a/chrome/browser/ash/floating_workspace/floating_workspace_service.cc b/chrome/browser/ash/floating_workspace/floating_workspace_service.cc index 23608d2..2b7cc34 100644 --- a/chrome/browser/ash/floating_workspace/floating_workspace_service.cc +++ b/chrome/browser/ash/floating_workspace/floating_workspace_service.cc
@@ -11,7 +11,6 @@ #include "ash/constants/ash_features.h" #include "ash/public/cpp/desk_template.h" -#include "ash/public/cpp/notification_utils.h" #include "ash/public/cpp/session/session_controller.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" @@ -33,8 +32,6 @@ #include "chrome/browser/ash/login/session/user_session_manager.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/lifetime/application_lifetime.h" -#include "chrome/browser/notifications/notification_display_service.h" -#include "chrome/browser/notifications/notification_display_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/session_restore.h" #include "chrome/browser/sync/desk_sync_service_factory.h" @@ -44,6 +41,7 @@ #include "chrome/browser/ui/ash/desks/desks_client.h" #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" #include "chrome/browser/ui/settings_window_manager_chromeos.h" +#include "chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.h" #include "chrome/grit/generated_resources.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_state_handler.h" @@ -63,7 +61,6 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/user_activity/user_activity_detector.h" #include "ui/chromeos/devicetype_utils.h" -#include "ui/message_center/public/cpp/notification.h" namespace { @@ -82,38 +79,12 @@ namespace ash { -constexpr char kNotificationForNoNetworkConnection[] = - "notification_no_network_connection"; -constexpr char kNotificationForSyncErrorOrTimeOut[] = - "notification_sync_error_or_timeout"; -constexpr char kNotificationForProgressStatus[] = - "notification_progress_status"; -constexpr char kSafeMode[] = "notification_safe_mode"; // Default time without activity after which a floating workspace template is // considered stale and becomes a candidate for garbage collection. constexpr base::TimeDelta kStaleFWSThreshold = base::Days(30); // Minimum time to wait before we decide to show the progress status if no // floating workspace templates have been downloaded yet. constexpr base::TimeDelta kMinTimeToWait = base::Seconds(2); -// Time interval between progress bar update. -constexpr base::TimeDelta kProgressTimeUpdateDelay = base::Seconds(1); - -FloatingWorkspaceServiceNotificationType GetNotificationTypeById( - const std::string& id) { - if (id == kNotificationForNoNetworkConnection) { - return FloatingWorkspaceServiceNotificationType::kNoNetworkConnection; - } - if (id == kNotificationForSyncErrorOrTimeOut) { - return FloatingWorkspaceServiceNotificationType::kSyncErrorOrTimeOut; - } - if (id == kNotificationForProgressStatus) { - return FloatingWorkspaceServiceNotificationType::kProgressStatus; - } - if (id == kSafeMode) { - return FloatingWorkspaceServiceNotificationType::kSafeMode; - } - return FloatingWorkspaceServiceNotificationType::kUnknown; -} FloatingWorkspaceService::FloatingWorkspaceService( Profile* profile, @@ -157,7 +128,9 @@ void FloatingWorkspaceService::InitiateSigninTask() { if (!floating_workspace_util::IsInternetConnected()) { - SendNotification(kNotificationForNoNetworkConnection); + if (should_run_restore_) { + FloatingWorkspaceDialog::ShowNetworkScreen(); + } } else { syncer::LocalDeviceInfoProviderImpl* local_device_info_provider = static_cast<syncer::LocalDeviceInfoProviderImpl*>( @@ -168,14 +141,10 @@ base::BindRepeating( &FloatingWorkspaceService::OnLocalDeviceInfoProviderReady, weak_pointer_factory_.GetWeakPtr())); + if (should_run_restore_) { + FloatingWorkspaceDialog::ShowDefaultScreen(); + } } - - base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( - FROM_HERE, - base::BindOnce( - &FloatingWorkspaceService::MaybeStartProgressBarNotification, - weak_pointer_factory_.GetWeakPtr()), - kMinTimeToWait); } // TODO(b/309137462): Clean up params to not need to be passed in. @@ -294,7 +263,7 @@ // This state indicates that we are not permitted to upload user's workspace // data (see the comment above syncer::UploadState::NOT_ACTIVE for details). // We should treat this as if the feature is fully disabled. - should_run_restore_ = false; + StopRestoringSession(); return; } syncer::SyncService::DataTypeDownloadStatus workspace_download_status = @@ -336,13 +305,13 @@ // Don'h handle the error repeatedly. break; } - // Sync is not expected to deliver the data, let user decide. - // TODO: send notification to user asking if restore local. + // If Sync is not expected to deliver the data, do nothing. if (!should_run_restore_) { break; } - StopProgressBarNotification(); - HandleSyncError(); + // There is nothing in particular the user can do to resolve a Sync error + // - show a generic error UI. + FloatingWorkspaceDialog::ShowErrorScreen(); break; } } @@ -406,66 +375,24 @@ } void FloatingWorkspaceService::OnNetworkStateOrSyncServiceStateChanged() { - if (!floating_workspace_util::IsInternetConnected() || - (sync_service_ && !sync_service_->IsSyncFeatureActive())) { - // Only send notification if there's no notification currently or the - // current notification is the same one that we want to display. If the - // restore should not run, then there's no need to display the notification - // either. - if (should_run_restore_ && - (notification_ == nullptr || - notification_->id() != kNotificationForNoNetworkConnection)) { - StopProgressBarNotification(); - SendNotification(kNotificationForNoNetworkConnection); - } + // If the restore should not run, then there's no need to show any UI and it + // is expected to be closed elsewhere. + if (!should_run_restore_) { + return; + } + if (!floating_workspace_util::IsInternetConnected()) { + // No need to double check if UI is already shown - the + // dialog is smart enough to recognize when there is no change. + FloatingWorkspaceDialog::ShowNetworkScreen(); + } else if (sync_service_ && !sync_service_->IsSyncFeatureActive()) { + // If Sync is not active, show a generic error UI. + // TODO(crbug.com/411121762): write a test for this code path. + FloatingWorkspaceDialog::ShowErrorScreen(); } else { - if (notification_ != nullptr && - notification_->id() == kNotificationForNoNetworkConnection) { - MaybeCloseNotification(); - } + // We are online and Sync is active: show the default UI state. + FloatingWorkspaceDialog::ShowDefaultScreen(); } } -void FloatingWorkspaceService::Click( - const std::optional<int>& button_index, - const std::optional<std::u16string>& reply) { - DCHECK(notification_); - - switch (GetNotificationTypeById(notification_->id())) { - case FloatingWorkspaceServiceNotificationType::kUnknown: - // For unknown type of notification id, do nothing and run close logic. - case FloatingWorkspaceServiceNotificationType::kSyncErrorOrTimeOut: - case FloatingWorkspaceServiceNotificationType::kProgressStatus: - case FloatingWorkspaceServiceNotificationType::kSafeMode: - break; - case FloatingWorkspaceServiceNotificationType::kNoNetworkConnection: - if (button_index.has_value()) { - // Show network settings if the user clicks the show network settings - // button. - chrome::SettingsWindowManager::GetInstance()->ShowOSSettings( - profile_, chromeos::settings::mojom::kNetworkSectionPath); - } - break; - } - MaybeCloseNotification(); -} - -void FloatingWorkspaceService::MaybeCloseNotification() { - if (notification_ == nullptr) { - return; - } - // If it's a progress bar notification and we're still waiting for chrome sync - // to finish downloading, don't need to close notification. - if (notification_->type() == message_center::NOTIFICATION_TYPE_PROGRESS && - !progress_notification_id_.empty() && - progress_notification_id_ == notification_->id()) { - return; - } - auto* notification_display_service = - NotificationDisplayServiceFactory::GetForProfile(profile_); - notification_display_service->Close(NotificationHandler::Type::TRANSIENT, - notification_->id()); - notification_ = nullptr; -} void FloatingWorkspaceService::SuspendImminent( power_manager::SuspendImminent::Reason reason) { @@ -494,7 +421,8 @@ // Disable floating workspace action in safe mode. if (floating_workspace_util::IsSafeMode()) { LOG(WARNING) << "Floating workspace disabled in safe mode."; - SendNotification(kSafeMode); + // TODO(crbug.com/411121762): decide if we want to display something to the + // user in this case with our new startup UI. return; } floating_workspace_metrics_util:: @@ -573,26 +501,6 @@ } } -void FloatingWorkspaceService::MaybeStartProgressBarNotification() { - if (!should_run_restore_) { - return; - } - progress_timer_.Start(FROM_HERE, kProgressTimeUpdateDelay, this, - &FloatingWorkspaceService::HandleProgressBarStatus); -} - -void FloatingWorkspaceService::StopProgressBarNotification() { - progress_notification_id_ = std::string(); - if (progress_timer_.IsRunning()) { - progress_timer_.Stop(); - } - MaybeCloseNotification(); -} - -void FloatingWorkspaceService::HandleProgressBarStatus() { - SendNotification(kNotificationForProgressStatus); -} - bool FloatingWorkspaceService::ShouldExcludeTemplate( const DeskTemplate* floating_workspace_template) { if (!floating_workspace_template) { @@ -676,7 +584,7 @@ } void FloatingWorkspaceService::StopProgressBarAndRestoreFloatingWorkspace() { - StopProgressBarNotification(); + FloatingWorkspaceDialog::Close(); RestoreFloatingWorkspaceTemplate(GetLatestFloatingWorkspaceTemplate()); StartCaptureAndUploadActiveDesk(); } @@ -959,94 +867,6 @@ return std::nullopt; } -void FloatingWorkspaceService::HandleSyncError() { - SendNotification(kNotificationForSyncErrorOrTimeOut); -} - -void FloatingWorkspaceService::SendNotification(const std::string& id) { - // If there is a previous notification for floating workspace, close it. - MaybeCloseNotification(); - - message_center::RichNotificationData notification_data; - std::u16string title, message; - message_center::SystemNotificationWarningLevel warning_level; - const base::TimeDelta time_difference = - base::TimeTicks::Now() - initialization_timeticks_; - bool is_progress_bar = false; - switch (GetNotificationTypeById(id)) { - case FloatingWorkspaceServiceNotificationType::kNoNetworkConnection: - title = - l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_NO_NETWORK_TITLE); - message = - l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_NO_NETWORK_MESSAGE); - warning_level = - message_center::SystemNotificationWarningLevel::CRITICAL_WARNING; - notification_data.buttons.emplace_back( - l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_NO_NETWORK_BUTTON)); - break; - case FloatingWorkspaceServiceNotificationType::kSyncErrorOrTimeOut: - title = l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_ERROR_TITLE); - message = l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_ERROR_MESSAGE); - warning_level = - message_center::SystemNotificationWarningLevel::CRITICAL_WARNING; - break; - case FloatingWorkspaceServiceNotificationType::kProgressStatus: - title = - l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_PROGRESS_BAR_TITLE); - notification_data.progress_status = l10n_util::GetStringUTF16( - IDS_FLOATING_WORKSPACE_PROGRESS_BAR_MESSAGE); - warning_level = message_center::SystemNotificationWarningLevel::NORMAL; - notification_data.progress = std::min( - 100.0, - (time_difference * 100.0) / - ash::features:: - kFloatingWorkspaceV2MaxTimeAvailableForRestoreAfterLogin - .Get()); - is_progress_bar = true; - break; - case FloatingWorkspaceServiceNotificationType::kSafeMode: - title = l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_SAFE_MODE_TITLE); - message = - l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_SAFE_MODE_MESSAGE); - warning_level = message_center::SystemNotificationWarningLevel::WARNING; - break; - case FloatingWorkspaceServiceNotificationType::kUnknown: - VLOG(2) << "Unknown notification type for floating workspace, skip " - "sending notification"; - return; - } - // Update the current notification with progress status if we are still - // showing progress status. Otherwise, make a new notification. - if (is_progress_bar && notification_ != nullptr && - !progress_notification_id_.empty() && - notification_->id() == progress_notification_id_) { - notification_->set_progress(notification_data.progress); - } else { - notification_ = CreateSystemNotificationPtr( - is_progress_bar ? message_center::NOTIFICATION_TYPE_PROGRESS - : message_center::NOTIFICATION_TYPE_SIMPLE, - id, title, message, - l10n_util::GetStringUTF16(IDS_FLOATING_WORKSPACE_DISPLAY_SOURCE), - GURL(), - message_center::NotifierId( - message_center::NotifierType::SYSTEM_COMPONENT, id, - NotificationCatalogName::kFloatingWorkspace), - notification_data, - base::MakeRefCounted<message_center::ThunkNotificationDelegate>( - weak_pointer_factory_.GetWeakPtr()), - kFloatingWorkspaceNotificationIcon, warning_level); - notification_->set_priority(message_center::SYSTEM_PRIORITY); - if (is_progress_bar) { - progress_notification_id_ = notification_->id(); - } - } - auto* notification_display_service = - NotificationDisplayServiceFactory::GetForProfile(profile_); - notification_display_service->Display(NotificationHandler::Type::TRANSIENT, - *notification_, - /*metadata=*/nullptr); -} - void FloatingWorkspaceService::DoGarbageCollection( const DeskTemplate* exclude_template) { // Do not delete any floating workspace templates if we have less than 2
diff --git a/chrome/browser/ash/floating_workspace/floating_workspace_service.h b/chrome/browser/ash/floating_workspace/floating_workspace_service.h index 547dace0..b54cb2e 100644 --- a/chrome/browser/ash/floating_workspace/floating_workspace_service.h +++ b/chrome/browser/ash/floating_workspace/floating_workspace_service.h
@@ -34,7 +34,6 @@ #include "components/sync/service/sync_service_observer.h" #include "components/sync_device_info/device_info_sync_service.h" #include "components/sync_device_info/device_info_tracker.h" -#include "ui/message_center/public/cpp/notification.h" class Profile; @@ -46,31 +45,11 @@ namespace ash { -extern const char kNotificationForNoNetworkConnection[]; -extern const char kNotificationForSyncErrorOrTimeOut[]; -extern const char kNotificationForProgressStatus[]; - -// The restore from error notification button index. -enum class RestoreFromErrorNotificationButtonIndex { - kRestore = 0, - kCancel, -}; - -// The notification type for floating workspace service. -enum class FloatingWorkspaceServiceNotificationType { - kUnknown = 0, - kNoNetworkConnection, - kSyncErrorOrTimeOut, - kProgressStatus, - kSafeMode -}; - // A keyed service to support floating workspace. Note that a periodical // task `CaptureAndUploadActiveDesk` will be dispatched during service // initialization. class FloatingWorkspaceService : public KeyedService, - public message_center::NotificationObserver, public syncer::SyncServiceObserver, public apps::AppRegistryCache::Observer, public apps::AppRegistryCacheWrapper::Observer, @@ -111,10 +90,6 @@ void OnStateChanged(syncer::SyncService* sync) override; void OnSyncShutdown(syncer::SyncService* sync) override; - // message_center::NotificationObserver overrides: - void Click(const std::optional<int>& button_index, - const std::optional<std::u16string>& reply) override; - // ash::SessionObserver overrides: void OnActiveUserSessionChanged(const AccountId& account_id) override; void OnLockStateChanged(bool locked) override; @@ -139,8 +114,6 @@ void OnDeviceInfoChange() override; void OnDeviceInfoShutdown() override; - void MaybeCloseNotification(); - std::vector<const ash::DeskTemplate*> GetFloatingWorkspaceTemplateEntries(); // Setups the convenience pointers to the dependent services and observers. @@ -199,13 +172,6 @@ void StartCaptureAndUploadActiveDesk(); void StopCaptureAndUploadActiveDesk(); - // Start and stop the progress bar notification. - void MaybeStartProgressBarNotification(); - void StopProgressBarNotification(); - - // Handles the updating of progress bar notification. - void HandleProgressBarStatus(); - // Stops the progress bar and resumes the latest floating workspace. This is // called when the app cache is ready and sync data is available. void StopProgressBarAndRestoreFloatingWorkspace(); @@ -256,12 +222,6 @@ // an std::nullopt if there is no floating workspace uuid that is associated // with the current device. std::optional<base::Uuid> GetFloatingWorkspaceUuidForCurrentDevice(); - // When sync passes an error status to floating workspace service, - // floating workspace service should send notification to user asking - // whether to restore the most recent FWS desk from local storage. - void HandleSyncError(); - - void SendNotification(const std::string& id); // Performs garbage collection of stale floating workspace templates. A // floating workspace template is considered stale if it's older than 30 @@ -282,13 +242,11 @@ bool AreRequiredAppTypesInitialized(); // Once network state or sync feature active state changes have been detected, - // handle the internet connectivity notification appropriately based on - // connection. + // handle the startup UI appropriately based on connection. void OnNetworkStateOrSyncServiceStateChanged(); - // Initial task start. This involves checking the network connectivity upon - // log in and sending a notification if no network is connected or start - // posting a task for waiting for sync server downloads to complete. + // Initial task start. This includes checking the network connectivity upon + // login and setting the appropriate state for startup UI. void InitiateSigninTask(); // Returns true if we should exclude the `floating_workspace_template` from @@ -396,8 +354,6 @@ // populated when we first capture a floating workspace template. std::optional<base::Uuid> floating_workspace_uuid_; - std::unique_ptr<message_center::Notification> notification_; - std::string progress_notification_id_; // The in memory cache of the floating workspace that should be restored // after downloading latest updates. Saved in case the user delays resuming
diff --git a/chrome/browser/ash/floating_workspace/floating_workspace_service_unittest.cc b/chrome/browser/ash/floating_workspace/floating_workspace_service_unittest.cc index 07cc6aa..ee3c61d 100644 --- a/chrome/browser/ash/floating_workspace/floating_workspace_service_unittest.cc +++ b/chrome/browser/ash/floating_workspace/floating_workspace_service_unittest.cc
@@ -20,19 +20,21 @@ #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/run_until.h" #include "base/test/task_environment.h" #include "base/time/time.h" #include "chrome/browser/ash/floating_workspace/floating_workspace_metrics_util.h" #include "chrome/browser/ash/floating_workspace/floating_workspace_service_factory.h" #include "chrome/browser/ash/floating_workspace/floating_workspace_util.h" #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" -#include "chrome/browser/notifications/notification_display_service_tester.h" #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/browser/profiles/profile_keyed_service_factory.h" #include "chrome/browser/ui/ash/desks/desks_client.h" #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" #include "chrome/browser/ui/ash/session/session_controller_client_impl.h" #include "chrome/browser/ui/ash/session/test_session_controller.h" +#include "chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.h" +#include "chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_ui.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" @@ -65,12 +67,13 @@ #include "components/user_manager/scoped_user_manager.h" #include "components/user_manager/test_helper.h" #include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_web_contents_factory.h" +#include "content/public/test/test_web_ui.h" #include "google_apis/gaia/gaia_id.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" #include "ui/base/user_activity/user_activity_detector.h" -#include "ui/message_center/public/cpp/notification.h" namespace ash::floating_workspace { @@ -337,10 +340,6 @@ return scoped_feature_list_; } - NotificationDisplayServiceTester* display_service() { - return display_service_.get(); - } - syncer::TestSyncService* test_sync_service() { return &test_sync_service_; } ui::UserActivityDetector* user_activity_detector() { @@ -367,12 +366,6 @@ return chromeos::FakePowerManagerClient::Get(); } - bool HasNotificationFor(const std::string& id) { - std::optional<message_center::Notification> notification = - display_service()->GetNotification(id); - return notification.has_value(); - } - void AddTestNetworkDevice() { network_handler_test_helper_->AddDefaultProfiles(); } @@ -437,6 +430,19 @@ task_environment_.RunUntilIdle(); } + bool WaitForStartupDialogToClose() { + return base::test::RunUntil( + []() { return !FloatingWorkspaceDialog::IsShown(); }); + } + + void CloseStartupDialogIfNeeded() { + if (!FloatingWorkspaceDialog::IsShown()) { + return; + } + FloatingWorkspaceDialog::Close(); + EXPECT_TRUE(WaitForStartupDialogToClose()); + } + void SetUp() override { chromeos::PowerManagerClient::InitializeFake(); cros_settings_test_helper_ = @@ -473,8 +479,6 @@ fake_desk_sync_service_ = std::make_unique<desks_storage::FakeDeskSyncService>( /*skip_engine_connection=*/true); - display_service_ = - std::make_unique<NotificationDisplayServiceTester>(profile_.get()); network_handler_test_helper_ = std::make_unique<NetworkHandlerTestHelper>(); fake_device_info_sync_service_ = std::make_unique<syncer::FakeDeviceInfoSyncService>( @@ -489,9 +493,19 @@ apps::AppRegistryCacheWrapper::Get().AddAppRegistryCache(account_id_, cache_.get()); mock_desks_client_ = std::make_unique<MockDesksClient>(); + + web_contents_factory_ = std::make_unique<content::TestWebContentsFactory>(); + test_web_ui_ = std::make_unique<content::TestWebUI>(); + test_web_ui_->set_web_contents( + web_contents_factory_->CreateWebContents(profile_)); + auto ui = std::make_unique<FloatingWorkspaceUI>(test_web_ui_.get()); + test_web_ui_->SetController(std::move(ui)); } void TearDown() override { + CloseStartupDialogIfNeeded(); + test_web_ui_.reset(); + web_contents_factory_.reset(); auto* floating_workspace_service = FloatingWorkspaceServiceFactory::GetForProfile(profile()); if (floating_workspace_service) { @@ -512,7 +526,6 @@ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; syncer::TestSyncService test_sync_service_; std::unique_ptr<desks_storage::FakeDeskSyncService> fake_desk_sync_service_; - std::unique_ptr<NotificationDisplayServiceTester> display_service_; std::unique_ptr<syncer::FakeDeviceInfoSyncService> fake_device_info_sync_service_; base::test::ScopedFeatureList scoped_feature_list_; @@ -526,6 +539,8 @@ user_manager::TypedScopedUserManager<user_manager::FakeUserManager> fake_user_manager_; ash::SessionTerminationManager session_termination_manager_; + std::unique_ptr<content::TestWebUI> test_web_ui_; + std::unique_ptr<content::TestWebContentsFactory> web_contents_factory_; raw_ptr<TestingProfile> profile_ = nullptr; }; @@ -815,6 +830,7 @@ } TEST_F(FloatingWorkspaceServiceV2Test, NoNetworkForFloatingWorkspaceTemplate) { + SkipOnFirstSyncCallback(); PopulateAppsCache(); CleanUpTestNetworkDevices(); CreateFloatingWorkspaceServiceForTesting(profile()); @@ -825,10 +841,12 @@ fake_device_info_sync_service()); task_environment().RunUntilIdle(); - EXPECT_TRUE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kNetwork, + FloatingWorkspaceDialog::IsShown()); } TEST_F(FloatingWorkspaceServiceV2Test, NetworkConnectedButOffline) { + SkipOnFirstSyncCallback(); PopulateAppsCache(); CleanUpTestNetworkDevices(); // Connect to wifi, but set it to the ready state instead of online. @@ -848,14 +866,16 @@ fake_device_info_sync_service()); task_environment().RunUntilIdle(); - EXPECT_TRUE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kNetwork, + FloatingWorkspaceDialog::IsShown()); // Switch wifi to online and check that Floating Workspace service - // detects it and hide the notification. + // detects it and switches the startup UI back to default. network_handler_test_helper()->SetServiceProperty( path, shill::kStateProperty, base::Value(shill::kStateOnline)); task_environment().RunUntilIdle(); - EXPECT_FALSE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kDefault, + FloatingWorkspaceDialog::IsShown()); } TEST_F(FloatingWorkspaceServiceV2Test, @@ -870,14 +890,17 @@ fake_device_info_sync_service()); task_environment().RunUntilIdle(); - EXPECT_FALSE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kDefault, + FloatingWorkspaceDialog::IsShown()); + task_environment().FastForwardBy( ash::features::kFloatingWorkspaceV2MaxTimeAvailableForRestoreAfterLogin .Get() - base::Milliseconds(1)); CleanUpTestNetworkDevices(); task_environment().RunUntilIdle(); - EXPECT_TRUE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kNetwork, + FloatingWorkspaceDialog::IsShown()); } TEST_F(FloatingWorkspaceServiceV2Test, ConnectAfterNotHavingNetworkInitially) { @@ -903,7 +926,8 @@ fake_desk_sync_service(), fake_device_info_sync_service()); task_environment().RunUntilIdle(); - EXPECT_TRUE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kNetwork, + FloatingWorkspaceDialog::IsShown()); // While offline, Sync might report that download status is up to date, while // upload state indicates we are not active yet. Check that we are not @@ -927,7 +951,8 @@ task_environment().RunUntilIdle(); floating_workspace_service->DefaultNetworkChanged( NetworkHandler::Get()->network_state_handler()->DefaultNetwork()); - EXPECT_FALSE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kDefault, + FloatingWorkspaceDialog::IsShown()); // Just going online is not enough - wait for a sync cycle to complete. test_sync_service()->FireStateChanged(); @@ -971,12 +996,12 @@ ASSERT_TRUE(mock_desks_client()->restored_desk_template()); EXPECT_EQ(mock_desks_client()->restored_desk_template()->template_name(), base::UTF8ToUTF16(template_name)); - // Disconnect from internet. Make sure no notification is sent since restore + // Disconnect from internet. Make sure no UI is shown since restore // happened already. CleanUpTestNetworkDevices(); task_environment().RunUntilIdle(); - EXPECT_FALSE(HasNotificationFor(kNotificationForNoNetworkConnection)); - // Sanity check. Add network back and make sure notification is still gone. + EXPECT_FALSE(FloatingWorkspaceDialog::IsShown()); + // Add network back and make sure there is still no UI. AddTestNetworkDevice(); network_handler_test_helper()->ResetDevicesAndServices(); network_handler_test_helper()->ConfigureService( @@ -985,11 +1010,11 @@ false})"); floating_workspace_service->DefaultNetworkChanged( NetworkHandler::Get()->network_state_handler()->DefaultNetwork()); - EXPECT_FALSE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_FALSE(FloatingWorkspaceDialog::IsShown()); } TEST_F(FloatingWorkspaceServiceV2Test, - NoNetworkNotificationLogicWhenSyncIsInactiveAndOnceSyncIsActiveAgain) { + NoNetworkUiLogicWhenSyncIsInactiveAndOnceSyncIsActiveAgain) { SkipOnFirstSyncCallback(); PopulateAppsCache(); CreateFloatingWorkspaceServiceForTesting(profile()); @@ -1001,11 +1026,12 @@ fake_desk_sync_service(), fake_device_info_sync_service()); test_sync_service()->FireStateChanged(); - EXPECT_TRUE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kError, + FloatingWorkspaceDialog::IsShown()); test_sync_service()->SetAllowedByEnterprisePolicy(true); ASSERT_TRUE(test_sync_service()->IsSyncFeatureEnabled()); test_sync_service()->FireStateChanged(); - EXPECT_FALSE(HasNotificationFor(kNotificationForNoNetworkConnection)); + EXPECT_TRUE(WaitForStartupDialogToClose()); } TEST_F(FloatingWorkspaceServiceV2Test, CanRecordTemplateLoadMetric) { @@ -1388,8 +1414,7 @@ 1ul, fake_desk_sync_service()->GetDeskModel()->GetAllEntryUuids().size()); } -TEST_F(FloatingWorkspaceServiceV2Test, - FloatingWorkspaceTemplateHasProgressStatus) { +TEST_F(FloatingWorkspaceServiceV2Test, FloatingWorkspaceShowsStartupUi) { SkipOnFirstSyncCallback(); PopulateAppsCache(); CreateFloatingWorkspaceServiceForTesting(profile()); @@ -1400,18 +1425,19 @@ fake_device_info_sync_service()); task_environment().FastForwardBy(base::Seconds(5)); - EXPECT_TRUE(HasNotificationFor(kNotificationForProgressStatus)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kDefault, + FloatingWorkspaceDialog::IsShown()); - // Wait for download to complete and check that the progress bar is gone. + // Wait for download to complete and check that the UI is gone. test_sync_service()->SetDownloadStatusFor( {syncer::DataType::WORKSPACE_DESK}, syncer::SyncService::DataTypeDownloadStatus::kUpToDate); test_sync_service()->FireStateChanged(); - EXPECT_FALSE(HasNotificationFor(kNotificationForProgressStatus)); + EXPECT_TRUE(WaitForStartupDialogToClose()); } TEST_F(FloatingWorkspaceServiceV2Test, - FloatingWorkspaceTemplateProgressStatusGoneAfterSyncError) { + FloatingWorkspaceTemplateUiSwitchOnSyncError) { SkipOnFirstSyncCallback(); PopulateAppsCache(); CreateFloatingWorkspaceServiceForTesting(profile()); @@ -1422,14 +1448,15 @@ fake_device_info_sync_service()); task_environment().FastForwardBy(base::Seconds(5)); - EXPECT_TRUE(HasNotificationFor(kNotificationForProgressStatus)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kDefault, + FloatingWorkspaceDialog::IsShown()); // Send sync error to service. test_sync_service()->SetDownloadStatusFor( {syncer::DataType::WORKSPACE_DESK}, syncer::SyncService::DataTypeDownloadStatus::kError); test_sync_service()->FireStateChanged(); - EXPECT_FALSE(HasNotificationFor(kNotificationForProgressStatus)); - EXPECT_TRUE(HasNotificationFor(kNotificationForSyncErrorOrTimeOut)); + EXPECT_EQ(FloatingWorkspaceDialog::State::kError, + FloatingWorkspaceDialog::IsShown()); } TEST_F(FloatingWorkspaceServiceV2Test, @@ -2057,8 +2084,6 @@ /*skip_engine_connection=*/true); test_sync_service2_ = std::make_unique<syncer::TestSyncService>(); - display_service2_ = - std::make_unique<NotificationDisplayServiceTester>(profile2_.get()); cache2_ = std::make_unique<apps::AppRegistryCache>(); fake_device_info_sync_service2_ = std::make_unique<syncer::FakeDeviceInfoSyncService>( @@ -2082,7 +2107,6 @@ std::unique_ptr<desks_storage::FakeDeskSyncService> fake_desk_sync_service2_; base::ScopedTempDir temp_dir2_; AccountId account_id2_; - std::unique_ptr<NotificationDisplayServiceTester> display_service2_; std::unique_ptr<apps::AppRegistryCache> cache2_; std::unique_ptr<syncer::FakeDeviceInfoSyncService> fake_device_info_sync_service2_;
diff --git a/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.cc b/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.cc index 81639353..49f1f33 100644 --- a/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.cc +++ b/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.cc
@@ -274,12 +274,12 @@ } std::string ProfileAuthServersSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string ProfileAuthServersSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_printers_authorization_server()); return entity_data.specifics.printers_authorization_server().uri(); }
diff --git a/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.h b/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.h index 83a6bfc..61fb9b6 100644 --- a/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.h +++ b/chrome/browser/ash/printing/oauth2/profile_auth_servers_sync_bridge.h
@@ -96,8 +96,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; private: ProfileAuthServersSyncBridge(
diff --git a/chrome/browser/ash/printing/printers_sync_bridge.cc b/chrome/browser/ash/printing/printers_sync_bridge.cc index 617ab9f..18339d1b 100644 --- a/chrome/browser/ash/printing/printers_sync_bridge.cc +++ b/chrome/browser/ash/printing/printers_sync_bridge.cc
@@ -311,12 +311,14 @@ return batch; } -std::string PrintersSyncBridge::GetClientTag(const EntityData& entity_data) { +std::string PrintersSyncBridge::GetClientTag( + const EntityData& entity_data) const { // Printers were never synced prior to USS so this can match GetStorageKey. return GetStorageKey(entity_data); } -std::string PrintersSyncBridge::GetStorageKey(const EntityData& entity_data) { +std::string PrintersSyncBridge::GetStorageKey( + const EntityData& entity_data) const { DCHECK(entity_data.specifics.has_printer()); return entity_data.specifics.printer().id(); }
diff --git a/chrome/browser/ash/printing/printers_sync_bridge.h b/chrome/browser/ash/printing/printers_sync_bridge.h index 06d9e05..b78dc1b 100644 --- a/chrome/browser/ash/printing/printers_sync_bridge.h +++ b/chrome/browser/ash/printing/printers_sync_bridge.h
@@ -48,8 +48,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; syncer::ConflictResolution ResolveConflict( const std::string& storage_key, const syncer::EntityData& remote_data) const override;
diff --git a/chrome/browser/autofill/DEPS b/chrome/browser/autofill/DEPS index ba297e7..e9f85e0 100644 --- a/chrome/browser/autofill/DEPS +++ b/chrome/browser/autofill/DEPS
@@ -2,6 +2,7 @@ '+third_party/libaddressinput/chromium/chrome_metadata_source.h', '+third_party/libaddressinput/chromium/chrome_storage_impl.h', '+components/browser_ui/device_lock/android', + '+content/browser/accessibility/browser_accessibility_state.h', ] specific_include_rules = {
diff --git a/chrome/browser/autofill/autofill_flow_test_util.cc b/chrome/browser/autofill/autofill_flow_test_util.cc index 69c3b2b..b85a82d9 100644 --- a/chrome/browser/autofill/autofill_flow_test_util.cc +++ b/chrome/browser/autofill/autofill_flow_test_util.cc
@@ -24,6 +24,7 @@ #include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/ui_test_utils.h" #include "components/autofill/core/common/autofill_util.h" +#include "content/public/browser/browser_accessibility_state.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" #include "content/public/browser/render_widget_host_view.h" @@ -134,6 +135,7 @@ ShowAutofillSuggestionsParams p) { constexpr auto kSuggest = ObservedUiEvents::kSuggestionsShown; constexpr auto kPreview = ObservedUiEvents::kPreviewFormData; + constexpr auto kHide = ObservedUiEvents::kSuggestionsHidden; content::ToRenderFrameHost execution_target = p.execution_target.value_or(test->GetWebContents()); @@ -164,6 +166,11 @@ return test->test_delegate()->Wait(); }; + auto Escape = [&](std::list<ObservedUiEvents> exp) { + return test->SendKeyToPopupAndWait(ui::DomKey::ESCAPE, std::move(exp), + view->GetRenderWidgetHost(), p.timeout); + }; + // It seems that due to race conditions with Blink's layouting // (crbug.com/1175735#c9), the below focus events are sometimes too early: // Autofill closes the popup right away because it is outside of the content @@ -203,6 +210,20 @@ // period out. test->DoNothingAndWaitAndIgnoreEvents(base::Milliseconds(200)); + // `AutofillAgent::HandleFocusChangeComplete` shows the suggestions + // immediately after the field is focused if a screen reader is enabled + // or --force-renderer-accessibility is set. This breaks the logic that + // follows, which expects the popup to not yet be showing. + if (content::BrowserAccessibilityState::GetInstance() + ->GetAccessibilityMode() + .has_mode(ui::AXMode::kScreenReader)) { + if (Escape({kHide})) { + m << "Closed existing Autofill popup. "; + } else { + m << "No existing Autofill popup to close. "; + } + } + bool has_preview = 0 < p.num_profile_suggestions; if (p.show_method.arrow) { // Press arrow down to open the popup and select first suggestion.
diff --git a/chrome/browser/background/glic/BUILD.gn b/chrome/browser/background/glic/BUILD.gn index d07eae2..4ccfead 100644 --- a/chrome/browser/background/glic/BUILD.gn +++ b/chrome/browser/background/glic/BUILD.gn
@@ -92,8 +92,8 @@ "//chrome/browser:global_features", "//chrome/browser/background:background", "//chrome/browser/glic", - "//chrome/browser/glic:glic", "//chrome/browser/glic:impl", + "//chrome/browser/glic/fre", "//chrome/browser/glic/test_support", "//chrome/browser/status_icons:status_icons", "//chrome/common:chrome_features",
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index b10e17a9..26c0435 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -4084,6 +4084,11 @@ "expiry_milestone": 160 }, { + "name": "enable-secure-payment-confirmation-ux-refresh", + "owners": ["darwinyang@chromium.org", "chrome-payments-eng@google.com"], + "expiry_milestone": 160 + }, + { "name": "enable-segmentation-internals-survey", "owners": ["ssid@chromium.org", "chrome-segmentation-team@google.com" ], "expiry_milestone": 132 @@ -6593,6 +6598,11 @@ "expiry_milestone": 150 }, { + "name": "new-tab-page-customization-toolbar-button", + "owners": ["hanxi@chromium.org", "xinyiji@google.com", "clank-start@google.com"], + "expiry_milestone": 150 + }, + { "name": "non-modal-sign-in-promo", "owners": [ "kanouche@google.com",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 04999c8..ba1dc07 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -130,6 +130,11 @@ const char kNewTabPageCustomizationName[] = "Customize the new tab page"; const char kNewTabPageCustomizationDescription[] = "If enabled, allows users to customize the new tab page"; + +const char kNewTabPageCustomizationToolbarButtonName[] = + "New tab page customization toolbar button"; +const char kNewTabPageCustomizationToolbarButtonDescription[] = + "Add the new tab page customization button on the toolbar (mobile only)."; #endif // BUILDFLAG(IS_ANDROID) const char kAndroidAppIntegrationWithFaviconName[] = @@ -3713,6 +3718,13 @@ "Allow the passing in and display of card network and issuer icons for the " "Secure Payment Confirmation Web API."; +const char kSecurePaymentConfirmationUxRefreshName[] = + "Secure Payment Confirmation UX Refresh"; +const char kSecurePaymentConfirmationUxRefreshDescription[] = + "This flag enables new UX in the secure payment confirmation dialog " + "including new output states, payment instrument details and payment " + "entities logos."; + const char kSegmentationSurveyPageName[] = "Segmentation survey internals page and model"; const char kSegmentationSurveyPageDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index bcc34ff..dfe9615 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -903,6 +903,9 @@ #if BUILDFLAG(IS_ANDROID) extern const char kNewTabPageCustomizationName[]; extern const char kNewTabPageCustomizationDescription[]; + +extern const char kNewTabPageCustomizationToolbarButtonName[]; +extern const char kNewTabPageCustomizationToolbarButtonDescription[]; #endif // BUILDFLAG(IS_ANDROID) extern const char kEnableGenericSensorExtraClassesName[]; @@ -2127,6 +2130,9 @@ extern const char kSecurePaymentConfirmationNetworkAndIssuerIconsName[]; extern const char kSecurePaymentConfirmationNetworkAndIssuerIconsDescription[]; +extern const char kSecurePaymentConfirmationUxRefreshName[]; +extern const char kSecurePaymentConfirmationUxRefreshDescription[]; + extern const char kSegmentationSurveyPageName[]; extern const char kSegmentationSurveyPageDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 84f212d..5d6d995 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -185,6 +185,7 @@ &kAndroidAppIntegration, &kAndroidAppIntegrationV2, &kNewTabPageCustomization, + &kNewTabPageCustomizationToolbarButton, &kAndroidAppIntegrationWithFavicon, &kAndroidAppIntegrationMultiDataSource, &kAndroidAppearanceSettings, @@ -506,6 +507,10 @@ "NewTabPageCustomization", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kNewTabPageCustomizationToolbarButton, + "NewTabPageCustomizationToolbarButton", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kAndroidAppIntegrationWithFavicon, "AndroidAppIntegrationWithFavicon", 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 1aea728..de75832 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -21,6 +21,7 @@ BASE_DECLARE_FEATURE(kAndroidAppIntegration); BASE_DECLARE_FEATURE(kAndroidAppIntegrationV2); BASE_DECLARE_FEATURE(kNewTabPageCustomization); +BASE_DECLARE_FEATURE(kNewTabPageCustomizationToolbarButton); BASE_DECLARE_FEATURE(kAndroidAppIntegrationWithFavicon); BASE_DECLARE_FEATURE(kAndroidAppIntegrationMultiDataSource); BASE_DECLARE_FEATURE(kAndroidAppearanceSettings);
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 af883c7..e0697dfb 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
@@ -437,6 +437,8 @@ public static final String NEW_TAB_PAGE_ANDROID_TRIGGER_FOR_PRERENDER2 = "NewTabPageAndroidTriggerForPrerender2"; public static final String NEW_TAB_PAGE_CUSTOMIZATION = "NewTabPageCustomization"; + public static final String NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON = + "NewTabPageCustomizationToolbarButton"; public static final String NOTIFICATION_ONE_TAP_UNSUBSCRIBE = "NotificationOneTapUnsubscribe"; public static final String NOTIFICATION_PERMISSION_BOTTOM_SHEET = "NotificationPermissionBottomSheet"; @@ -805,6 +807,8 @@ newCachedFlag(NEW_TAB_PAGE_ANDROID_TRIGGER_FOR_PRERENDER2, true); public static final CachedFlag sNewTabPageCustomization = newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION, false); + public static final CachedFlag sNewTabPageCustomizationToolbarButton = + newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON, false); public static final CachedFlag sNotificationTrampoline = newCachedFlag(NOTIFICATION_TRAMPOLINE, false); public static final CachedFlag sOptimizationGuidePushNotifications = @@ -857,7 +861,7 @@ newCachedFlag( TAB_STRIP_INCOGNITO_MIGRATION, /* defaultValue= */ false, - /* defaultValueInTests= */ true); + /* defaultValueInTests= */ false); public static final CachedFlag sTabStripLayoutOptimization = newCachedFlag( TAB_STRIP_LAYOUT_OPTIMIZATION, @@ -966,6 +970,7 @@ sNavBarColorMatchesTabBackground, sNewTabPageAndroidTriggerForPrerender2, sNewTabPageCustomization, + sNewTabPageCustomizationToolbarButton, sNotificationTrampoline, sOptimizationGuidePushNotifications, sPaintPreviewDemo,
diff --git a/chrome/browser/glic/BUILD.gn b/chrome/browser/glic/BUILD.gn index ead363b14..03bab21 100644 --- a/chrome/browser/glic/BUILD.gn +++ b/chrome/browser/glic/BUILD.gn
@@ -20,6 +20,7 @@ "browser_ui/scoped_glic_button_indicator.h", "fre/glic_fre_ui.h", "glic_enabling.h", + "glic_hotkey.h", "glic_keyed_service.h", "glic_keyed_service_factory.h", "glic_pref_names.h", @@ -42,12 +43,10 @@ "host/glic_web_client_access.h", "host/guest_util.h", "host/host.h", - "widget/application_hotkey_delegate.h", "widget/glic_modal_manager.h", "widget/glic_modal_view.h", "widget/glic_view.h", "widget/glic_window_controller.h", - "widget/glic_window_hotkey_delegate.h", "widget/local_hotkey_manager.h", ] public_deps = [ @@ -89,28 +88,8 @@ source_set("impl") { sources = [ - "browser_ui/glic_border_view.cc", - "browser_ui/glic_button_controller.cc", - "browser_ui/glic_iph_controller.cc", - "browser_ui/glic_tab_indicator_helper.cc", - "browser_ui/glic_vector_icon_manager.cc", - "browser_ui/scoped_glic_button_indicator.cc", - "browser_ui/theme_util.cc", - "browser_ui/theme_util.h", - "fre/fre_util.cc", - "fre/fre_util.h", - "fre/fre_webui_contents_container.cc", - "fre/fre_webui_contents_container.h", - "fre/glic_fre_controller.cc", - "fre/glic_fre_controller.h", - "fre/glic_fre_dialog_view.cc", - "fre/glic_fre_dialog_view.h", - "fre/glic_fre_page_handler.cc", - "fre/glic_fre_page_handler.h", - "fre/glic_fre_ui.cc", "glic_enabling.cc", "glic_hotkey.cc", - "glic_hotkey.h", "glic_keyed_service.cc", "glic_keyed_service_factory.cc", "glic_metrics.cc", @@ -140,6 +119,7 @@ "host/webui_contents_container.cc", "host/webui_contents_container.h", "widget/application_hotkey_delegate.cc", + "widget/application_hotkey_delegate.h", "widget/browser_conditions.cc", "widget/browser_conditions.h", "widget/glic_modal_manager.cc", @@ -152,6 +132,7 @@ "widget/glic_window_controller_impl.cc", "widget/glic_window_controller_impl.h", "widget/glic_window_hotkey_delegate.cc", + "widget/glic_window_hotkey_delegate.h", "widget/glic_window_resize_animation.cc", "widget/glic_window_resize_animation.h", "widget/local_hotkey_manager.cc", @@ -164,6 +145,8 @@ "//chrome/browser/actor", "//chrome/browser/background/glic", "//chrome/browser/contextual_cueing", + "//chrome/browser/glic/browser_ui", + "//chrome/browser/glic/fre", "//chrome/browser/glic/media", "//chrome/browser/lifetime:termination_notification", "//chrome/browser/media/webrtc", @@ -207,13 +190,11 @@ } mojom("mojo_bindings") { - sources = [ - "fre/glic_fre.mojom", - "host/glic.mojom", - ] + sources = [ "host/glic.mojom" ] webui_module_path = "/" public_deps = [ + "//chrome/browser/glic/fre:mojo_bindings", "//components/content_settings/core/common:content_settings_types", "//components/optimization_guide/content/mojom:mojo_interfaces", "//mojo/public/mojom/base", @@ -228,8 +209,6 @@ source_set("unit_tests") { testonly = true sources = [ - "browser_ui/glic_button_controller_unittest.cc", - "fre/glic_fre_controller_unittest.cc", "glic_enabling_unittest.cc", "glic_metrics_unittest.cc", "host/context/glic_screenshot_capturer_unittest.cc", @@ -243,6 +222,8 @@ "//chrome/browser:global_features", "//chrome/browser/background:background", "//chrome/browser/background/glic", + "//chrome/browser/glic/browser_ui:unit_tests", + "//chrome/browser/glic/fre:unit_tests", "//chrome/browser/glic/media:unit_tests", "//chrome/browser/glic/test_support", "//chrome/browser/prefs:prefs", @@ -262,7 +243,6 @@ testonly = true defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] sources = [ - "fre/glic_fre_controller_browsertest.cc", "glic_browsertest.cc", "glic_enabling_browsertest.cc", "glic_policy_browsertest.cc", @@ -280,6 +260,7 @@ "//chrome/browser:global_features", "//chrome/browser/background/glic", "//chrome/browser/extensions:extensions", + "//chrome/browser/glic/fre:browser_tests", "//chrome/browser/glic/test_support", "//chrome/browser/optimization_guide:test_support", "//chrome/browser/policy:test_support", @@ -302,9 +283,6 @@ testonly = true defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] sources = [ - "browser_ui/glic_border_view_interactive_uitest.cc", - "browser_ui/glic_tab_indicator_helper_interactive_uitest.cc", - "fre/glic_fre_controller_interactive_uitest.cc", "glic_profile_manager_interactive_uitest.cc", "glic_settings_util_interactive_uitest.cc", "host/glic_actor_controller_interactive_uitest.cc", @@ -324,6 +302,9 @@ "//chrome/browser/background/glic", "//chrome/browser/contextual_cueing", "//chrome/browser/contextual_cueing:test_support", + "//chrome/browser/glic/browser_ui:interactive_ui_tests", + "//chrome/browser/glic/fre", + "//chrome/browser/glic/fre:interactive_ui_tests", "//chrome/browser/glic/test_support", "//chrome/browser/optimization_guide", "//chrome/browser/permissions:test_support",
diff --git a/chrome/browser/glic/browser_ui/BUILD.gn b/chrome/browser/glic/browser_ui/BUILD.gn new file mode 100644 index 0000000..f52d34eb --- /dev/null +++ b/chrome/browser/glic/browser_ui/BUILD.gn
@@ -0,0 +1,81 @@ +# 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("//chrome/common/features.gni") + +assert(enable_glic) + +source_set("browser_ui") { + sources = [ + "glic_border_view.cc", + "glic_button_controller.cc", + "glic_iph_controller.cc", + "glic_tab_indicator_helper.cc", + "glic_vector_icon_manager.cc", + "scoped_glic_button_indicator.cc", + "theme_util.cc", + "theme_util.h", + ] + deps = [ + "//chrome/browser/themes:themes", + "//chrome/browser/ui/tabs:tab_strip", + "//chrome/browser/ui/user_education:user_education", + "//components/feature_engagement/public:public", + ] + public_deps = [ "//chrome/browser/glic" ] +} + +source_set("unit_tests") { + testonly = true + sources = [ "glic_button_controller_unittest.cc" ] + deps = [ + ":browser_ui", + "//base/test:test_support", + "//chrome/browser:browser", + "//chrome/browser:global_features", + "//chrome/browser/glic", + "//chrome/browser/glic/test_support", + "//chrome/browser/profiles:profile", + "//chrome/browser/ui:ui_features", + "//chrome/common:chrome_features", + "//chrome/common:constants", + "//chrome/test:test_support", + "//components/prefs", + "//components/signin/public/identity_manager:test_support", + "//content/test:test_support", + "//testing/gmock", + "//testing/gtest", + "//ui/gfx", + ] +} + +source_set("interactive_ui_tests") { + testonly = true + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + sources = [ + "glic_border_view_interactive_uitest.cc", + "glic_tab_indicator_helper_interactive_uitest.cc", + ] + deps = [ + ":browser_ui", + "//base", + "//chrome/browser/glic/test_support", + "//chrome/browser/ui", + "//chrome/browser/ui:browser_element_identifiers", + "//chrome/browser/ui/tabs/alert:tab_alert", + "//chrome/common:chrome_features", + "//chrome/common:non_code_constants", + "//chrome/test:test_support_ui", + "//content/test:test_support", + "//testing/gmock", + "//testing/gtest", + "//ui/base:test_support", + "//ui/compositor:compositor", + "//ui/gfx", + "//ui/gfx:gfx_switches", + "//ui/views", + "//ui/views:test_support", + "//url", + ] +}
diff --git a/chrome/browser/glic/e2e_test/BUILD.gn b/chrome/browser/glic/e2e_test/BUILD.gn index 062a1add..0ba0b3fa 100644 --- a/chrome/browser/glic/e2e_test/BUILD.gn +++ b/chrome/browser/glic/e2e_test/BUILD.gn
@@ -30,6 +30,7 @@ "//chrome/browser/contextual_cueing", "//chrome/browser/glic", "//chrome/browser/glic:impl", + "//chrome/browser/glic/fre", "//chrome/browser/glic/test_support", "//chrome/browser/signin/e2e_tests:test_support", "//chrome/browser/ui:ui_features",
diff --git a/chrome/browser/glic/fre/BUILD.gn b/chrome/browser/glic/fre/BUILD.gn new file mode 100644 index 0000000..4fbaf56 --- /dev/null +++ b/chrome/browser/glic/fre/BUILD.gn
@@ -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. + +import("//chrome/common/features.gni") +import("//mojo/public/tools/bindings/mojom.gni") + +assert(enable_glic) + +source_set("fre") { + sources = [ + "fre_util.cc", + "fre_util.h", + "fre_webui_contents_container.cc", + "fre_webui_contents_container.h", + "glic_fre_controller.cc", + "glic_fre_controller.h", + "glic_fre_dialog_view.cc", + "glic_fre_dialog_view.h", + "glic_fre_page_handler.cc", + "glic_fre_page_handler.h", + "glic_fre_ui.cc", + ] + deps = [ + "//chrome/browser:browser_process", + "//chrome/browser/background/glic", + "//chrome/browser/glic", + "//chrome/browser/glic/browser_ui", + "//chrome/browser/resources/glic/fre:resources_grit", + "//chrome/browser/themes", + ] + public_deps = [ "//chrome/browser:browser_public_dependencies" ] +} + +mojom("mojo_bindings") { + sources = [ "glic_fre.mojom" ] + public_deps = [ "//url/mojom:url_mojom_gurl" ] + webui_module_path = "/" +} + +source_set("unit_tests") { + testonly = true + sources = [ "glic_fre_controller_unittest.cc" ] + deps = [ + ":fre", + "//base/test:test_support", + "//chrome/browser:browser_process", + "//chrome/browser:global_features", + "//chrome/browser/background/glic", + "//chrome/browser/glic", + "//chrome/browser/ui:ui_features", + "//chrome/test:test_support", + "//components/signin/public/identity_manager:test_support", + "//content/test:test_support", + "//testing/gtest:gtest", + ] +} + +source_set("browser_tests") { + testonly = true + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + sources = [ "glic_fre_controller_browsertest.cc" ] + deps = [ + ":fre", + "//base/test:test_support", + "//chrome/browser", + "//chrome/browser/glic", + "//chrome/browser/glic/test_support:test_support", + "//chrome/browser/ui:ui", + "//chrome/test:test_support", + "//chrome/test:test_support_ui", + "//content/test:test_support", + "//testing/gtest:gtest", + ] +} + +source_set("interactive_ui_tests") { + testonly = true + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + sources = [ "glic_fre_controller_interactive_uitest.cc" ] + deps = [ + ":fre", + "//chrome/browser", + "//chrome/browser/glic", + "//chrome/browser/glic/test_support:test_support", + "//chrome/browser/ui:browser_element_identifiers", + "//chrome/test:test_support_ui", + "//content/test:test_support", + "//net:test_support", + "//ui/base:test_support", + ] +}
diff --git a/chrome/browser/glic/test_support/BUILD.gn b/chrome/browser/glic/test_support/BUILD.gn index 892dfcf..18dde89d 100644 --- a/chrome/browser/glic/test_support/BUILD.gn +++ b/chrome/browser/glic/test_support/BUILD.gn
@@ -23,6 +23,7 @@ deps = [ "//chrome/browser/glic", "//chrome/browser/glic:impl", + "//chrome/browser/glic/fre", "//chrome/browser/ui:ui_features", "//components/signin/public/identity_manager:test_support", "//ui/events:test_support",
diff --git a/chrome/browser/glic/widget/glic_window_controller.h b/chrome/browser/glic/widget/glic_window_controller.h index c571d968..8ed5b2d 100644 --- a/chrome/browser/glic/widget/glic_window_controller.h +++ b/chrome/browser/glic/widget/glic_window_controller.h
@@ -19,9 +19,7 @@ #include "chrome/browser/glic/host/glic.mojom.h" #include "chrome/browser/glic/host/glic_web_client_access.h" #include "chrome/browser/glic/host/host.h" -#include "chrome/browser/glic/widget/application_hotkey_delegate.h" #include "chrome/browser/glic/widget/glic_modal_manager.h" -#include "chrome/browser/glic/widget/glic_window_hotkey_delegate.h" #include "chrome/browser/glic/widget/local_hotkey_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_window/public/browser_window_interface.h" @@ -29,7 +27,6 @@ #include "content/public/browser/web_contents.h" #include "ui/base/interaction/element_tracker.h" #include "ui/views/widget/widget.h" -#include "ui/views/widget/widget_observer.h" class Browser; namespace gfx {
diff --git a/chrome/browser/global_features.cc b/chrome/browser/global_features.cc index b173fb62..09310d8 100644 --- a/chrome/browser/global_features.cc +++ b/chrome/browser/global_features.cc
@@ -32,7 +32,9 @@ #endif #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#include "chrome/browser/win/installer_downloader/installer_downloader_controller.h" #include "chrome/browser/win/installer_downloader/installer_downloader_feature.h" +#include "chrome/browser/win/installer_downloader/installer_downloader_infobar_delegate.h" #endif namespace { @@ -88,8 +90,10 @@ #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) if (base::FeatureList::IsEnabled( installer_downloader::kInstallerDownloader)) { - // TODO(crbug.com/414780983): Instantiate and initialize the installer - // downloader controller. + installer_downloader_controller_ = std::make_unique< + installer_downloader::InstallerDownloaderController>( + base::BindRepeating( + &installer_downloader::InstallerDownloaderInfoBarDelegate::Show)); } #endif }
diff --git a/chrome/browser/global_features.h b/chrome/browser/global_features.h index 098e749..aef6e032 100644 --- a/chrome/browser/global_features.h +++ b/chrome/browser/global_features.h
@@ -8,6 +8,7 @@ #include <memory.h> #include "base/functional/callback.h" +#include "build/branding_buildflags.h" #include "build/build_config.h" #include "chrome/common/buildflags.h" @@ -29,6 +30,10 @@ class ApplicationLocaleStorage; +namespace installer_downloader { +class InstallerDownloaderController; +} + // This class owns the core controllers for features that are globally // scoped on desktop. It can be subclassed by tests to perform // dependency injection. @@ -82,6 +87,13 @@ return application_locale_storage_.get(); } +#if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) + installer_downloader::InstallerDownloaderController* + installer_downloader_controller() { + return installer_downloader_controller_.get(); + } +#endif + protected: GlobalFeatures(); @@ -113,6 +125,11 @@ #endif std::unique_ptr<ApplicationLocaleStorage> application_locale_storage_; + +#if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) + std::unique_ptr<installer_downloader::InstallerDownloaderController> + installer_downloader_controller_; +#endif }; #endif // CHROME_BROWSER_GLOBAL_FEATURES_H_
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinator.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinator.java index f12f60e..2c32cfb 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinator.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinator.java
@@ -190,6 +190,29 @@ return BackPressResult.FAILURE; } + @Nullable + @Override + public Boolean handleEscPress() { + if (Boolean.TRUE.equals(mFocusedPaneHandleBackPressSupplier.get()) + && assumeNonNull(getFocusedPane()).handleBackPress() == BackPressResult.SUCCESS) { + return Boolean.TRUE; + } + + Tab tab = mCurrentTabSupplier.get(); + if (tab != null) { + mHubLayoutController.selectTabAndHideHubLayout(tab.getId()); + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + @Override + public boolean invokeBackActionOnEscape() { + // We want a slightly different flow for Escape presses. Escape will close dialogs, and + // close the Hub, but will not navigate back in Hub pane history like Back presses. + return false; + } + @Override public ObservableSupplier<Boolean> getHandleBackPressChangedSupplier() { return mHandleBackPressSupplier;
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinatorUnitTest.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinatorUnitTest.java index a98948f3..b945a75 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinatorUnitTest.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinatorUnitTest.java
@@ -266,6 +266,19 @@ } @Test + public void testBackNavigationBetweenPanesOnEscapeKeyPressNotTriggered() { + assertFalse(mHubCoordinator.getHandleBackPressChangedSupplier().get()); + + assertTrue(mPaneManager.focusPane(PaneId.INCOGNITO_TAB_SWITCHER)); + assertEquals(mIncognitoTabSwitcherPane, mPaneManager.getFocusedPaneSupplier().get()); + assertTrue(mHubCoordinator.getHandleBackPressChangedSupplier().get()); + + assertEquals(Boolean.FALSE, mHubCoordinator.handleEscPress()); + assertEquals(mIncognitoTabSwitcherPane, mPaneManager.getFocusedPaneSupplier().get()); + assertTrue(mHubCoordinator.getHandleBackPressChangedSupplier().get()); + } + + @Test public void testBackNavigationWithNullTab() { assertFalse(mHubCoordinator.getHandleBackPressChangedSupplier().get()); assertEquals(BackPressResult.FAILURE, mHubCoordinator.handleBackPress()); @@ -279,6 +292,19 @@ } @Test + public void testBackNavigationWithNullTabOnEscapeKeyPress() { + assertFalse(mHubCoordinator.getHandleBackPressChangedSupplier().get()); + assertEquals(Boolean.FALSE, mHubCoordinator.handleEscPress()); + + mTabSupplier.set(mTab); + assertTrue(mHubCoordinator.getHandleBackPressChangedSupplier().get()); + mTabSupplier.set(null); + + assertEquals(Boolean.FALSE, mHubCoordinator.handleEscPress()); + verify(mHubLayoutController, never()).selectTabAndHideHubLayout(anyInt()); + } + + @Test public void testBackNavigationWithTab() { assertFalse(mHubCoordinator.getHandleBackPressChangedSupplier().get()); assertEquals(BackPressResult.FAILURE, mHubCoordinator.handleBackPress()); @@ -291,6 +317,18 @@ } @Test + public void testBackNavigationWithTabOnEscapeKeyPress() { + assertFalse(mHubCoordinator.getHandleBackPressChangedSupplier().get()); + assertEquals(Boolean.FALSE, mHubCoordinator.handleEscPress()); + + mTabSupplier.set(mTab); + assertTrue(mHubCoordinator.getHandleBackPressChangedSupplier().get()); + + assertEquals(Boolean.TRUE, mHubCoordinator.handleEscPress()); + verify(mHubLayoutController).selectTabAndHideHubLayout(eq(TAB_ID)); + } + + @Test public void testFocusPane() { reset(mPaneManager); mHubCoordinator.focusPane(PaneId.TAB_SWITCHER);
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/PaneBackStackHandlerUnitTest.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/PaneBackStackHandlerUnitTest.java index aa56201..5f985db 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/PaneBackStackHandlerUnitTest.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/PaneBackStackHandlerUnitTest.java
@@ -6,6 +6,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; @@ -297,6 +298,34 @@ assertFalse(mBackStackHandler.getHandleBackPressChangedSupplier().get()); } + @Test + @SmallTest + public void testBackStackIsIgnoredByEscape() { + mBackStackHandler = new PaneBackStackHandler(mPaneManager); + assertTrue(hasObservers(mPaneManager.getFocusedPaneSupplier())); + ShadowLooper.runUiThreadTasks(); + + assertFalse(mBackStackHandler.getHandleBackPressChangedSupplier().get()); + + // Focus each of three panes. + assertTrue(mPaneManager.focusPane(PaneId.TAB_SWITCHER)); + assertFalse(mBackStackHandler.getHandleBackPressChangedSupplier().get()); + assertEquals(mTabSwitcherPane, mPaneManager.getFocusedPaneSupplier().get()); + + assertTrue(mPaneManager.focusPane(PaneId.BOOKMARKS)); + assertTrue(mBackStackHandler.getHandleBackPressChangedSupplier().get()); + assertEquals(mBookmarksPane, mPaneManager.getFocusedPaneSupplier().get()); + + assertTrue(mPaneManager.focusPane(PaneId.INCOGNITO_TAB_SWITCHER)); + assertTrue(mBackStackHandler.getHandleBackPressChangedSupplier().get()); + assertEquals(mIncognitoTabSwitcherPane, mPaneManager.getFocusedPaneSupplier().get()); + + // Ensure Escape key presses do not navigate back in stack. + assertNull(mBackStackHandler.handleEscPress()); + assertTrue(mBackStackHandler.getHandleBackPressChangedSupplier().get()); + assertEquals(mIncognitoTabSwitcherPane, mPaneManager.getFocusedPaneSupplier().get()); + } + private boolean hasObservers(ObservableSupplier<Pane> paneSupplier) { return ((ObservableSupplierImpl<Pane>) paneSupplier).hasObservers(); }
diff --git a/chrome/browser/metrics/chrome_metrics_service_accessor.h b/chrome/browser/metrics/chrome_metrics_service_accessor.h index 8dc956a2..a02e64d9 100644 --- a/chrome/browser/metrics/chrome_metrics_service_accessor.h +++ b/chrome/browser/metrics/chrome_metrics_service_accessor.h
@@ -165,6 +165,7 @@ friend class ChromeBrowserMainParts; friend class ChromeContentBrowserClient; friend class ChromeMetricsServicesManagerClient; + friend class ChromeSigninClient; friend class browser_sync::ChromeSyncClient; // TODO(crbug.com/40948861): Remove this friend when the limited entropy // synthetic trial has wrapped up.
diff --git a/chrome/browser/nearby_sharing/common/nearby_share_features.cc b/chrome/browser/nearby_sharing/common/nearby_share_features.cc index 55c06ba..ef206db 100644 --- a/chrome/browser/nearby_sharing/common/nearby_share_features.cc +++ b/chrome/browser/nearby_sharing/common/nearby_share_features.cc
@@ -12,12 +12,6 @@ // Enables Quick Share branding. BASE_FEATURE(kIsNameEnabled, "IsNameEnabled", base::FEATURE_ENABLED_BY_DEFAULT); -// Enables UI features for Self Share to allow seamless sharing between a user's -// own devices. -BASE_FEATURE(kNearbySharingSelfShare, - "NearbySharingSelfShare", - base::FEATURE_ENABLED_BY_DEFAULT); - // Enables contact restriction when not in high-visibility mode. BASE_FEATURE(kNearbySharingRestrictToContacts, "NearbySharingRestrictToContacts",
diff --git a/chrome/browser/nearby_sharing/common/nearby_share_features.h b/chrome/browser/nearby_sharing/common/nearby_share_features.h index 0df94ac..bdb493f 100644 --- a/chrome/browser/nearby_sharing/common/nearby_share_features.h +++ b/chrome/browser/nearby_sharing/common/nearby_share_features.h
@@ -13,8 +13,6 @@ bool IsNameEnabled(); BASE_DECLARE_FEATURE(kNearbySharingRestrictToContacts); bool IsRestrictToContactsEnabled(); -BASE_DECLARE_FEATURE(kNearbySharingSelfShare); -bool IsSelfShareEnabled(); BASE_DECLARE_FEATURE(kNearbySharingVisibilityReminder); BASE_DECLARE_FEATURE(kNearbySharingWebRtc); BASE_DECLARE_FEATURE(kNearbySharingWifiLan);
diff --git a/chrome/browser/password_manager/android/BUILD.gn b/chrome/browser/password_manager/android/BUILD.gn index 15146bf..a508810 100644 --- a/chrome/browser/password_manager/android/BUILD.gn +++ b/chrome/browser/password_manager/android/BUILD.gn
@@ -340,6 +340,7 @@ "junit/src/org/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackendDispatcherBridgeTest.java", "junit/src/org/chromium/chrome/browser/password_manager/PasswordStoreAndroidBackendReceiverBridgeTest.java", "junit/src/org/chromium/chrome/browser/password_manager/PasswordSyncControllerDelegateBridgeTest.java", + "junit/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridgeTest.java", "junit/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchReceiverBridgeTest.java", "junit/src/org/chromium/chrome/browser/password_manager/settings/PasswordReauthenticationFragmentTest.java", "junit/src/org/chromium/chrome/browser/password_manager/settings/ReauthenticationManagerTest.java", @@ -373,6 +374,7 @@ "//chrome/browser/password_manager/android/access_loss:helper_java", "//chrome/browser/password_manager/android/access_loss:utils_java", "//chrome/browser/password_manager/android/one_time_passwords:java", + "//chrome/browser/password_manager/android/one_time_passwords:sms_otp_fetching_interface_java", "//chrome/browser/password_manager/android/pwd_migration:java", "//chrome/browser/password_manager/android/pwm_disabled:java", "//chrome/browser/preferences:java", @@ -474,18 +476,6 @@ ] } -android_library("sms_otp_fetching_interface_java") { - deps = [ - "//base:base_java", - "//base:service_loader_java", - ] - sources = [ - "java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcher.java", - "java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcherFactory.java", - "java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcherFactoryUpstreamImpl.java", - ] -} - generate_jni("test_support_jni_headers") { testonly = true sources = [ "test_support/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerTestUtilsBridge.java" ]
diff --git a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridgeTest.java b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridgeTest.java new file mode 100644 index 0000000..7587f81 --- /dev/null +++ b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridgeTest.java
@@ -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. + +package org.chromium.chrome.browser.password_manager.one_time_passwords; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.google.android.gms.common.api.ApiException; +import com.google.android.gms.common.api.CommonStatusCodes; +import com.google.android.gms.common.api.Status; + +import org.junit.Before; +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.test.BaseRobolectricTestRunner; + +/** Tests that dispatcher bridge calls reach the OTP fetcher. */ +@RunWith(BaseRobolectricTestRunner.class) +public class AndroidSmsOtpFetchDispatcherBridgeTest { + + @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); + + @Mock private AndroidSmsOtpFetchReceiverBridge mReceiverBridgeMock; + @Mock private AndroidSmsOtpFetcher mSmsOtpFetcherMock; + @Mock private AndroidSmsOtpFetcherFactory mAndroidSmsOtpFetcherFactoryMock; + + private AndroidSmsOtpFetchDispatcherBridge mDispatcherBridge; + + @Before + public void setUp() { + mDispatcherBridge = + new AndroidSmsOtpFetchDispatcherBridge(mReceiverBridgeMock, mSmsOtpFetcherMock); + } + + @Test + public void testBridgeNotCreatedWhenThereIsNoFetcher() { + when(mAndroidSmsOtpFetcherFactoryMock.createSmsOtpFetcher()).thenReturn(null); + AndroidSmsOtpFetcherFactory.setFactoryForTesting(mAndroidSmsOtpFetcherFactoryMock); + assertNull(AndroidSmsOtpFetchDispatcherBridge.create(mReceiverBridgeMock)); + } + + @Test + public void testRetrieveSmsOtpCallsReceiverBridgeOnSuccess() { + mDispatcherBridge.retrieveSmsOtp(); + ArgumentCaptor<Callback<String>> successCallback = ArgumentCaptor.forClass(Callback.class); + verify(mSmsOtpFetcherMock).retrieveSmsOtp(successCallback.capture(), any()); + assertNotNull(successCallback.getValue()); + + String kOtpValue = "123456"; + successCallback.getValue().onResult(kOtpValue); + verify(mReceiverBridgeMock).onOtpValueRetrieved(kOtpValue); + } + + @Test + public void testRetrieveSmsOtpCallsReceiverBridgeOnFailure() { + mDispatcherBridge.retrieveSmsOtp(); + ArgumentCaptor<Callback<ApiException>> failureCallback = + ArgumentCaptor.forClass(Callback.class); + verify(mSmsOtpFetcherMock).retrieveSmsOtp(any(), failureCallback.capture()); + assertNotNull(failureCallback.getValue()); + + ApiException receivedException = new ApiException(new Status(CommonStatusCodes.TIMEOUT)); + failureCallback.getValue().onResult(receivedException); + verify(mReceiverBridgeMock).onOtpValueRetrievalError(receivedException); + } +}
diff --git a/chrome/browser/password_manager/android/one_time_passwords/BUILD.gn b/chrome/browser/password_manager/android/one_time_passwords/BUILD.gn index fd5a504..02a5cf5 100644 --- a/chrome/browser/password_manager/android/one_time_passwords/BUILD.gn +++ b/chrome/browser/password_manager/android/one_time_passwords/BUILD.gn
@@ -11,6 +11,8 @@ "android_sms_otp_backend.h", "android_sms_otp_backend_factory.cc", "android_sms_otp_backend_factory.h", + "android_sms_otp_fetch_dispatcher_bridge.cc", + "android_sms_otp_fetch_dispatcher_bridge.h", "android_sms_otp_fetch_receiver_bridge.cc", "android_sms_otp_fetch_receiver_bridge.h", "sms_otp_retrieval_api_error_codes.h", @@ -31,17 +33,24 @@ ":*", "//chrome/browser", ] - sources = [ "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchReceiverBridge.java" ] + sources = [ + "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridge.java", + "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchReceiverBridge.java", + ] } android_library("java") { srcjar_deps = [ ":jni_headers" ] - sources = [ "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchReceiverBridge.java" ] + sources = [ + "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridge.java", + "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchReceiverBridge.java", + ] deps = [ "$google_play_services_package:google_play_services_basement_java", "//base:base_java", "//build/android:build_java", + "//chrome/browser/password_manager/android/one_time_passwords:sms_otp_fetching_interface_java", "//third_party/jni_zero:gendeps_java", "//third_party/jni_zero:jni_zero_java", ] @@ -49,3 +58,16 @@ resources_package = "org.chromium.chrome.browser.password_manager.one_time_passwords" } + +android_library("sms_otp_fetching_interface_java") { + deps = [ + "$google_play_services_package:google_play_services_basement_java", + "//base:base_java", + "//base:service_loader_java", + ] + sources = [ + "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcher.java", + "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcherFactory.java", + "java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcherFactoryUpstreamImpl.java", + ] +}
diff --git a/chrome/browser/password_manager/android/one_time_passwords/android_sms_otp_fetch_dispatcher_bridge.cc b/chrome/browser/password_manager/android/one_time_passwords/android_sms_otp_fetch_dispatcher_bridge.cc new file mode 100644 index 0000000..70c3a27 --- /dev/null +++ b/chrome/browser/password_manager/android/one_time_passwords/android_sms_otp_fetch_dispatcher_bridge.cc
@@ -0,0 +1,41 @@ +// 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/password_manager/android/one_time_passwords/android_sms_otp_fetch_dispatcher_bridge.h" + +#include "base/android/jni_android.h" + +// Must come after all headers that specialize FromJniType() / ToJniType(). +#include "chrome/browser/password_manager/android/one_time_passwords/jni_headers/AndroidSmsOtpFetchDispatcherBridge_jni.h" + +// static +std::unique_ptr<AndroidSmsOtpFetchDispatcherBridge> +AndroidSmsOtpFetchDispatcherBridge::Create() { + return std::make_unique<AndroidSmsOtpFetchDispatcherBridge>(); +} + +AndroidSmsOtpFetchDispatcherBridge::AndroidSmsOtpFetchDispatcherBridge() { + // This is needed because the bridge is constructed from the main thread, + // but is later used only on the background thread. + DETACH_FROM_THREAD(thread_checker_); +} + +AndroidSmsOtpFetchDispatcherBridge::~AndroidSmsOtpFetchDispatcherBridge() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); +} + +bool AndroidSmsOtpFetchDispatcherBridge::Init( + base::android::ScopedJavaGlobalRef<jobject> receiver_bridge) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + java_object_ = Java_AndroidSmsOtpFetchDispatcherBridge_create( + base::android::AttachCurrentThread(), receiver_bridge); + return !java_object_.is_null(); +} + +void AndroidSmsOtpFetchDispatcherBridge::RetrieveSmsOtp() { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + CHECK(!java_object_.is_null()); + Java_AndroidSmsOtpFetchDispatcherBridge_retrieveSmsOtp( + base::android::AttachCurrentThread(), java_object_); +}
diff --git a/chrome/browser/password_manager/android/one_time_passwords/android_sms_otp_fetch_dispatcher_bridge.h b/chrome/browser/password_manager/android/one_time_passwords/android_sms_otp_fetch_dispatcher_bridge.h new file mode 100644 index 0000000..66a80f1 --- /dev/null +++ b/chrome/browser/password_manager/android/one_time_passwords/android_sms_otp_fetch_dispatcher_bridge.h
@@ -0,0 +1,44 @@ +// 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_PASSWORD_MANAGER_ANDROID_ONE_TIME_PASSWORDS_ANDROID_SMS_OTP_FETCH_DISPATCHER_BRIDGE_H_ +#define CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_ONE_TIME_PASSWORDS_ANDROID_SMS_OTP_FETCH_DISPATCHER_BRIDGE_H_ + +#include <memory> + +#include "base/android/scoped_java_ref.h" +#include "base/threading/thread_checker.h" +#include "chrome/browser/password_manager/android/one_time_passwords/android_sms_otp_fetch_receiver_bridge.h" + +// A bridge to send OTP fetch requests to Java. Lives on the background thread. +class AndroidSmsOtpFetchDispatcherBridge { + public: + // Factory function for creating the bridge. + static std::unique_ptr<AndroidSmsOtpFetchDispatcherBridge> Create(); + + AndroidSmsOtpFetchDispatcherBridge(); + ~AndroidSmsOtpFetchDispatcherBridge(); + + // Perform bridge and Java counterpart initialization. + // `receiver_bridge` is the java counterpart of the + // `AndroidSmsOtpFetchReceiverBridge` and should outlive this object. + // Returns true if initialization is successful and the Java counterpart + // is created. + bool Init(base::android::ScopedJavaGlobalRef<jobject> receiver_bridge); + + // Asynchronously requests the OTP value received via SMS from the backend. + void RetrieveSmsOtp(); + + private: + // The Java counterpart to this class. + base::android::ScopedJavaGlobalRef<jobject> java_object_ + GUARDED_BY_CONTEXT(thread_checker_); + + // All operations should be called on the same background thread. + // As sequence does not guarantee execution on the same thread in general, + // a `SEQUENCE_CHECKER` is not sufficient here. + THREAD_CHECKER(thread_checker_); +}; + +#endif // CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_ONE_TIME_PASSWORDS_ANDROID_SMS_OTP_FETCH_DISPATCHER_BRIDGE_H_
diff --git a/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridge.java b/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridge.java new file mode 100644 index 0000000..6f4bf31 --- /dev/null +++ b/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetchDispatcherBridge.java
@@ -0,0 +1,44 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.password_manager.one_time_passwords; + +import org.jni_zero.CalledByNative; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; + +/** + * Java-counterpart of the native AndroidSmsOtpFetchDispatcherBridge. It's part of the OTP value + * fetching backend that forwards retrieval requests to a downstream implementation. + */ +@NullMarked +class AndroidSmsOtpFetchDispatcherBridge { + private final AndroidSmsOtpFetchReceiverBridge mReceiverBridge; + private final AndroidSmsOtpFetcher mOtpFetcher; + + AndroidSmsOtpFetchDispatcherBridge( + AndroidSmsOtpFetchReceiverBridge receiverBridge, AndroidSmsOtpFetcher otpFetcher) { + mReceiverBridge = receiverBridge; + mOtpFetcher = otpFetcher; + } + + @CalledByNative + static @Nullable AndroidSmsOtpFetchDispatcherBridge create( + AndroidSmsOtpFetchReceiverBridge receiverBridge) { + AndroidSmsOtpFetcher otpFetcher = + AndroidSmsOtpFetcherFactory.getInstance().createSmsOtpFetcher(); + if (otpFetcher == null) { + return null; + } + return new AndroidSmsOtpFetchDispatcherBridge(receiverBridge, otpFetcher); + } + + @CalledByNative + void retrieveSmsOtp() { + mOtpFetcher.retrieveSmsOtp( + otpValue -> mReceiverBridge.onOtpValueRetrieved(otpValue), + exception -> mReceiverBridge.onOtpValueRetrievalError(exception)); + } +}
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcher.java b/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcher.java similarity index 80% rename from chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcher.java rename to chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcher.java index 6a29757..41d4478 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcher.java +++ b/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcher.java
@@ -1,7 +1,9 @@ // Copyright 2025 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.password_manager; +package org.chromium.chrome.browser.password_manager.one_time_passwords; + +import com.google.android.gms.common.api.ApiException; import org.chromium.base.Callback; import org.chromium.build.annotations.NullMarked; @@ -15,5 +17,5 @@ * @param otpValueCallback Callback that is called on success with the fetched OTP value string. * @param failureCallback A callback that is called on failure for any reason. */ - void retrieveSmsOtp(Callback<String> otpValueCallback, Callback<Exception> failureCallback); + void retrieveSmsOtp(Callback<String> otpValueCallback, Callback<ApiException> failureCallback); }
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcherFactory.java b/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcherFactory.java similarity index 77% rename from chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcherFactory.java rename to chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcherFactory.java index f084a4e..8b424fa0f 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcherFactory.java +++ b/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcherFactory.java
@@ -1,8 +1,9 @@ // Copyright 2025 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.password_manager; +package org.chromium.chrome.browser.password_manager.one_time_passwords; +import org.chromium.base.ResettersForTesting; import org.chromium.base.ServiceLoaderUtil; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -39,4 +40,11 @@ public @Nullable AndroidSmsOtpFetcher createSmsOtpFetcher() { return null; } + + public static void setFactoryForTesting( + AndroidSmsOtpFetcherFactory androidSmsOtpFetcherFactory) { + var oldValue = sInstance; + sInstance = androidSmsOtpFetcherFactory; + ResettersForTesting.register(() -> sInstance = oldValue); + } }
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcherFactoryUpstreamImpl.java b/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcherFactoryUpstreamImpl.java similarity index 86% rename from chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcherFactoryUpstreamImpl.java rename to chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcherFactoryUpstreamImpl.java index f2f6a3fd..2dfb90ff 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/AndroidSmsOtpFetcherFactoryUpstreamImpl.java +++ b/chrome/browser/password_manager/android/one_time_passwords/java/src/org/chromium/chrome/browser/password_manager/one_time_passwords/AndroidSmsOtpFetcherFactoryUpstreamImpl.java
@@ -1,7 +1,7 @@ // Copyright 2025 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -package org.chromium.chrome.browser.password_manager; +package org.chromium.chrome.browser.password_manager.one_time_passwords; import org.chromium.build.annotations.NullMarked;
diff --git a/chrome/browser/password_manager/password_change/change_password_form_finder.cc b/chrome/browser/password_manager/password_change/change_password_form_finder.cc index b721eeb2..128fa342 100644 --- a/chrome/browser/password_manager/password_change/change_password_form_finder.cc +++ b/chrome/browser/password_manager/password_change/change_password_form_finder.cc
@@ -4,8 +4,13 @@ #include "chrome/browser/password_manager/password_change/change_password_form_finder.h" +#include "base/functional/bind.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/password_manager/password_change/change_password_form_waiter.h" +#include "chrome/browser/profiles/profile.h" #include "components/optimization_guide/content/browser/page_content_proto_provider.h" +#include "components/optimization_guide/core/model_quality/model_execution_logging_wrappers.h" +#include "components/optimization_guide/proto/features/password_change_submission.pb.h" #include "content/public/browser/web_contents.h" namespace { @@ -16,6 +21,7 @@ // won't capture a snapshot unless it becomes visible again or // on_critical_path is set to true. options->on_critical_path = true; + options->enable_experimental_actionable_data = true; return options; } @@ -75,5 +81,47 @@ } // TODO(crbug.com/407486413): Check if it's a settings page and try to find a // button which opens a change-pwd form. + optimization_guide::proto::PasswordChangeRequest request; + request.set_step(optimization_guide::proto::PasswordChangeRequest::FlowStep:: + PasswordChangeRequest_FlowStep_OPEN_FORM_STEP); + *request.mutable_page_context()->mutable_annotated_page_content() = + std::move(content->proto); + optimization_guide::ExecuteModelWithLogging( + GetOptimizationService(), + optimization_guide::ModelBasedCapabilityKey::kPasswordChangeSubmission, + request, /*execution_timeout=*/std::nullopt, + base::BindOnce(&ChangePasswordFormFinder::OnExecutionResponseCallback, + weak_ptr_factory_.GetMutableWeakPtr())); +} + +OptimizationGuideKeyedService* +ChangePasswordFormFinder::GetOptimizationService() { + return OptimizationGuideKeyedServiceFactory::GetForProfile( + Profile::FromBrowserContext(web_contents_->GetBrowserContext())); +} + +void ChangePasswordFormFinder::OnExecutionResponseCallback( + optimization_guide::OptimizationGuideModelExecutionResult execution_result, + std::unique_ptr< + optimization_guide::proto::PasswordChangeSubmissionLoggingData> + logging_data) { + if (!execution_result.response.has_value()) { + // TODO(crbug.com/407503334): Record metrics here. + std::move(callback_).Run(nullptr); + return; + } + std::optional<optimization_guide::proto::PasswordChangeResponse> response = + optimization_guide::ParsedAnyMetadata< + optimization_guide::proto::PasswordChangeResponse>( + execution_result.response.value()); + if (!response) { + // TODO(crbug.com/407503334): Record metrics here. + std::move(callback_).Run(nullptr); + return; + } + + // TODO (crbug.com/407485204): Get the dom node id from response and initiate + // a click on it. + std::move(callback_).Run(nullptr); }
diff --git a/chrome/browser/password_manager/password_change/change_password_form_finder.h b/chrome/browser/password_manager/password_change/change_password_form_finder.h index 33e537bd..29ca800e 100644 --- a/chrome/browser/password_manager/password_change/change_password_form_finder.h +++ b/chrome/browser/password_manager/password_change/change_password_form_finder.h
@@ -7,6 +7,7 @@ #include "base/functional/callback_forward.h" #include "base/memory/weak_ptr.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" #include "chrome/browser/password_manager/password_change/change_password_form_waiter.h" #include "components/optimization_guide/content/browser/page_content_proto_provider.h" @@ -49,6 +50,15 @@ void OnPageContentReceived( std::optional<optimization_guide::AIPageContentResult> content); + OptimizationGuideKeyedService* GetOptimizationService(); + + void OnExecutionResponseCallback( + optimization_guide::OptimizationGuideModelExecutionResult + execution_result, + std::unique_ptr< + optimization_guide::proto::PasswordChangeSubmissionLoggingData> + logging_data); + base::WeakPtr<content::WebContents> web_contents_; ChangePasswordFormWaiter::PasswordFormFoundCallback callback_; base::OnceCallback<void(optimization_guide::OnAIPageContentDone)>
diff --git a/chrome/browser/password_manager/password_change/change_password_form_finder_unittest.cc b/chrome/browser/password_manager/password_change/change_password_form_finder_unittest.cc index 8405a43a..8a330cf 100644 --- a/chrome/browser/password_manager/password_change/change_password_form_finder_unittest.cc +++ b/chrome/browser/password_manager/password_change/change_password_form_finder_unittest.cc
@@ -8,12 +8,16 @@ #include "base/test/metrics/histogram_tester.h" #include "base/test/mock_callback.h" #include "base/types/pass_key.h" +#include "chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h" +#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/password_manager/account_password_store_factory.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/password_manager/profile_password_store_factory.h" #include "chrome/browser/ui/autofill/chrome_autofill_client.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/autofill/core/common/autofill_test_utils.h" +#include "components/optimization_guide/core/mock_optimization_guide_model_executor.h" +#include "components/optimization_guide/core/optimization_guide_proto_util.h" #include "components/os_crypt/sync/os_crypt_mocker.h" #include "components/password_manager/core/browser/fake_form_fetcher.h" #include "components/password_manager/core/browser/password_manager_test_utils.h" @@ -33,7 +37,9 @@ namespace { using autofill::test::CreateTestFormField; +using testing::Invoke; using testing::Return; +using testing::WithArg; class FakeChromePasswordManagerClient : public ChromePasswordManagerClient { public: @@ -53,6 +59,28 @@ : ChromePasswordManagerClient(web_contents) {} }; +std::unique_ptr<KeyedService> CreateOptimizationService( + content::BrowserContext* context) { + return std::make_unique<MockOptimizationGuideKeyedService>(); +} + +void PostResponse( + optimization_guide::OptimizationGuideModelExecutionResultCallback + callback) { + optimization_guide::proto::PasswordChangeResponse response; + response.mutable_open_form_data()->set_dom_node_id_to_click(0); + response.mutable_open_form_data()->set_page_type( + ::optimization_guide::proto::OpenFormResponseData_PageType:: + OpenFormResponseData_PageType_SETTINGS_PAGE); + + auto result = optimization_guide::OptimizationGuideModelExecutionResult( + optimization_guide::AnyWrapProto(response), + /*execution_info=*/nullptr); + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), std::move(result), + /*log_entry=*/nullptr)); +} + } // namespace class ChangePasswordFormFinderTest : public ChromeRenderViewHostTestHarness { @@ -71,7 +99,9 @@ base::BindRepeating(&password_manager::BuildPasswordStoreInterface< content::BrowserContext, password_manager::MockPasswordStoreInterface>)); - + OptimizationGuideKeyedServiceFactory::GetInstance() + ->SetTestingFactoryAndUse( + profile(), base::BindRepeating(&CreateOptimizationService)); // `ChromePasswordManagerClient` observes `AutofillManager`s, so // `ChromeAutofillClient` needs to be set up, too. autofill::ChromeAutofillClient::CreateForWebContents(web_contents()); @@ -106,6 +136,11 @@ return base::PassKey<class ChangePasswordFormFinderTest>(); } + MockOptimizationGuideKeyedService* optimization_service() { + return static_cast<MockOptimizationGuideKeyedService*>( + OptimizationGuideKeyedServiceFactory::GetForProfile(profile())); + } + private: autofill::test::AutofillUnitTestEnvironment autofill_environment_{ {.disable_server_communication = true}}; @@ -161,6 +196,8 @@ static_cast<content::WebContentsObserver*>(form_finder->form_waiter()) ->DocumentOnLoadCompletedInPrimaryMainFrame(); + EXPECT_CALL(*optimization_service(), ExecuteModel) + .WillOnce(WithArg<3>(Invoke(&PostResponse))); EXPECT_CALL(capture_annotated_page_content, Run) .WillOnce(base::test::RunOnceCallback<0>( optimization_guide::AIPageContentResult()));
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc index fb7181e..3756840 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
@@ -52,7 +52,9 @@ using ::permissions::PermissionRequestRelevance; using ::permissions::PermissionsAiv1Handler; using ::permissions::PermissionsAiv3Handler; +using ::permissions::PermissionUmaUtil; using ::permissions::PredictionModelHandlerProvider; +using ::permissions::PredictionModelType; using ::permissions::PredictionRequestFeatures; using QuietUiReason = PredictionBasedPermissionUiSelector::QuietUiReason; using Decision = PredictionBasedPermissionUiSelector::Decision; @@ -101,28 +103,13 @@ } bool ShouldPredictionTriggerQuietUi( - permissions::PermissionUmaUtil::PredictionGrantLikelihood likelihood) { + PermissionUmaUtil::PredictionGrantLikelihood likelihood) { return likelihood == VeryUnlikely; } void LogSnapshotTakenSuccessfullyForAiv3(bool success) { base::UmaHistogramBoolean("Permissions.AIv3.SnapshotTaken", success); } - -void LogModelInquireTime(base::TimeTicks model_inquire_start_time, - bool is_on_device) { - using permissions::PredictionModelType; - - std::string histogram_name = base::StrCat( - {"Permissions.", - permissions::PermissionUmaUtil::GetPredictionModelString( - is_on_device ? PredictionModelType::kOnDeviceCpssV1Model - : PredictionModelType::kServerSideCpssV3Model), - ".InquiryDuration"}); - base::UmaHistogramMediumTimes( - histogram_name, base::TimeTicks::Now() - model_inquire_start_time); -} - } // namespace PredictionBasedPermissionUiSelector::PredictionBasedPermissionUiSelector( @@ -144,7 +131,7 @@ void PredictionBasedPermissionUiSelector::InquireServerModel( const PredictionRequestFeatures& features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, bool record_source) { permissions::PredictionService* service = PredictionServiceFactory::GetForProfile(profile_); @@ -152,7 +139,7 @@ VLOG(1) << "[CPSS] Starting prediction service request"; if (record_source) { - permissions::PermissionUmaUtil::RecordPermissionPredictionSource( + PermissionUmaUtil::RecordPermissionPredictionSource( permissions::PermissionPredictionSource::SERVER_SIDE); } @@ -162,36 +149,37 @@ &PredictionBasedPermissionUiSelector::LookupResponseReceived, base::Unretained(this), /*model_inquire_start_time=*/base::TimeTicks::Now(), - /*is_on_device=*/false, request_type)); + std::move(request_metadata))); } void PredictionBasedPermissionUiSelector:: InquireOnDeviceAiv1AndServerModelIfAvailable( content::RenderFrameHost* rfh, PredictionRequestFeatures features, - permissions::RequestType request_type) { + PredictionRequestMetadata request_metadata) { content_extraction::GetInnerText( *rfh, /*node_id=*/std::nullopt, base::BindOnce( &PredictionBasedPermissionUiSelector::OnGetInnerTextForOnDeviceModel, - weak_ptr_factory_.GetWeakPtr(), std::move(features), request_type)); + weak_ptr_factory_.GetWeakPtr(), std::move(features), + std::move(request_metadata))); } #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) void PredictionBasedPermissionUiSelector::InquireCpssV1OnDeviceModelIfAvailable( const PredictionRequestFeatures& features, - permissions::RequestType request_type) { + PredictionRequestMetadata request_metadata) { PredictionModelHandlerProvider* prediction_model_handler_provider = PredictionModelHandlerProviderFactory::GetForBrowserContext(profile_); permissions::PredictionModelHandler* prediction_model_handler = nullptr; if (prediction_model_handler_provider) { prediction_model_handler = prediction_model_handler_provider->GetPredictionModelHandler( - request_type); + request_metadata.request_type); } if (prediction_model_handler && prediction_model_handler->ModelAvailable()) { VLOG(1) << "[CPSS] Using locally available CPSSv1 model"; - permissions::PermissionUmaUtil::RecordPermissionPredictionSource( + PermissionUmaUtil::RecordPermissionPredictionSource( permissions::PermissionPredictionSource::ON_DEVICE_TFLITE); auto proto_request = GetPredictionRequestProto(features); cpss_v1_model_holdback_probability_ = @@ -201,7 +189,7 @@ &PredictionBasedPermissionUiSelector::LookupResponseReceived, weak_ptr_factory_.GetWeakPtr(), /*model_inquire_start_time=*/base::TimeTicks::Now(), - /*is_on_device=*/true, request_type, + std::move(request_metadata), /*lookup_succesful=*/true, /*response_from_cache=*/false), std::move(proto_request)); return; @@ -214,7 +202,7 @@ InquireOnDeviceAiv3AndServerModelIfAvailable( content::RenderWidgetHostView* host_view, PredictionRequestFeatures features, - permissions::RequestType request_type) { + PredictionRequestMetadata request_metadata) { if (!host_view) { VLOG(1) << "[CPSS] On device AIv3 model unavailable"; std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning()); @@ -223,7 +211,8 @@ if (snapshot_for_testing_.has_value()) { PredictionBasedPermissionUiSelector::OnSnapshotTakenForOnDeviceModel( - std::move(features), request_type, snapshot_for_testing_.value()); + std::move(features), std::move(request_metadata), + snapshot_for_testing_.value()); return; } @@ -232,12 +221,13 @@ gfx::Rect(), gfx::Size(), base::BindOnce( &PredictionBasedPermissionUiSelector::OnSnapshotTakenForOnDeviceModel, - weak_ptr_factory_.GetWeakPtr(), std::move(features), request_type)); + weak_ptr_factory_.GetWeakPtr(), std::move(features), + std::move(request_metadata))); } void PredictionBasedPermissionUiSelector::OnSnapshotTakenForOnDeviceModel( PredictionRequestFeatures features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, const SkBitmap& snapshot) { VLOG(1) << "[PermissionsAIv3] On device AI prediction requested"; LogSnapshotTakenSuccessfullyForAiv3(/*success=*/!snapshot.drawsNothing()); @@ -249,27 +239,33 @@ profile_)) { if (PermissionsAiv3Handler* aiv3_handler = prediction_model_handler_provider->GetPermissionsAiv3Handler( - request_type)) { + request_metadata.request_type)) { VLOG(1) << "[PermissionsAIv3] Inquire model"; aiv3_handler->ExecuteModel( - base::BindRepeating(&PredictionBasedPermissionUiSelector:: - OnDeviceAiv3ModelExecutionCallback, - weak_ptr_factory_.GetWeakPtr(), - std::move(features), request_type), + base::BindRepeating( + &PredictionBasedPermissionUiSelector:: + OnDeviceAiv3ModelExecutionCallback, + weak_ptr_factory_.GetWeakPtr(), + /*model_inquire_start_time=*/base::TimeTicks::Now(), + std::move(features), std::move(request_metadata)), std::make_unique<SkBitmap>(snapshot)); return; } } VLOG(1) << "[PermissionsAIv3] On device AI model session unavailable"; } - InquireServerModel(features, request_type, /*record_source=*/true); + InquireServerModel(features, std::move(request_metadata), + /*record_source=*/true); } void PredictionBasedPermissionUiSelector::OnDeviceAiv3ModelExecutionCallback( + base::TimeTicks model_inquire_start_time, PredictionRequestFeatures features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, const std::optional<PermissionRequestRelevance>& relevance) { + PermissionUmaUtil::RecordPredictionModelInquireTime( + model_inquire_start_time, PredictionModelType::kOnDeviceAiV3Model); VLOG(1) << "[PermissionsAIv3]: AI model execution callback called " << (relevance.has_value() ? "with value" : "without value"); if (relevance.has_value()) { @@ -279,7 +275,7 @@ features.permission_relevance = relevance.value(); // TODO(crbug.com/382447738) refactor this function to also encode the model // version - permissions::PermissionUmaUtil::RecordPermissionRequestRelevance( + PermissionUmaUtil::RecordPermissionRequestRelevance( features.permission_relevance); } else { last_permission_request_relevance_ = @@ -288,7 +284,7 @@ // We get Unspecified only if the model was not executed; so we call the // server side model as if we never inquired the on-device model before. - InquireServerModel(features, request_type, + InquireServerModel(features, std::move(request_metadata), /*record_source=*/ !(relevance == PermissionRequestRelevance::kUnspecified)); } @@ -341,23 +337,26 @@ } DCHECK(!request_); + PredictionRequestMetadata request_metadata = { + .prediction_source = prediction_source, + .request_type = request->request_type()}; switch (prediction_source) { case PredictionSource::kServerSideCpssV3Model: - return InquireServerModel(features, request->request_type(), + return InquireServerModel(features, std::move(request_metadata), /*record_source=*/true); case PredictionSource::kOnDeviceAiv1AndServerSideModel: return InquireOnDeviceAiv1AndServerModelIfAvailable( web_contents->GetPrimaryMainFrame(), std::move(features), - request->request_type()); + std::move(request_metadata)); #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) case PredictionSource::kOnDeviceAiv3AndServerSideModel: return InquireOnDeviceAiv3AndServerModelIfAvailable( web_contents->GetRenderWidgetHostView(), std::move(features), - request->request_type()); + std::move(request_metadata)); case PredictionSource::kOnDeviceCpssV1Model: return InquireCpssV1OnDeviceModelIfAvailable(features, - request->request_type()); + std::move(request_metadata)); #else case PredictionSource::kOnDeviceAiv3AndServerSideModel: [[fallthrough]]; @@ -376,7 +375,7 @@ void PredictionBasedPermissionUiSelector::OnGetInnerTextForOnDeviceModel( PredictionRequestFeatures features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, std::unique_ptr<content_extraction::InnerTextResult> result) { VLOG(1) << "[PermissionsAIv1] On device AI prediction requested"; if (result && result->inner_text.size() > kPageContentMinLength) { @@ -392,11 +391,12 @@ prediction_model_handler_provider->GetPermissionsAiv1Handler()) { VLOG(1) << "[PermissionsAIv1] Inquire model"; aiv1_handler->InquireAiOnDeviceModel( - std::move(inner_text), request_type, + std::move(inner_text), request_metadata.request_type, base::BindRepeating(&PredictionBasedPermissionUiSelector:: OnDeviceAiv1ModelExecutionCallback, weak_ptr_factory_.GetWeakPtr(), - std::move(features), request_type)); + std::move(features), + std::move(request_metadata))); return; } } @@ -404,7 +404,8 @@ } else { VLOG(1) << "[PermissionsAIv1] The page's content is too short or empty"; } - InquireServerModel(features, request_type, /*record_source=*/true); + InquireServerModel(features, std::move(request_metadata), + /*record_source=*/true); } void PredictionBasedPermissionUiSelector::Cancel() { @@ -418,7 +419,7 @@ request_type == permissions::RequestType::kGeolocation; } -std::optional<permissions::PermissionUmaUtil::PredictionGrantLikelihood> +std::optional<PermissionUmaUtil::PredictionGrantLikelihood> PredictionBasedPermissionUiSelector::PredictedGrantLikelihoodForUKM() { return last_request_grant_likelihood_; } @@ -482,7 +483,7 @@ void PredictionBasedPermissionUiSelector::OnDeviceAiv1ModelExecutionCallback( PredictionRequestFeatures features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, std::optional<PermissionsAiResponse> response) { VLOG(1) << "[PermissionsAIv1]: AI model execution callback called " << (response.has_value() ? "with value" : "without value"); @@ -494,27 +495,35 @@ VLOG(1) << "[PermissionsAIv1]: Permission request is " << (response.value().is_permission_relevant() ? "relevant" : "not relevant"); - permissions::PermissionUmaUtil::RecordPermissionPredictionSource( + PermissionUmaUtil::RecordPermissionPredictionSource( permissions::PermissionPredictionSource::ONDEVICE_AI_AND_SERVER_SIDE); } else { last_permission_request_relevance_ = PermissionRequestRelevance::kUnspecified; } features.permission_relevance = last_permission_request_relevance_.value(); - permissions::PermissionUmaUtil::RecordPermissionRequestRelevance( + PermissionUmaUtil::RecordPermissionRequestRelevance( features.permission_relevance); - InquireServerModel(features, request_type, + InquireServerModel(features, std::move(request_metadata), /*record_source=*/!response.has_value()); } void PredictionBasedPermissionUiSelector::LookupResponseReceived( base::TimeTicks model_inquire_start_time, - bool is_on_device, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, bool lookup_successful, bool response_from_cache, const std::optional<permissions::GeneratePredictionsResponse>& response) { - LogModelInquireTime(model_inquire_start_time, is_on_device); + // This function is used as callback for request to the CPSSv1 on-device model + // and the CPSSv3 server-side model. As we have multiple prediction sources + // that use the server side model in the end, we check for the CPSSv1 here and + // set is_on_device depending on this. + bool is_on_device_cpss_v1 = request_metadata.prediction_source == + PredictionSource::kOnDeviceCpssV1Model; + PermissionUmaUtil::RecordPredictionModelInquireTime( + model_inquire_start_time, + is_on_device_cpss_v1 ? PredictionModelType::kOnDeviceCpssV1Model + : PredictionModelType::kServerSideCpssV3Model); request_.reset(); if (!callback_) { @@ -531,8 +540,7 @@ last_request_grant_likelihood_ = response->prediction(0).grant_likelihood().discretized_likelihood(); - // TODO(crbug.com/382447738) No holdback for PermissionAIv3 - if (ShouldHoldBack(is_on_device, request_type)) { + if (ShouldHoldBack(request_metadata)) { VLOG(1) << "[CPSS] Prediction service decision held back"; was_decision_held_back_ = true; std::move(callback_).Run( @@ -545,10 +553,11 @@ << last_request_grant_likelihood_.value(); if (ShouldPredictionTriggerQuietUi(last_request_grant_likelihood_.value())) { - std::move(callback_).Run(Decision( - is_on_device ? QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant + std::move(callback_).Run( + Decision(is_on_device_cpss_v1 + ? QuietUiReason::kOnDevicePredictedVeryUnlikelyGrant : QuietUiReason::kServicePredictedVeryUnlikelyGrant, - Decision::ShowNoWarning())); + Decision::ShowNoWarning())); return; } @@ -557,25 +566,44 @@ } bool PredictionBasedPermissionUiSelector::ShouldHoldBack( - bool is_on_device, - permissions::RequestType request_type) { + const PredictionRequestMetadata& request_metadata) const { + permissions::RequestType request_type = request_metadata.request_type; + PredictionSource prediction_source = request_metadata.prediction_source; DCHECK(request_type == permissions::RequestType::kNotifications || request_type == permissions::RequestType::kGeolocation); // Holdback probability for this request. const double holdback_chance = base::RandDouble(); bool should_holdback = false; - if (is_on_device) { - DCHECK(cpss_v1_model_holdback_probability_.has_value()); - should_holdback = holdback_chance < *cpss_v1_model_holdback_probability_; - } else { - should_holdback = - holdback_chance < - permissions::feature_params::kPermissionPredictionsV2HoldbackChance - .Get(); + PredictionModelType prediction_model = + PredictionModelType::kServerSideCpssV3Model; + + switch (prediction_source) { + case PredictionSource::kOnDeviceCpssV1Model: + DCHECK(cpss_v1_model_holdback_probability_.has_value()); + should_holdback = holdback_chance < *cpss_v1_model_holdback_probability_; + prediction_model = PredictionModelType::kOnDeviceCpssV1Model; + break; + // For on-device model + server-side model requests we will use the + // holdback logic for the server-side model execution. + case PredictionSource::kOnDeviceAiv3AndServerSideModel: + prediction_model = PredictionModelType::kOnDeviceAiV3Model; + [[fallthrough]]; + case PredictionSource::kOnDeviceAiv1AndServerSideModel: + // We don't analyse holdback UMA results separately for aiv1, so we + // don't set the model type for this one. + [[fallthrough]]; + case PredictionSource::kServerSideCpssV3Model: + should_holdback = + holdback_chance < + permissions::feature_params::kPermissionPredictionsV2HoldbackChance + .Get(); + break; + default: + NOTREACHED(); } - permissions::PermissionUmaUtil::RecordPermissionPredictionServiceHoldback( - request_type, is_on_device, should_holdback); + PermissionUmaUtil::RecordPermissionPredictionServiceHoldback( + request_type, prediction_model, should_holdback); return should_holdback; }
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.h b/chrome/browser/permissions/prediction_based_permission_ui_selector.h index 38c2e87..2406a8c 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector.h +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.h
@@ -48,6 +48,15 @@ kOnDeviceAiv1AndServerSideModel, kOnDeviceAiv3AndServerSideModel, }; + + // Contains information that are not important as features for the + // prediction service, but contain details about the workflow and the origin + // of feature data. + struct PredictionRequestMetadata { + PredictionSource prediction_source; + permissions::RequestType request_type; + }; + using PredictionGrantLikelihood = permissions::PermissionUmaUtil::PredictionGrantLikelihood; // Constructs an instance in the context of the given |profile|. @@ -98,15 +107,14 @@ // curryed to be used for the server side model call. void OnDeviceAiv1ModelExecutionCallback( permissions::PredictionRequestFeatures features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, std::optional<optimization_guide::proto::PermissionsAiResponse> response); permissions::PredictionRequestFeatures BuildPredictionRequestFeatures( permissions::PermissionRequest* request); void LookupResponseReceived( base::TimeTicks model_inquire_start_time, - bool is_on_device, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, bool lookup_successful, bool response_from_cache, const std::optional<permissions::GeneratePredictionsResponse>& response); @@ -123,14 +131,14 @@ // by the server side model later. void OnGetInnerTextForOnDeviceModel( permissions::PredictionRequestFeatures features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, std::unique_ptr<content_extraction::InnerTextResult> result); - bool ShouldHoldBack(bool is_on_device, permissions::RequestType request_type); + bool ShouldHoldBack(const PredictionRequestMetadata& request_metadata) const; void InquireServerModel( const permissions::PredictionRequestFeatures& features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, bool record_source); // As the first part of the AIv3 model execution chain, this function triggers @@ -141,7 +149,7 @@ void InquireOnDeviceAiv1AndServerModelIfAvailable( content::RenderFrameHost* rfh, permissions::PredictionRequestFeatures features, - permissions::RequestType request_type); + PredictionRequestMetadata request_metadata); #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) // As the first part of the AIv3 model execution chain, this function triggers @@ -152,7 +160,7 @@ void InquireOnDeviceAiv3AndServerModelIfAvailable( content::RenderWidgetHostView* host_view, permissions::PredictionRequestFeatures features, - permissions::RequestType request_type); + PredictionRequestMetadata request_metadata); // Part of the AIv3 model execution chain; provided as a curryed callback to // be submitted to the logic that fetches a snapshot that serves as the input @@ -160,20 +168,21 @@ // used by the server side model later. void OnSnapshotTakenForOnDeviceModel( permissions::PredictionRequestFeatures features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, const SkBitmap& screenshot); // Callback for the Aiv3ModelHandler, with the first to parameters being // curryed to be used for the server side model call. void OnDeviceAiv3ModelExecutionCallback( + base::TimeTicks model_inquire_start_time, permissions::PredictionRequestFeatures features, - permissions::RequestType request_type, + PredictionRequestMetadata request_metadata, const std::optional<permissions::PermissionRequestRelevance>& relevance); // Use on device CPSSv1 tflite model. void InquireCpssV1OnDeviceModelIfAvailable( const permissions::PredictionRequestFeatures& features, - permissions::RequestType request_type); + PredictionRequestMetadata request_metadata); #endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB) raw_ptr<Profile> profile_;
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc index 66a6bd7..48e6436 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc
@@ -51,6 +51,27 @@ "Permissions.PredictionService.Response.Notifications"; constexpr char kPredServiceResponseGeolocationHistogram[] = "Permissions.PredictionService.Response.Geolocation"; +constexpr char kAIv3ResponseNotificationsHistogram[] = + "Permissions.AIv3.Response.Notifications"; +constexpr char kAIv3ResponseGeolocationHistogram[] = + "Permissions.AIv3.Response.Geolocation"; + +std::string PredictionSourceToString(PredictionSource prediction_source) { + switch (prediction_source) { + case PredictionSource::kServerSideCpssV3Model: + return "ServerSideCpssV3Model"; + case PredictionSource::kOnDeviceAiv1AndServerSideModel: + return "OnDeviceAiv1AndServerSideModel"; + case PredictionSource::kOnDeviceAiv3AndServerSideModel: + return "OnDeviceAiv3AndServerSideModel"; + case PredictionSource::kOnDeviceCpssV1Model: + return "OnDeviceCpssV1Model"; + case PredictionSource::kNoCpssModel: + [[fallthrough]]; + default: + NOTREACHED(); + } +} } // namespace @@ -354,8 +375,9 @@ struct HoldbackChanceTestCase { int holdback_chance; - bool is_on_device; + PredictionSource prediction_source; permissions::RequestType request_type; + std::vector<std::string_view> updated_histograms; }; class PredictionBasedPermissionUiExpectedHoldbackChanceTest @@ -377,7 +399,8 @@ // Checks for the selected histogram that is has a bucket count of 1 and // also ensures that no other histogram was changed. - void CheckHistogramsAreEmptyExcept(const std::string histogram) const { + void CheckHistogramsAreEmptyExcept( + const std::vector<std::string_view>& updated_histograms) { // Static list of all histogram names to check static const std::vector<std::string> kAllHistogramNames = { kOnDevPredServiceResponseNotificationsHistogram, @@ -386,19 +409,21 @@ kPredServiceResponseGeolocationHistogram, }; - // Iterate through all histogram names in the static list for (const auto& histogram_name : kAllHistogramNames) { - if (histogram_name != histogram) { - // If the histogram is not in the allowed set, ensure its count is 0 + // If the histogram is not in the allowed set, ensure its count is 0 + if (!base::Contains(updated_histograms, histogram_name)) { histogram_tester_.ExpectTotalCount(histogram_name, 0); } } - histogram_tester_.ExpectBucketCount( - histogram, - /*sample=*/GetParam().holdback_chance == 1, - /*expected_count=*/1); - histogram_tester_.ExpectTotalCount(histogram, /*count=*/1); + for (const auto& histogram_name : updated_histograms) { + histogram_tester_.ExpectBucketCount( + histogram_name, + /*sample=*/GetParam().holdback_chance == 1, + /*expected_count=*/1); + + histogram_tester_.ExpectTotalCount(histogram_name, /*count=*/1); + } } private: @@ -409,46 +434,96 @@ HoldbackChanceTest, PredictionBasedPermissionUiExpectedHoldbackChanceTest, testing::ValuesIn<HoldbackChanceTestCase>({ + // ----------------------- on-device CPSSV1 { /*holdback_chance=*/0, - /*is_on_device=*/true, + /*prediction_source=*/PredictionSource::kOnDeviceCpssV1Model, /*request_type=*/permissions::RequestType::kNotifications, - }, - { - /*holdback_chance=*/0, - /*is_on_device=*/false, - /*request_type=*/permissions::RequestType::kNotifications, - }, - { - /*holdback_chance=*/0, - /*is_on_device=*/true, - /*request_type=*/permissions::RequestType::kGeolocation, - }, - { - /*holdback_chance=*/0, - /*is_on_device=*/false, - /*request_type=*/permissions::RequestType::kGeolocation, + /*updated_histograms=*/ + {kOnDevPredServiceResponseNotificationsHistogram}, }, { /*holdback_chance=*/1, - /*is_on_device=*/true, + /*prediction_source=*/PredictionSource::kOnDeviceCpssV1Model, /*request_type=*/permissions::RequestType::kNotifications, + /*updated_histograms=*/ + {kOnDevPredServiceResponseNotificationsHistogram}, + }, + { + /*holdback_chance=*/0, + /*prediction_source=*/PredictionSource::kOnDeviceCpssV1Model, + /*request_type=*/permissions::RequestType::kGeolocation, + /*updated_histograms=*/ + {kOnDevPredServiceResponseGeolocationHistogram}, }, { /*holdback_chance=*/1, - /*is_on_device=*/false, + /*prediction_source=*/PredictionSource::kOnDeviceCpssV1Model, + /*request_type=*/permissions::RequestType::kGeolocation, + /*updated_histograms=*/ + {kOnDevPredServiceResponseGeolocationHistogram}, + }, + // ----------------------- server-side CPSSv3 + { + /*holdback_chance=*/0, + /*prediction_source=*/PredictionSource::kServerSideCpssV3Model, /*request_type=*/permissions::RequestType::kNotifications, + /*updated_histograms=*/ + {kPredServiceResponseNotificationsHistogram}, }, { /*holdback_chance=*/1, - /*is_on_device=*/true, + /*prediction_source=*/PredictionSource::kServerSideCpssV3Model, + /*request_type=*/permissions::RequestType::kNotifications, + /*updated_histograms=*/ + {kPredServiceResponseNotificationsHistogram}, + }, + { + /*holdback_chance=*/0, + /*prediction_source=*/PredictionSource::kServerSideCpssV3Model, /*request_type=*/permissions::RequestType::kGeolocation, + /*updated_histograms=*/ + {kPredServiceResponseGeolocationHistogram}, }, { /*holdback_chance=*/1, - /*is_on_device=*/false, + /*prediction_source=*/PredictionSource::kServerSideCpssV3Model, /*request_type=*/permissions::RequestType::kGeolocation, + /*updated_histograms=*/ + {kPredServiceResponseGeolocationHistogram}, }, + // ----------------------- on-device AIv1 + server-side CPSSv3 + // We don't separately analyse holdback UMA statistics for AIv1. + { + /*holdback_chance=*/0, + /*prediction_source=*/ + PredictionSource::kOnDeviceAiv1AndServerSideModel, + /*request_type=*/permissions::RequestType::kGeolocation, + /*updated_histograms=*/{kPredServiceResponseGeolocationHistogram}, + }, + { + /*holdback_chance=*/1, + /*prediction_source=*/ + PredictionSource::kOnDeviceAiv1AndServerSideModel, + /*request_type=*/permissions::RequestType::kNotifications, + /*updated_histograms=*/{kPredServiceResponseNotificationsHistogram}, + }, + // ----------------------- on-device AIv3 + server-side CPSSv3 + { + /*holdback_chance=*/0, + /*prediction_source=*/ + PredictionSource::kOnDeviceAiv3AndServerSideModel, + /*request_type=*/permissions::RequestType::kNotifications, + /*updated_histograms=*/{kAIv3ResponseNotificationsHistogram}, + }, + { + /*holdback_chance=*/1, + /*prediction_source=*/ + PredictionSource::kOnDeviceAiv3AndServerSideModel, + /*request_type=*/permissions::RequestType::kGeolocation, + /*updated_histograms=*/{kAIv3ResponseGeolocationHistogram}, + }, + }), /*name_generator=*/ [](const testing::TestParamInfo< @@ -457,7 +532,7 @@ return base::StrCat( {(info.param.holdback_chance == 1) ? "FullHoldbackChance" : "NoHoldbackChance", - "For", info.param.is_on_device ? "OnDevice" : "ServerSide", + "For", PredictionSourceToString(info.param.prediction_source), "Execution", "And", (info.param.request_type == permissions::RequestType::kNotifications) ? "Notifications" @@ -473,24 +548,11 @@ // 1 means 100% holdback chance and as we only test with 0 or 1 here this is // basically the expected result. - bool is_held_back = GetParam().holdback_chance == 1; - EXPECT_EQ(is_held_back, - prediction_selector.ShouldHoldBack(GetParam().is_on_device, - GetParam().request_type)); + bool expected_holdback = GetParam().holdback_chance == 1; + EXPECT_EQ(expected_holdback, + prediction_selector.ShouldHoldBack( + {.prediction_source = GetParam().prediction_source, + .request_type = GetParam().request_type})); - if (GetParam().is_on_device) { - if (GetParam().request_type == permissions::RequestType::kNotifications) { - CheckHistogramsAreEmptyExcept( - kOnDevPredServiceResponseNotificationsHistogram); - } else { - CheckHistogramsAreEmptyExcept( - kOnDevPredServiceResponseGeolocationHistogram); - } - } else { - if (GetParam().request_type == permissions::RequestType::kNotifications) { - CheckHistogramsAreEmptyExcept(kPredServiceResponseNotificationsHistogram); - } else { - CheckHistogramsAreEmptyExcept(kPredServiceResponseGeolocationHistogram); - } - } + CheckHistogramsAreEmptyExcept(GetParam().updated_histograms); }
diff --git a/chrome/browser/permissions/prediction_service_browsertest.cc b/chrome/browser/permissions/prediction_service_browsertest.cc index e215fca7..e3aa94f 100644 --- a/chrome/browser/permissions/prediction_service_browsertest.cc +++ b/chrome/browser/permissions/prediction_service_browsertest.cc
@@ -93,7 +93,12 @@ "OptimizationGuide.ModelExecutor.ExecutionStatus.NotificationPermissionsV3"; constexpr std::string_view kSnapshotTakenHistogram = "Permissions.AIv3.SnapshotTaken"; - +constexpr char kAIv3InquiryDurationHistogram[] = + "Permissions.AIv3.InquiryDuration"; +constexpr char kCpssV1InquiryDurationHistogram[] = + "Permissions.OnDevicePredictionService.InquiryDuration"; +constexpr char kCpssV3InquiryDurationHistogram[] = + "Permissions.PredictionService.InquiryDuration"; // A CPSSv1 model that returns a constant value of 0.5; // its meaning is defined by the max_likely threshold we use in the // signature_model_executor to differentiate between @@ -271,6 +276,8 @@ } } + base::HistogramTester& histogram_tester() { return histogram_tester_; } + protected: OptimizationGuideKeyedService* opt_guide() { return OptimizationGuideKeyedServiceFactory::GetForProfile( @@ -282,6 +289,7 @@ private: std::unique_ptr<MockPermissionPromptFactory> mock_permission_prompt_factory_; base::test::ScopedFeatureList scoped_feature_list_; + base::HistogramTester histogram_tester_; }; IN_PROC_BROWSER_TEST_F(PredictionServiceBrowserTestBase, @@ -423,6 +431,9 @@ GetParam().should_expect_quiet_ui, /*expected_relevance=*/std::nullopt, GetParam().expected_prediction_likelihood); + + histogram_tester().ExpectTotalCount(kCpssV1InquiryDurationHistogram, + /*expected_count=*/1); } struct Aiv3ModelTestCase { @@ -517,8 +528,6 @@ PredictionServiceMock& prediction_service() { return prediction_service_; } - base::HistogramTester& histogram_tester() { return histogram_tester_; } - private: PredictionModelHandlerProvider* model_handler_provider() { return PredictionModelHandlerProviderFactory::GetForBrowserContext( @@ -526,7 +535,6 @@ } PredictionServiceMock prediction_service_; - base::HistogramTester histogram_tester_; }; INSTANTIATE_TEST_SUITE_P( @@ -621,12 +629,18 @@ GetParam().prediction_service_likelihood); histogram_tester().ExpectBucketCount( - kModelExecutionSuccessHistogram, - /*sample=*/true, /*expected_count=*/ + kModelExecutionSuccessHistogram, /*sample=*/true, /*expected_count=*/ GetParam().success_count_model_execution); histogram_tester().ExpectBucketCount(kSnapshotTakenHistogram, - /*sample=*/true, /*expected_count=*/1); + /*sample=*/true, + /*expected_count=*/1); + // We should receive timing information for both, the on-device model and + // the server-side model. + histogram_tester().ExpectTotalCount(kCpssV3InquiryDurationHistogram, + /*expected_count=*/1); + histogram_tester().ExpectTotalCount(kAIv3InquiryDurationHistogram, + /*expected_count=*/1); } } // namespace permissions
diff --git a/chrome/browser/preloading/search_preload/search_preload_pipeline.cc b/chrome/browser/preloading/search_preload/search_preload_pipeline.cc index e72a9c7..a1b12ede 100644 --- a/chrome/browser/preloading/search_preload/search_preload_pipeline.cc +++ b/chrome/browser/preloading/search_preload/search_preload_pipeline.cc
@@ -31,9 +31,6 @@ auto* preloading_data = content::PreloadingData::GetOrCreateForWebContents(&web_contents); - // TODO(crbug.com/409506954): Avoid calling it multiple times. (Inherited from - // SearchPrefetch.) - SetIsNavigationInDomainCallback(preloading_data); // Safety: The ownership of this callback will be passed to // `PreloadingDataImpl`, which has lifetime bounded by `web_contents`. So, @@ -72,9 +69,6 @@ auto* preloading_data = content::PreloadingData::GetOrCreateForWebContents(&web_contents); - // TODO(crbug.com/409506954): Avoid calling it multiple times. (Inherited from - // SearchPrefetch.) - SetIsNavigationInDomainCallback(preloading_data); // Safety: The ownership of this callback will be passed to // `PreloadingDataImpl`, which has lifetime bounded by `web_contents`. So, @@ -119,9 +113,6 @@ auto* preloading_data = content::PreloadingData::GetOrCreateForWebContents(&web_contents); - // TODO(crbug.com/409506954): Avoid calling it multiple times. (Inherited from - // SearchPrefetch.) - SetIsNavigationInDomainCallback(preloading_data); // Safety: The ownership of this callback will be passed to // `PreloadingDataImpl`, which has lifetime bounded by `web_contents`. So,
diff --git a/chrome/browser/preloading/search_preload/search_preload_pipeline_manager.cc b/chrome/browser/preloading/search_preload/search_preload_pipeline_manager.cc index 8844593c..2ce96fc 100644 --- a/chrome/browser/preloading/search_preload/search_preload_pipeline_manager.cc +++ b/chrome/browser/preloading/search_preload/search_preload_pipeline_manager.cc
@@ -54,7 +54,11 @@ SearchPreloadPipelineManager::SearchPreloadPipelineManager( content::WebContents* web_contents) : content::WebContentsUserData<SearchPreloadPipelineManager>( - *web_contents) {} + *web_contents) { + auto* preloading_data = + content::PreloadingData::GetOrCreateForWebContents(web_contents); + SetIsNavigationInDomainCallback(preloading_data); +} SearchPreloadPipelineManager::~SearchPreloadPipelineManager() = default;
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_am.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_am.xtb index 002e90d..b4991a7d 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_am.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_am.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">ማጫወቻን ይዝጉ።</translation> <translation id="8481839122437406573">የረጋ</translation> <translation id="8756370108715456837">ከእውነታ አንጻር ትክክል ያልሆነ</translation> +<translation id="881960277396325853">ሰው ሠራሽ አስተውሎት ኦዲዮ በማመንጨት ላይ...</translation> <translation id="8953618380150219653">«ይህን ገፅ አዳምጥ» አጫዋች በሙሉ ቀመት ተከፍቷል።</translation> <translation id="978117257931832348">ዝቅተኛ የወንድ ድምፅ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_as.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_as.xtb index 02d1381..4e07cd8 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_as.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_as.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">প্লে’য়াৰ বন্ধ কৰক।</translation> <translation id="8481839122437406573">শান্ত</translation> <translation id="8756370108715456837">তথ্যগতভাৱে শুদ্ধ নহয়</translation> +<translation id="881960277396325853">AI অডিঅ’ সৃষ্টি কৰি থকা হৈছে...</translation> <translation id="8953618380150219653">“এই পৃষ্ঠাখন শুনক” প্লে’য়াৰ পূৰ্ণ উচ্চতাত খোলা হৈছে</translation> <translation id="978117257931832348">নিম্নস্বৰীয়</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_az.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_az.xtb index 97f25b2..48e0bad 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_az.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_az.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Pleyeri bağlayın.</translation> <translation id="8481839122437406573">Sakit</translation> <translation id="8756370108715456837">Faktiki olaraq doğru deyil</translation> +<translation id="881960277396325853">Sİ audiosu yaradılır...</translation> <translation id="8953618380150219653">"Bu səhifəni dinləyin" pleyeri tam uzunluqda açıldı.</translation> <translation id="978117257931832348">Aşağıtonlu</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_be.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_be.xtb index 6d2446e..b531c77 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_be.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_be.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Закрыць прайгравальнік.</translation> <translation id="8481839122437406573">Спакойны голас</translation> <translation id="8756370108715456837">Змяшчаліся няправільныя звесткі</translation> +<translation id="881960277396325853">Генерыруецца аўдыя з дапамогай штучнага інтэлекту…</translation> <translation id="8953618380150219653">Прайгравальнік "Агучыць гэту старонку" адкрыты на ўсю вышыню.</translation> <translation id="978117257931832348">нізкі тон</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ca.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ca.xtb index c0e5b55..f0d02ec 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ca.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ca.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Tanca el reproductor.</translation> <translation id="8481839122437406573">Serena</translation> <translation id="8756370108715456837">Informació objectivament incorrecta</translation> +<translation id="881960277396325853">S'està generant àudio amb IA...</translation> <translation id="8953618380150219653">El reproductor "Escolta aquesta pàgina" s'ha obert a alçada completa.</translation> <translation id="978117257931832348">Greu</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_cy.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_cy.xtb index e02042e4..412e95b 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_cy.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_cy.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Cau'r chwaraewr.</translation> <translation id="8481839122437406573">Llonydd</translation> <translation id="8756370108715456837">Ddim yn ffeithiol gywir</translation> +<translation id="881960277396325853">Wrthi'n cynhyrchu sain AI...</translation> <translation id="8953618380150219653">Chwaraewr 'Gwrando ar y dudalen hon' wedi'i agor ar uchder llawn.</translation> <translation id="978117257931832348">Traw isel</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_da.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_da.xtb index b55e738..d1536b9 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_da.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_da.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Luk afspilleren.</translation> <translation id="8481839122437406573">Rolig</translation> <translation id="8756370108715456837">Ikke faktuelt korrekt</translation> +<translation id="881960277396325853">AI-lyd genereres…</translation> <translation id="8953618380150219653">Afspilleren "Lyt til denne side" er åbnet i fuld højde.</translation> <translation id="978117257931832348">Dyb stemme</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_de.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_de.xtb index 529fc19..15257b7 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_de.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_de.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Player schließen</translation> <translation id="8481839122437406573">Ruhig</translation> <translation id="8756370108715456837">Faktisch nicht korrekt</translation> +<translation id="881960277396325853">Audio wird mithilfe von KI erstellt…</translation> <translation id="8953618380150219653">Der Player „Diese Seite anhören“ ist vollständig geöffnet.</translation> <translation id="978117257931832348">Niedrige Tonhöhe</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es-419.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es-419.xtb index 3c4784e8..135ff81 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es-419.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es-419.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Cerrar el reproductor</translation> <translation id="8481839122437406573">Calmado</translation> <translation id="8756370108715456837">La información no es correcta</translation> +<translation id="881960277396325853">Generando audio con IA…</translation> <translation id="8953618380150219653">El reproductor "Escuchar esta página" está totalmente abierto.</translation> <translation id="978117257931832348">Tono grave</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es.xtb index eb7edc8..92549140 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_es.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Cerrar el reproductor</translation> <translation id="8481839122437406573">Tranquilo</translation> <translation id="8756370108715456837">Incluía información incorrecta</translation> +<translation id="881960277396325853">Generando audio con IA...</translation> <translation id="8953618380150219653">El reproductor "Escuchar esta página" está abierto a altura completa.</translation> <translation id="978117257931832348">Grave</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_et.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_et.xtb index 2320861..dc146084 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_et.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_et.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Pleieri sulgemine.</translation> <translation id="8481839122437406573">Rahulik</translation> <translation id="8756370108715456837">Faktiliselt vale</translation> +<translation id="881960277396325853">Heli AI-põhine genereerimine…</translation> <translation id="8953618380150219653">Pleier „Kuula seda lehte“ on avatud täiskõrgusel.</translation> <translation id="978117257931832348">Madal</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_fi.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_fi.xtb index e2e183ad..3b2b40d92 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_fi.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_fi.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Sulje soitin.</translation> <translation id="8481839122437406573">Tyyni</translation> <translation id="8756370108715456837">Asiavirhe</translation> +<translation id="881960277396325853">Luodaan tekoälyaudiota…</translation> <translation id="8953618380150219653">Kuuntele tämä sivu ‑soitin avattu kokonaan.</translation> <translation id="978117257931832348">Matala äänenkorkeus</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_gu.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_gu.xtb index 28cc20a..cc86d76 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_gu.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_gu.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">પ્લેયર બંધ કરો.</translation> <translation id="8481839122437406573">શાંત</translation> <translation id="8756370108715456837">વાસ્તવિક રીતે ખોટું છે</translation> +<translation id="881960277396325853">AI ઑડિયો જનરેટ કરી રહ્યાં છીએ...</translation> <translation id="8953618380150219653">"આ પેજને સાંભળો" પ્લેયર સંપૂર્ણ સ્ક્રીન પર ખૂલ્યું છે.</translation> <translation id="978117257931832348">ઓછી-તીવ્રતા</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_hi.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_hi.xtb index 817274c7..7075a78 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_hi.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_hi.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">प्लेयर बंद करें.</translation> <translation id="8481839122437406573">शांत टोन वाली आवाज़</translation> <translation id="8756370108715456837">तथ्यों के हिसाब से सही नहीं है</translation> +<translation id="881960277396325853">एआई की मदद से ऑडियो जनरेट किया जा रहा है...</translation> <translation id="8953618380150219653">“इस पेज का कॉन्टेंट सुनें” प्लेयर पूरी स्क्रीन पर खुला है.</translation> <translation id="978117257931832348">कम पिच वाली आवाज़</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_id.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_id.xtb index 276342dc..486c9db9 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_id.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_id.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Tutup pemutar.</translation> <translation id="8481839122437406573">Tenang</translation> <translation id="8756370108715456837">Mengandung fakta yang tidak benar</translation> +<translation id="881960277396325853">Membuat audio AI...</translation> <translation id="8953618380150219653">Pemutar “Dengarkan halaman ini” dibuka sepenuhnya.</translation> <translation id="978117257931832348">Nada rendah</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ja.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ja.xtb index 1b74a8e..e6366ee4 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ja.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ja.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">プレーヤーを閉じる。</translation> <translation id="8481839122437406573">穏やか</translation> <translation id="8756370108715456837">事実と異なる</translation> +<translation id="881960277396325853">AI による音声を生成しています...</translation> <translation id="8953618380150219653">「このページを読み上げ」プレーヤーが画面全体に表示されています。</translation> <translation id="978117257931832348">低ピッチ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ka.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ka.xtb index 2e24533..606ebe2 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ka.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ka.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">დამკვრელის დახურვა.</translation> <translation id="8481839122437406573">მშვიდი</translation> <translation id="8756370108715456837">ფაქტობრივად არ არის სწორი</translation> +<translation id="881960277396325853">მიმდინარეობს ხელოვნური ინტელექტით აუდიოს გენერირება...</translation> <translation id="8953618380150219653">„ამ გვერდის მოსმენის“ დამკვრელი გახსნილია სრულ სიმაღლეზე.</translation> <translation id="978117257931832348">დაბალი ტონი</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kk.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kk.xtb index 0471a5e0..4c37378 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kk.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kk.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Ойнатқышты жабу.</translation> <translation id="8481839122437406573">Сабырлы</translation> <translation id="8756370108715456837">Мәліметтері қате</translation> +<translation id="881960277396325853">Жасанды интеллект аудиосы жасалып жатыр...</translation> <translation id="8953618380150219653">"Осы бетті тыңдау" ойнатқышы толығымен ашылды.</translation> <translation id="978117257931832348">Төмен</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_km.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_km.xtb index f95e4a7c..b7755b1f 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_km.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_km.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">បិទកម្មវិធីចាក់។</translation> <translation id="8481839122437406573">ស្ងប់</translation> <translation id="8756370108715456837">មិនត្រឹមត្រូវតាមការពិត</translation> +<translation id="881960277396325853">កំពុងបង្កើតសំឡេង AI...</translation> <translation id="8953618380150219653">កម្មវិធីចាក់ “ស្ដាប់ទំព័រនេះ” បានបើកពេញអេក្រង់។</translation> <translation id="978117257931832348">សំឡេងទាប</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kn.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kn.xtb index db3088e..3422cce 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kn.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_kn.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">ಪ್ಲೇಯರ್ ಅನ್ನು ಮುಚ್ಚಿ.</translation> <translation id="8481839122437406573">ಶಾಂತ</translation> <translation id="8756370108715456837">ವಾಸ್ತವಿಕವಾಗಿ ಸರಿಯಾಗಿಲ್ಲ</translation> +<translation id="881960277396325853">AI ಆಡಿಯೋವನ್ನು ಜನರೇಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="8953618380150219653">"ಈ ಪುಟವನ್ನು ಆಲಿಸಿ" ಪ್ಲೇಯರ್ ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ತೆರೆಯಲಾಗಿದೆ.</translation> <translation id="978117257931832348">ಸಣ್ಣ-ಧ್ವನಿ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ko.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ko.xtb index 7374f64..c5e516c 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ko.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ko.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">플레이어를 닫습니다.</translation> <translation id="8481839122437406573">침착함</translation> <translation id="8756370108715456837">사실과 다름</translation> +<translation id="881960277396325853">AI 오디오 생성 중…</translation> <translation id="8953618380150219653">'이 페이지의 내용 듣기' 플레이어가 전체 높이로 열렸습니다.</translation> <translation id="978117257931832348">저음</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ky.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ky.xtb index 078bd59..b4a9373 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ky.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ky.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Ойноткучту жабуу.</translation> <translation id="8481839122437406573">Жай</translation> <translation id="8756370108715456837">Чынында туура эмес</translation> +<translation id="881960277396325853">ЖИ аудио түзүп жатат...</translation> <translation id="8953618380150219653">"Бул баракты угуу" ойноткучу толук экранда ачылды.</translation> <translation id="978117257931832348">Төмөн тон</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lo.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lo.xtb index ffa5240..b48b5074 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lo.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_lo.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">ປິດຕົວຫຼິ້ນ.</translation> <translation id="8481839122437406573">ງຽບ</translation> <translation id="8756370108715456837">ບໍ່ຖືກຕ້ອງຕາມຂໍ້ເທັດຈິງ</translation> +<translation id="881960277396325853">ກຳລັງສ້າງສຽງ AI...</translation> <translation id="8953618380150219653">ເປີດຕົວຫຼິ້ນ “ຟັງໜ້ານີ້” ແບບເຕັມຄວາມສູງແລ້ວ.</translation> <translation id="978117257931832348">ສຽງຕ່ຳ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_mn.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_mn.xtb index 754878c3..a15a5bd 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_mn.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_mn.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Тоглуулагчийг хаана уу.</translation> <translation id="8481839122437406573">Тайван</translation> <translation id="8756370108715456837">Баримтын хувьд буруу</translation> +<translation id="881960277396325853">ХОУ-ы аудио үүсгэж байна...</translation> <translation id="8953618380150219653">“Энэ хуудсыг сонсох” тоглуулагчийг бүтэн өндөртэйгээр нээсэн.</translation> <translation id="978117257931832348">Доод өнгө</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_mr.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_mr.xtb index fb0c4d8..4967bc3 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_mr.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_mr.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">प्लेअर बंद करा.</translation> <translation id="8481839122437406573">शांत टोन असलेला आवाज</translation> <translation id="8756370108715456837">तथ्यानुसार चुकीचा आहे</translation> +<translation id="881960277396325853">AI ऑडिओ जनरेट करत आहे...</translation> <translation id="8953618380150219653">“हे पेज ऐका” प्लेअर पूर्ण उंचीवर उघडला आहे.</translation> <translation id="978117257931832348">कमी पिच असलेला आवाज</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ms.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ms.xtb index 137cf9f..6e6eaf9 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ms.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ms.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Tutup pemain.</translation> <translation id="8481839122437406573">Tenang</translation> <translation id="8756370108715456837">Tidak betul dari segi fakta</translation> +<translation id="881960277396325853">Menjana audio AI...</translation> <translation id="8953618380150219653">Pemain “Dengar halaman ini” dibuka pada ketinggian penuh.</translation> <translation id="978117257931832348">Pic rendah</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_nl.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_nl.xtb index 1040c1bc..2578df6 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_nl.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_nl.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Speler sluiten.</translation> <translation id="8481839122437406573">Kalm</translation> <translation id="8756370108715456837">Niet feitelijk juist</translation> +<translation id="881960277396325853">AI-audio genereren...</translation> <translation id="8953618380150219653">De speler 'Deze pagina beluisteren' is op volledige hoogte geopend.</translation> <translation id="978117257931832348">Lage toonhoogte</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_no.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_no.xtb index 06fcc33..f46b6080 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_no.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_no.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Lukk spilleren.</translation> <translation id="8481839122437406573">Rolig</translation> <translation id="8756370108715456837">Faktafeil</translation> +<translation id="881960277396325853">Genererer AI-lyd …</translation> <translation id="8953618380150219653">«Lytt til denne siden»-avspilleren er åpnet i full høyde.</translation> <translation id="978117257931832348">Mørk stemme</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_pl.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_pl.xtb index a203297cd..cfe3ca4 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_pl.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_pl.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Zamknij odtwarzacz.</translation> <translation id="8481839122437406573">Spokojny</translation> <translation id="8756370108715456837">Błędy merytoryczne</translation> +<translation id="881960277396325853">Generuję audio stworzone przez AI…</translation> <translation id="8953618380150219653">Odtwarzacz „Odsłuchaj tę stronę” otwarty na całą wysokość.</translation> <translation id="978117257931832348">Niski</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ro.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ro.xtb index f992881..1eb73cf6 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ro.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ro.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Închide playerul.</translation> <translation id="8481839122437406573">Calm</translation> <translation id="8756370108715456837">Nu este corect</translation> +<translation id="881960277396325853">Se generează conținut audio AI...</translation> <translation id="8953618380150219653">Playerul Ascultă pagina deschis la înălțimea completă.</translation> <translation id="978117257931832348">Înălțime scăzută a sunetului</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ru.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ru.xtb index 8576f71..d399834 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ru.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ru.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Закрыть проигрыватель.</translation> <translation id="8481839122437406573">спокойный</translation> <translation id="8756370108715456837">Противоречит фактам</translation> +<translation id="881960277396325853">ИИ генерирует аудио…</translation> <translation id="8953618380150219653">Проигрыватель функции "Озвучить эту страницу" развернут полностью.</translation> <translation id="978117257931832348">Низкий тон</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sv.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sv.xtb index 1c8c8e3..acd0542 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sv.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_sv.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Stäng spelaren.</translation> <translation id="8481839122437406573">Lugn</translation> <translation id="8756370108715456837">Innehåller faktafel</translation> +<translation id="881960277396325853">Genererar AI-ljud …</translation> <translation id="8953618380150219653">Spelaren Lyssna på den här sidan har öppnats över hela skärmen.</translation> <translation id="978117257931832348">Låg tonhöjd</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ta.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ta.xtb index afc7008..cb12b00 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ta.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_ta.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">பிளேயரை மூடும்.</translation> <translation id="8481839122437406573">காம்</translation> <translation id="8756370108715456837">உண்மை இல்லை</translation> +<translation id="881960277396325853">AI ஆடியோவை உருவாக்குகிறது...</translation> <translation id="8953618380150219653">“இந்தப் பக்கத்தைப் படி” பிளேயர் முழு உயரத்தில் திறக்கப்பட்டது.</translation> <translation id="978117257931832348">லோ பிட்ச்</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_uk.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_uk.xtb index e377b06..87bfdbe4 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_uk.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_uk.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">Закрити програвач.</translation> <translation id="8481839122437406573">спокійний</translation> <translation id="8756370108715456837">Недостовірна інформація</translation> +<translation id="881960277396325853">Створення аудіо за допомогою ШІ…</translation> <translation id="8953618380150219653">Програвач функції "Прослухати цю сторінку" відкрито на всю висоту.</translation> <translation id="978117257931832348">Низький тембр</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-CN.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-CN.xtb index f95633d..1e37282 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-CN.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-CN.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">关闭播放器。</translation> <translation id="8481839122437406573">平静</translation> <translation id="8756370108715456837">与事实不符</translation> +<translation id="881960277396325853">正在生成 AI 音频…</translation> <translation id="8953618380150219653">“读出此网页的内容”播放器已全屏打开。</translation> <translation id="978117257931832348">低音</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-HK.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-HK.xtb index 7116b33c..7926d3dc 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-HK.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-HK.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">閂播放器。</translation> <translation id="8481839122437406573">平靜</translation> <translation id="8756370108715456837">與事實不符</translation> +<translation id="881960277396325853">正在生成 AI 音訊…</translation> <translation id="8953618380150219653">「朗讀此頁面內容」播放器宜家顯示喺成個畫面。</translation> <translation id="978117257931832348">低音</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-TW.xtb b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-TW.xtb index 2a083599..03850cd 100644 --- a/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-TW.xtb +++ b/chrome/browser/readaloud/android/resources/translations/android_readaloud_strings_zh-TW.xtb
@@ -64,6 +64,7 @@ <translation id="8407011429883244666">關閉播放器。</translation> <translation id="8481839122437406573">平靜</translation> <translation id="8756370108715456837">與事實不符</translation> +<translation id="881960277396325853">正在生成 AI 音訊...</translation> <translation id="8953618380150219653">「朗讀這頁內容」播放器已開啟,目前已顯示在整個畫面上。</translation> <translation id="978117257931832348">低音</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc index a49b6a0..fbd656de 100644 --- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc +++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -48,6 +48,7 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/signin/signin_util.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" +#include "chrome/browser/supervised_user/supervised_user_test_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_finder.h" @@ -843,17 +844,8 @@ IN_PROC_BROWSER_TEST_F(ContextMenuForSupervisedUsersBrowserTest, SaveLinkAsEntryIsDisabledForUrlsNotAccessibleForChild) { - // Set up child user profile. - Profile* profile = browser()->profile(); - - // Block access to http://www.google.com/ in the URL filter. - supervised_user::SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile); - supervised_user::SupervisedUserURLFilter* url_filter = - supervised_user_service->GetURLFilter(); - std::map<std::string, bool> hosts; - hosts["www.google.com"] = false; - url_filter->SetManualHosts(std::move(hosts)); + supervised_user_test_util::SetManualFilterForHost( + browser()->profile(), "www.google.com", /*allowlist=*/false); base::RunLoop().RunUntilIdle();
diff --git a/chrome/browser/resources/chromeos/accessibility/OWNERS b/chrome/browser/resources/chromeos/accessibility/OWNERS index bfecbc9..35ca97e 100644 --- a/chrome/browser/resources/chromeos/accessibility/OWNERS +++ b/chrome/browser/resources/chromeos/accessibility/OWNERS
@@ -1,2 +1 @@ file://ash/accessibility/OWNERS -francisjp@google.com \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/mv2/autoclick/autoclick.ts b/chrome/browser/resources/chromeos/accessibility/accessibility_common/mv2/autoclick/autoclick.ts index 2900d07..c70a53a 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/mv2/autoclick/autoclick.ts +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/mv2/autoclick/autoclick.ts
@@ -14,6 +14,9 @@ // Required for AccessibilityExtensionAutomationUtilE2ETest. import '/common/automation_util.js'; import '/common/rect_util.js'; +// Required for AccessibilityExtensionCursorsTest. +import '/common/cursors/cursor.js'; +import '/common/cursors/range.js'; import {EventHandler} from '/common/event_handler.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/mv3/autoclick/autoclick.ts b/chrome/browser/resources/chromeos/accessibility/accessibility_common/mv3/autoclick/autoclick.ts index 2900d07..c70a53a 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/mv3/autoclick/autoclick.ts +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/mv3/autoclick/autoclick.ts
@@ -14,6 +14,9 @@ // Required for AccessibilityExtensionAutomationUtilE2ETest. import '/common/automation_util.js'; import '/common/rect_util.js'; +// Required for AccessibilityExtensionCursorsTest. +import '/common/cursors/cursor.js'; +import '/common/cursors/range.js'; import {EventHandler} from '/common/event_handler.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/BUILD.gn index dc5b2ab7..b0bb887 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/BUILD.gn
@@ -12,6 +12,8 @@ import("//chrome/test/base/ash/js2gtest.gni") import("//testing/test.gni") import("//tools/typescript/ts_library.gni") +import("//ui/webui/resources/tools/bundle_js.gni") +import("//ui/webui/resources/tools/minify_js.gni") group("build") { deps = [ @@ -22,9 +24,6 @@ ] } -closure_library_dir = - "//third_party/chromevox/third_party/closure-library/closure/goog" - chromevox_out_dir = "$root_out_dir/resources/chromeos/accessibility/chromevox/mv3" @@ -37,6 +36,9 @@ common_tsc_dir = "$root_gen_dir/chrome/browser/resources/chromeos/accessibility/common/tsc" +# Messageformat third_party directory. +messageformat_dir = "//third_party/node/node_modules/messageformat/lib/" + # List of all modules that are included in one or more of the production # chromevox scripts. # @@ -179,22 +181,6 @@ "background/phonetic_data.js", ] -# Closure library modules needed by chromevox. -relative_closure_library_modules = [ - "asserts/asserts.js", - "base.js", - "debug/error.js", - "dom/nodetype.js", - "i18n/pluralrules.js", - "i18n/ordinalrules.js", - "i18n/messageformat.js", - "object/object.js", - "string/string.js", -] - -closure_library_modules = - rebase_path(relative_closure_library_modules, ".", closure_library_dir) - # Root dir must be the parent directory so it can reach common/. ts_library("ts_build") { root_dir = "$ts_build_staging_dir" @@ -232,8 +218,11 @@ "../../definitions/tts.d.ts", ] - path_mappings = - [ "/common/*|" + rebase_path("$common_tsc_dir/*", target_gen_dir) ] + path_mappings = [ + "/common/*|" + rebase_path("$common_tsc_dir/*", target_gen_dir), + "/chromevox/mv3/third_party/messageformat/messageformat.rollup.js|" + + rebase_path("$messageformat_dir/messageformat.d.ts", target_gen_dir), + ] in_files = ts_modules + js_modules @@ -251,6 +240,7 @@ mode = "copy" dest_dir = chromevox_out_dir deps = [ + ":minify_js_messageformat", ":ts_build", "../../common:copied_files", "../../common:ts_build", @@ -270,7 +260,6 @@ sources = [ "background/background.html", - "common/closure_loader.js", "earcons/chromevox_loaded.ogg", "earcons/chromevox_loading.ogg", "earcons/control.wav", @@ -296,14 +285,11 @@ "tutorial/practice_areas/jump_commands.html", "tutorial/practice_areas/selects.html", ] - sources += js_modules - sources += closure_library_modules sources += filter_include(get_target_outputs(":ts_build"), [ "*.js" ]) rewrite_rules = [ rebase_path("$tsc_out_dir", root_build_dir) + ":", rebase_path(".", root_build_dir) + ":", - rebase_path(closure_library_dir, root_build_dir) + ":closure", ] } @@ -400,7 +386,7 @@ chromevox_test_modules = get_target_outputs(":chromevox_test_messages_js") generate_deps_js("chromevox_test_deps_js") { - sources = closure_library_modules + chromevox_test_modules + sources = chromevox_test_modules output_file = "$target_gen_dir/test_deps.js" rewrite_rules = [ rebase_path("//", root_build_dir) + ":", @@ -485,3 +471,21 @@ deps += [ ":chromevox_test_deps_js" ] defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] } + +bundle_js("bundle_js_messageformat") { + visibility = [ ":minify_js_messageformat" ] + + host = "_ignored_" + input = rebase_path("$messageformat_dir", root_build_dir) + js_module_in_files = [ "messageformat.js" ] + out_folder = "$target_gen_dir/messageformat" +} + +minify_js("minify_js_messageformat") { + visibility = [ ":copied_files" ] + + deps = [ ":bundle_js_messageformat" ] + in_folder = "$target_gen_dir/messageformat" + in_files = [ "messageformat.rollup.js" ] + out_folder = "$chromevox_out_dir/third_party/messageformat/" +}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/output/output.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/output/output.ts index 6128b50..ccbb850 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/output/output.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/output/output.ts
@@ -81,7 +81,7 @@ * $text_sel_end'). * * (@@) prefix: similar to @, used to substitute a message, but also pulls the - * localized string through goog.i18n.MessageFormat to support locale + * localized string through MessageFormat to support locale * aware plural handling. The first argument should be a number which will * be passed as a COUNT named parameter to MessageFormat. * TODO(plundblad): Make subsequent arguments normal placeholder arguments
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/output/output_formatter.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/output/output_formatter.ts index 439ccd9..dd0cf3e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/output/output_formatter.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/output/output_formatter.ts
@@ -5,6 +5,7 @@ /** * @fileoverview Class that formats the parsed output tree. */ +import {MessageFormat} from '/chromevox/mv3/third_party/messageformat/messageformat.rollup.js'; import {AutomationPredicate} from '/common/automation_predicate.js'; import {AutomationUtil} from '/common/automation_util.js'; import {constants} from '/common/constants.js'; @@ -1028,7 +1029,8 @@ outputFormatLogger: formatLog, }); const namedArgs = {COUNT: Number(argBuff[0])}; - return new goog.i18n.MessageFormat(msg).format(namedArgs); + const formatter = new MessageFormat(chrome.i18n.getUILanguage(), msg); + return formatter.format(namedArgs, () => {}); } private unexpectedValue_(formatLog: OutputFormatLogger, value: string): void {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/tts_background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/tts_background_test.js index 378198b..2234e56 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/tts_background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/tts_background_test.js
@@ -571,3 +571,122 @@ constants.SYSTEM_VOICE, ChromeVox.tts.ttsEngines_[0].currentVoice); })(); }); + +// Ensures that punctuation marks and symbols can be pluralized. +AX_TEST_F('ChromeVoxBackgroundTtsTest', 'Pluralization', function() { + const preprocess = tts.preprocess.bind(tts); + + assertEquals('exclamation', preprocess('!')); + assertEquals('3 exclamations', preprocess('!!!')); + + // Note that we don't cover the case for multiple spaces or tabs because + // preprocess will condense multiple spaces. + assertEquals('space', preprocess(' ')); + + // Backticks are omitted from pluralization logic at the preprocess layer. + assertEquals('backtick', preprocess('`')); + assertEquals('backtick backtick backtick', preprocess('```')); + + // Tildes are omitted from pluralization logic at the preprocess layer. + assertEquals('tilde', preprocess('~')); + assertEquals('tilde tilde tilde', preprocess('~~~')); + + assertEquals('at', preprocess('@')); + assertEquals('3 at signs', preprocess('@@@')); + + assertEquals('pound', preprocess('#')); + assertEquals('3 pound signs', preprocess('###')); + + assertEquals('dollar', preprocess('$')); + assertEquals('3 dollar signs', preprocess('$$$')); + + assertEquals('percent', preprocess('%')); + assertEquals('3 percent signs', preprocess('%%%')); + + assertEquals('caret', preprocess('^')); + assertEquals('3 carets', preprocess('^^^')); + + assertEquals('ampersand', preprocess('&')); + assertEquals('3 ampersands', preprocess('&&&')); + + assertEquals('asterisk', preprocess('*')); + assertEquals('3 asterisks', preprocess('***')); + + assertEquals('open paren', preprocess('(')); + assertEquals('3 open parens', preprocess('(((')); + + assertEquals('close paren', preprocess(')')); + assertEquals('3 close parens', preprocess(')))')); + + assertEquals('dash', preprocess('-')); + assertEquals('3 dashes', preprocess('---')); + + assertEquals('underscore', preprocess('_')); + assertEquals('3 underscores', preprocess('___')); + + assertEquals('equal', preprocess('=')); + assertEquals('3 equal signs', preprocess('===')); + + assertEquals('plus', preprocess('+')); + assertEquals('3 plus signs', preprocess('+++')); + + assertEquals('left bracket', preprocess('[')); + assertEquals('3 left brackets', preprocess('[[[')); + + assertEquals('right bracket', preprocess(']')); + assertEquals('3 right brackets', preprocess(']]]')); + + assertEquals('left brace', preprocess('{')); + assertEquals('3 left braces', preprocess('{{{')); + + assertEquals('right brace', preprocess('}')); + assertEquals('3 right braces', preprocess('}}}')); + + assertEquals('pipe', preprocess('|')); + assertEquals('3 vertical pipes', preprocess('|||')); + + assertEquals('semicolon', preprocess(';')); + assertEquals('3 semicolons', preprocess(';;;')); + + assertEquals('colon', preprocess(':')); + assertEquals('3 colons', preprocess(':::')); + + // Commas are omitted from pluralization logic at the preprocess layer. + assertEquals('comma', preprocess(',')); + assertEquals(',,,', preprocess(',,,')); + + assertEquals('dot', preprocess('.')); + assertEquals('..', preprocess('..')); + assertEquals('ellipsis', preprocess('...')); + assertEquals('4 dots', preprocess('....')); + + assertEquals('less than', preprocess('<')); + assertEquals('3 less than signs', preprocess('<<<')); + + assertEquals('greater than', preprocess('>')); + assertEquals('3 greater than signs', preprocess('>>>')); + + assertEquals('slash', preprocess('/')); + assertEquals('3 slashes', preprocess('///')); + + assertEquals('question mark', preprocess('?')); + assertEquals('3 question marks', preprocess('???')); + + assertEquals('quote', preprocess('"')); + assertEquals('3 quotes', preprocess('"""')); + + assertEquals('apostrophe', preprocess('\'')); + assertEquals('3 apostrophes', preprocess('\'\'\'')); + + assertEquals('backslash', preprocess('\\')); + assertEquals('3 backslashes', preprocess('\\\\\\')); + + assertEquals('bullet', preprocess('\u2022')); + assertEquals('3 bullets', preprocess('\u2022\u2022\u2022')); + + assertEquals('white bullet', preprocess('\u25e6')); + assertEquals('3 white bullets', preprocess('\u25e6\u25e6\u25e6')); + + assertEquals('square bullet', preprocess('\u25a0')); + assertEquals('3 square bullets', preprocess('\u25a0\u25a0\u25a0')); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/chromevox_loader.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/chromevox_loader.ts index 980234e..d39e05a 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/chromevox_loader.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/chromevox_loader.ts
@@ -2,16 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Closure scripts. Each call to importScripts() depends on the scripts in the previous calls. -// Can be found in //third_party/chromevox/third_party/closure_library/closure/goog/. -importScripts('../closure/base.js'); -importScripts( - '../closure/debug/error.js','../closure/dom/nodetype.js', '../closure/i18n/ordinalrules.js', - '../closure/i18n/pluralrules.js', '../closure/string/string.js'); -importScripts('../closure/asserts/asserts.js'); -importScripts('../closure/i18n/messageformat.js'); -importScripts('common/closure_loader.js'); - // ChromeVox ES6 modules. Non-ES6 modules cannot depend on these modules. import 'background/es6_loader.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/msgs.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/msgs.ts index fef7f418..c91a5bf 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/msgs.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/msgs.ts
@@ -6,6 +6,7 @@ /** * @fileoverview Defines methods related to retrieving translated messages. */ +import {MessageFormat} from '/chromevox/mv3/third_party/messageformat/messageformat.rollup.js'; import {TestImportManager} from '/common/testing/test_import_manager.js'; export class Msgs { @@ -47,13 +48,12 @@ /** * Returns the message with the given message ID, formatted for the given * count. - * @param subs Substitution strings. * @return The localized and formatted message. */ - static getMsgWithCount( - messageId: string, count: number, subs?: string[]): string { - return new goog.i18n.MessageFormat(Msgs.getMsg(messageId, subs)) - .format({COUNT: count}); + static getMsgWithCount(messageId: string, count: number): string { + const msg = Msgs.getMsg(messageId); + const formatter = new MessageFormat(chrome.i18n.getUILanguage(), msg); + return formatter.format({COUNT: count}, () => {}); } /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.html b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.html index af47821e..3fb3ae6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.html +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.html
@@ -10,24 +10,6 @@ <link href="panel.css" rel="stylesheet" type="text/css"> -<!-- Closure files, with a blank line between levels of the dependency tree. --> - -<script src="../closure/base.js" charset="utf-8"></script>; - -<script src="../closure/debug/error.js" charset="utf-8"></script> -<script src="../closure/dom/nodetype.js" charset="utf-8"></script> -<script src="../closure/i18n/ordinalrules.js" charset="utf-8"></script> -<script src="../closure/i18n/pluralrules.js" charset="utf-8"></script> -<script src="../closure/string/string.js" charset="utf-8"></script> - -<script src="../closure/asserts/asserts.js" charset="utf-8"></script> - -<script src="../closure/i18n/messageformat.js" charset="utf-8"></script> - -<script src="../common/closure_loader.js" charset="utf-8"></script> - -<!-- End closure files --> - <script type="module" src="panel.js"></script> </head>
diff --git a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.ts b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.ts index cac9045d..eb1a9b04 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.ts +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursor.ts
@@ -686,3 +686,6 @@ } TestImportManager.exportForTesting(Cursor); +TestImportManager.exportForTesting(['CursorMovement', CursorMovement]); +TestImportManager.exportForTesting(['CursorUnit', CursorUnit]); +TestImportManager.exportForTesting(WrappingCursor);
diff --git a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js index 6ffb2c9..a6748d6e 100644 --- a/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js +++ b/chrome/browser/resources/chromeos/accessibility/common/cursors/cursors_test.js
@@ -22,17 +22,7 @@ /** @override */ async setUpDeferred() { await super.setUpDeferred(); - await Promise.all([ - importModule('CursorRange', '/common/cursors/range.js'), - importModule( - ['Cursor', 'CursorMovement', 'CursorUnit', 'WrappingCursor'], - '/common/cursors/cursor.js'), - importModule('AutomationUtil', '/common/automation_util.js'), - importModule('AutomationPredicate', '/common/automation_predicate.js'), - importModule('constants', '/common/constants.js'), - importModule('createMockNode', '/common/testing/test_node_generator.js'), - ]); // Various aliases globalThis.CHARACTER = CursorUnit.CHARACTER; globalThis.WORD = CursorUnit.WORD;
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb index b59b60b..58147d2 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb
@@ -32,6 +32,7 @@ <translation id="1186712907912748007">Prevlačenje i ispuštanje je u toku. <ph name="GESTURE" /> da završite. Drugi pokreti su privremeno nedostupni.</translation> <translation id="1188858454923323853">komplementarno</translation> <translation id="1189258430971676908">Područje za vježbanje: padajuće liste</translation> +<translation id="1193484659698721586">.input {$$COUNT :number} .match $$COUNT 1{{}} *{{ugniježđena razina {$$COUNT}}}</translation> <translation id="1195238899008218998">Pogovor</translation> <translation id="1197088940767939838">Narandžasta</translation> <translation id="1198865190323699001">Pokreti dodirom</translation> @@ -100,6 +101,7 @@ <translation id="1506187449813838456">Povećaj visinu tona</translation> <translation id="151784044608172266">Sljedeća rečenica</translation> <translation id="1524531499102321782">Sljedeća linija Brailleovog pisma</translation> +<translation id="1534255288158532891">.input {$$COUNT :number} .match $$COUNT 1{{tilda}} *{{tilde ({$$COUNT})}}</translation> <translation id="1542513807034338907">Klizanje na prethodnu stranicu</translation> <translation id="1546370775711804143">Traka za pomicanje</translation> <translation id="1551572888042734032">Ljeto</translation> @@ -135,7 +137,9 @@ <translation id="1756785467854861272">Tamna magenta</translation> <translation id="1758693804775271377">Prevucite ulijevo ili udesno jednim prstom da pregledate lekcije za ovu temu</translation> <translation id="1765245556747822181">Prevucite jednim prstom prema gore</translation> +<translation id="1766900865718394987">.input {$$COUNT :number} .match $$COUNT 1{{funta}} *{{{$$COUNT} znak(ov)a funte}}</translation> <translation id="1771761307086386028">Listaj udesno</translation> +<translation id="1776454891300234201">.input {$$COUNT :number} .match $$COUNT 1{{kvadratna grafička oznaka}} *{{kvadratne grafičke oznake ({$$COUNT})}}</translation> <translation id="1781173782405573156">Ključ za prolaz</translation> <translation id="1787176709638001873">Tekst uređivanja lozinke</translation> <translation id="1795438342141780114">Vraćanje kursora u centar</translation> @@ -152,6 +156,7 @@ <translation id="1902396333223336119">Mobitel</translation> <translation id="1903683160884433981">Umjereno proljetno-zelena</translation> <translation id="1905379170753160525">Prikaz spiska naslova</translation> +<translation id="1909599030163690992">.input {$$COUNT :number} .match $$COUNT 1{{ampersand}} *{{{$$COUNT} ampersand(a)}}</translation> <translation id="1913761808037590218">#ed</translation> <translation id="1914424852593176649">Veličina <ph name="FONT_SIZE" /></translation> <translation id="1914635379910604678"><ph name="DOT" /> hvat</translation> @@ -159,6 +164,7 @@ <translation id="1926147969119007125">Pauziranje upravljanja licem</translation> <translation id="1928932365747995741">Nema prethodnog polja za tekst koje se može uređivati</translation> <translation id="1964135212174907577">Sljedeći objekat</translation> +<translation id="1969502304370936079">.input {$$COUNT :number} .match $$COUNT 1{{znak jednakosti}} *{{{$$COUNT} znaka jednakosti}}</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1988733631391393183">Prikaži komande na Braillevom pismu u menijima ChromeVoxa</translation> <translation id="2009187674653301682">Nije eksponent</translation> @@ -166,12 +172,14 @@ <translation id="203030071582665758">Nema prethodnog naslova 4. nivoa</translation> <translation id="2045055672832940894">Nema prethodne kontrole</translation> <translation id="2045606329038304310">Kontrola polja obrasca</translation> +<translation id="2061553293808239752">.input {$$COUNT :number} .match $$COUNT 1{{minuta}} *{{minute}}</translation> <translation id="2063539687800151747">Epigraf</translation> <translation id="2086961585857038472">Sljedeća riječ</translation> <translation id="2087981446621639008">dtlj spskopsa</translation> <translation id="2089387485033699258">bs</translation> <translation id="2091933974477985526">Prethodno područje teksta koji se može uređivati</translation> <translation id="2100350898815792233">Sva interpunkcija</translation> +<translation id="2109693710509473741">.input {$$COUNT :number} .match $$COUNT 1{{zarez}} *{{{$$COUNT} zarez(a)}}</translation> <translation id="2110480898214777136">Prelazak od početka do kraja ili od kraja do početka na stranici, u dijaloškom okviru ili nekom drugom spremniku</translation> <translation id="2119965627982867824">dgmokr</translation> <translation id="2121067395472282800">pristupni ključ:<ph name="KEY" /></translation> @@ -211,6 +219,7 @@ <translation id="2371402123699727805">Diktiranje je aktivno. <ph name="GESTURE" /> da zaustavite. Drugi pokreti su privremeno nedostupni.</translation> <translation id="2381733276052567791">Uključivanje/isključivanje govora</translation> <translation id="2390264819538553347">Pritisnite tipku enter da idete dalje; pritisnite tipku backspace da se vratite nazad.</translation> +<translation id="2397408693730730860">.input {$$COUNT :number} .match $$COUNT 1{{zvjezdica}} *{{zvjezdice ({$$COUNT})}}</translation> <translation id="2398579267367951220">Pišite da pretražite stranicu. Pritisnite "enter" da pređete na rezultat, koristite strelice nagore ili nadolje da pregledate rezultate, nastavite pisati da promijenite predmet pretraživanja ili pritisnite "escape" da otkažete.</translation> <translation id="240709722712693803">Plavoljubičasta</translation> <translation id="2416512023405990736">Neoznačeno polje za potvrdu</translation> @@ -267,6 +276,7 @@ <translation id="2708078563826046398">Breskva</translation> <translation id="2713444072780614174">Bijela</translation> <translation id="2717271541250958000">tabpnl</translation> +<translation id="2720806141886412599">.input {$$COUNT :number} .match $$COUNT 1{{obrnuta kosa crta}} *{{obrnute kose crte ({$$COUNT})}}</translation> <translation id="2723001399770238859">zvuk</translation> <translation id="2737898226590637227">Nema sljedećeg ARIA obilježja</translation> <translation id="2749275490991666823">Označeno</translation> @@ -329,6 +339,7 @@ <translation id="3090227230165225418">Objavi obavještenja o preuzimanju</translation> <translation id="3090532668523289635">grp</translation> <translation id="3093176084511590672">Sljedeće uočljivo mjesto</translation> +<translation id="3096276106587041702">.input {$$COUNT :number} .match $$COUNT 1{{sekunda}} *{{sekunde}}</translation> <translation id="3096671415663099226">cbo</translation> <translation id="309749186376891736">Pomjeranje kursora</translation> <translation id="3103579948980282461">Srednja nijansa ljubičasto-crvene</translation> @@ -367,6 +378,7 @@ <translation id="3270069636408109001">Nema sljedeće tabele</translation> <translation id="3273791280096244679">Sačuvaj oznaku</translation> <translation id="3283583562490372694">nije označeno</translation> +<translation id="3284124496287403323">.input {$$COUNT :number} .match $$COUNT 1{{s {$$COUNT} stavkom}} * {{sa stavkama ({$$COUNT})}}</translation> <translation id="3286372614333682499">uspravno</translation> <translation id="3286390186030710347">Klizač</translation> <translation id="3300733168898541351">opozovi</translation> @@ -403,6 +415,7 @@ <translation id="3473744269398144689">Pokretanje diktiranja</translation> <translation id="3490765818161916458">Mreža liste</translation> <translation id="3494946239022273294">stvmn</translation> +<translation id="3501911317648720697">.input {$$COUNT :number} .match $$COUNT 1{{dvotočka}} *{{dvotočke ({$$COUNT})}}</translation> <translation id="3505359110822747654">Sužavanje ChromeVox menija</translation> <translation id="352577523970648069">Rubrika za tekst koju je moguće uređivati</translation> <translation id="3538907380453898475">spskopsa</translation> @@ -439,6 +452,7 @@ <translation id="3783640748446814672">alt</translation> <translation id="3783725005098956899">Prikaži zapisnik</translation> <translation id="3801735343383419236">Lista automatskog popunjavanja</translation> +<translation id="3805994235248464699">.input {$$COUNT :number} .match $$COUNT 1{{znak postotka}} *{{{$$COUNT} znak(ov)a postotka}}</translation> <translation id="3806327402890551732">Pređite na sljedeću ili prethodnu stavku</translation> <translation id="3810838688059735925">Videozapis</translation> <translation id="3813387282697781382">Svijetlo koraljna</translation> @@ -449,6 +463,7 @@ <translation id="3856075812838139784">Samo za čitanje</translation> <translation id="3857141338659865495">Srednje tirkizna</translation> <translation id="3870295413168340326">Nema prethodnog naslova 3. nivoa</translation> +<translation id="3882892620695970398">.input {$$COUNT :number} .match $$COUNT 1{{znak pri}} *{{{$$COUNT} znak(ov)a pri}}</translation> <translation id="3887399638190992181">Osnovne tipke</translation> <translation id="3887576927692165210">up</translation> <translation id="3896762831164962772">Upravljanje licem je pauzirano. <ph name="GESTURE" /> da nastavite. Drugi pokreti su privremeno nedostupni.</translation> @@ -479,10 +494,13 @@ <translation id="4054936709456751127">sts</translation> <translation id="4058278702844053247">Učitavanje stranice je u toku</translation> <translation id="4065205963140826639">Pokušajte sada pritisnuti tipku za pretraživanje + strelicu nadesno da pronađete dugme Naprijed, a zatim pritisnite tipku za pretraživanje + razmak da kliknete na njega.</translation> +<translation id="4079553331137067698">.input {$$COUNT :number} .match $$COUNT 1{{kursor}} *{{({$$COUNT})kursor(a)}}</translation> <translation id="409334809956508737">Prethodni objekat</translation> +<translation id="4096952912560611353">.input {$$COUNT :number} .match $$COUNT 1{{plus}} *{{{$$COUNT} znak(ov)a plus}}</translation> <translation id="4099274309791143834">s podmenijem</translation> <translation id="4101527861445851766">Označeno polje za potvrdu</translation> <translation id="410225014223200513">Pravljenje kruga usnama</translation> +<translation id="411038122342629251">.input {$$COUNT :number} .match $$COUNT 1{{točka}} 3{{elipse}} *{{točke ({$$COUNT})}}</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116415223832267137">Upozorenje</translation> <translation id="4159784952369912983">Ljubičasta</translation> @@ -516,6 +534,7 @@ <translation id="4289540628985791613">Pregled</translation> <translation id="4294967782363273192">Sortiranje uzlazno</translation> <translation id="4300318234632215983">Najava URL-a iza linka</translation> +<translation id="4306112273432859778">.input {$$COUNT :number} .match $$COUNT 1{{veće od}} *{{{$$COUNT} znak(ov)a veće od}}</translation> <translation id="4321179778687042513">ctrl</translation> <translation id="4322625298640984693">Sijena</translation> <translation id="4352022650330571548">napiši <ph name="PHRASE" /></translation> @@ -550,12 +569,14 @@ <translation id="4547556996012970016">Sljedeći naslov 5. nivoa</translation> <translation id="4562381607973973258">Zaglavlje</translation> <translation id="4597532268155981612">obrazac</translation> +<translation id="4601047876198186470">.input {$$COUNT :number} .match $$COUNT 1{{znak manje od}} *{{{$$COUNT} znak(ov)a manje od}}</translation> <translation id="4601367666219428522">tbl <ph name="TABLENAME" /> <ph name="TABLEROWS" />x<ph name="TABLECOLS" /></translation> <translation id="4606933160360542263">Prilagođena kombinacija tipki: <ph name="KEY_COMBINATION" /></translation> <translation id="4615592953348396470">Zanemarivanje pritiska sljedeće tipke</translation> <translation id="4617384941327705512">Pametni ljepljivi način rada je isključen</translation> <translation id="4623097797855662355">Kolofon</translation> <translation id="4624970070706497034">TalkBack više ne pruža prilagođavanje za Chromebook računare. I dalje ga možete koristiti, ali koristite zadane prečice tastature za TalkBack. Pritisnite Search+A, zatim K da vidite dostupne prečice. Ako i dalje želite koristiti TalkBack, ponovo pritisnite naredbu.</translation> +<translation id="4636816104159717853">.input {$$COUNT :number} .match $$COUNT 1{{grafička oznaka}} *{{grafičke oznake ({$$COUNT})}}</translation> <translation id="4649220074413114917">Dodir ekrana s dva prsta se može koristiti da zaustavite govor koji je u toku. Ovo je korisno ako ne želite da ChromeVox nešto pročita. Da nastavite, dodirnite ekran s dva prsta.</translation> <translation id="4661075872484491155">stablo</translation> <translation id="4668929960204016307">,</translation> @@ -590,6 +611,7 @@ <translation id="4854380505292502090">Nema prehtodnog vidžeta za medije</translation> <translation id="4855927945655956315">Osnovne tipke: Ctrl</translation> <translation id="485806788160414322">Reproduciranje ili pauziranje medija</translation> +<translation id="4861593489403902434">.input {$$COUNT :number} .match $$COUNT 1{{desna zagrada}} *{{desne zagrade ({$$COUNT})}}</translation> <translation id="4862744964787595316">Nije podebljano</translation> <translation id="4865995900839719272">prelazak na prethodni red</translation> <translation id="4866956062845190338">rdmnuitm</translation> @@ -615,6 +637,7 @@ <translation id="4993152509206108683">Brzina je <ph name="PERCENT" /> posto</translation> <translation id="4994420463726586413">Najava trenutnog statusa baterije</translation> <translation id="4997282455736854877">Odabrali ste dugme za izbor <ph name="NAME" /></translation> +<translation id="500303467799629809">.input {$$COUNT :number} .match $$COUNT 1{{upitnik}} *{{{$$COUNT} upitnik(a)}}</translation> <translation id="5012724933919010465">Odabrano je dugme za izbor stavke menija <ph name="NAME" /></translation> <translation id="5014131807708055994">Nije moguće izvršiti komandu <ph name="COMMAND" />. <ph name="REASON" /></translation> <translation id="5020651427400641814">Omogući zapisivanje govora</translation> @@ -715,6 +738,7 @@ <translation id="5669637233317991674">Pritisnite tipku za pretraživanje i strelicu udesno ili tipku za pretraživanje i strelicu ulijevo da se krećete kroz ovu lekciju</translation> <translation id="5677240841070992068">Trenutna lokacija</translation> <translation id="5678161956734658133">urvred</translation> +<translation id="5678971933640285754">.input {$$COUNT :number} .match $$COUNT 1{{desna vitičasta zagrada}} *{{desne vitičaste zagrade ({$$COUNT})}}</translation> <translation id="5681643281275621376">def</translation> <translation id="5682113568322255809">Uočljivo mjesto</translation> <translation id="5683155931978483559">Prethodno polje za potvrdu</translation> @@ -755,6 +779,7 @@ <translation id="5899860758576822363">Reproduciraj smanjenom jačinom zvuka kada ChromeVox govori</translation> <translation id="5901630391730855834">Žuta</translation> <translation id="5906974869830879618">Unesite PIN</translation> +<translation id="5911156080308275026">.input {$$COUNT :number} .match $$COUNT 1{{točka sa zarezom}} *{{točke sa zarezom ({$$COUNT})}}</translation> <translation id="5921587111466148855">Poglavlje</translation> <translation id="5923780477617566089">Trenutni datum</translation> <translation id="5926889058434275234">Da vidite cijelu listu pokreta, posjetite centar za pomoć.</translation> @@ -795,6 +820,7 @@ <translation id="6197361807490522975">Tamnoplava</translation> <translation id="6218813441317556731">zamijeni <ph name="DELETE_PHRASE" /> s <ph name="INSERT_PHRASE" /></translation> <translation id="6236061028292614533">Sljedeći naslov</translation> +<translation id="625349470169752824">.input {$$COUNT :number} .match $$COUNT 1{{cijev}} *{{vertikalne cijevi ({$$COUNT})}}</translation> <translation id="6254901459154107917">Sljedeći prostor za tekst koji se može uređivati</translation> <translation id="6259464875943891919">Napustitli ste <ph name="TYPE" />.</translation> <translation id="6280088282605782512">Dodirnite dvaput</translation> @@ -827,6 +853,7 @@ <translation id="6493991254603208962">Zatamni</translation> <translation id="6501595918865591267">Tirkizna</translation> <translation id="6508059270146105198">Pomjeri Brailleov ekran na dno stranice</translation> +<translation id="6511611327412641506">.input {$$COUNT :number} .match $$COUNT 1{{otvorena zagrada}} *{{otvorene zagrade ({$$COUNT})}}</translation> <translation id="6521550811716689390">Tamnoljubičasta</translation> <translation id="6536157907112457272">Boja lana</translation> <translation id="6540201937398578274">U ChromeVoxu, tipka za pretraživanje je modifikacijska tipka. Većina prečica u ChromeVoxu počinje tipkom za pretraživanje. Također ćete koristiti tipke sa strelicama za navigaciju.</translation> @@ -867,6 +894,7 @@ <translation id="6859876496651143278">Prevucite jednim prstom ulijevo</translation> <translation id="6865519907510167493">Pogrešno napisano</translation> <translation id="6873188295213080042">Savjet: držite tipku za pretraživanje i pritisnite jednu od tipki sa strelicama da se krećete.</translation> +<translation id="6889949222685321250">.input {$$COUNT :number} .match $$COUNT 1{{+{$$COUNT}}} *{{+{$$COUNT}}}</translation> <translation id="6894148351896207544">Izgovaranje trenutnog vremena i datuma</translation> <translation id="6896758677409633944">Kopiraj</translation> <translation id="6897341342232909480">Pomjeranje ulijevo</translation> @@ -880,6 +908,7 @@ <translation id="6951482098621102657">Nema sljedećeg naslova 5. nivoa</translation> <translation id="6955705049214951590">Mistično roza</translation> <translation id="696356426651109308">Preskoči na početak</translation> +<translation id="6978319636763404384">.input {$$COUNT :number} .match $$COUNT 1{{sat}} *{{sati}}</translation> <translation id="6994042831499278539">Referenca iz rječnika</translation> <translation id="6996566555547746822">Sljedeći kombinirani okvir</translation> <translation id="6997224546856374593">Kada se čitaju velika slova:</translation> @@ -888,6 +917,7 @@ <translation id="7005146664810010831">URL nije pronađen</translation> <translation id="7026338066939101231">Smanjivanje</translation> <translation id="7031651751836475482">lstitm</translation> +<translation id="7032910411301673020">.input {$$COUNT :number} .match $$COUNT 1{{bijela grafička oznaka}} *{{bijele grafičke oznake ({$$COUNT})}}</translation> <translation id="7037042857287298941">Prethodna lista</translation> <translation id="7039555289296502784">Maslinastozelena</translation> <translation id="7041173719775863268">Kraj odabira</translation> @@ -897,6 +927,7 @@ <translation id="7086377898680121060">Posvijetli</translation> <translation id="7088743565397416204">Dvaput dodirnite da aktivirate stavku u fokusu</translation> <translation id="7088960765736518739">Pristup pomoću prekidača</translation> +<translation id="7089749381037113497">.input {$$COUNT :number} .match $$COUNT 1{{podvlaka}} *{{podvlake ({$$COUNT})}}</translation> <translation id="7090715360595433170">To također može biti efikasnije od prevlačenja jednim prstom ulijevo i udesno.</translation> <translation id="7091296112653361280">Drap boja</translation> <translation id="7095834689119144465">Uredi samo numerički tekst</translation> @@ -907,6 +938,7 @@ <translation id="712735679809149106">eho riječi</translation> <translation id="7137397390322864165">boja lososa</translation> <translation id="7140168702531682811">Eksponent</translation> +<translation id="7141256465543825898">.input {$$COUNT :number} .match $$COUNT 1{{kartica}} *{{kartice ({$$COUNT})}}</translation> <translation id="7143034430156387447">Prebacivanje između Braillevog pisma s 6 i 8 tačaka</translation> <translation id="7143207342074048698">Povezivanje</translation> <translation id="7153618581592392745">Svijetloljubičasta</translation> @@ -936,6 +968,7 @@ <translation id="7289186959554153431">Naslov 3</translation> <translation id="7292195267473691167"><ph name="LOCALE" /> (<ph name="VARIANT" />)</translation> <translation id="7297440685387139507">Završavanje prevlačenja i ispuštanja</translation> +<translation id="7307364818959876261">.input {$$COUNT :number} .match $$COUNT 1{{razmak}} *{{{$$COUNT} razmak(a)}}</translation> <translation id="7308519659008003150">Nema prethodnog polja obrasca</translation> <translation id="731121099745151312">stvkstab</translation> <translation id="7313717760367325059">pomoć</translation> @@ -966,6 +999,7 @@ <translation id="7543255924852002459">Odbaci oznaku</translation> <translation id="7552432549459840808">Korisne prečice za Chrome</translation> <translation id="7553679324939294712">umetni <ph name="INSERT_PHRASE" /> prije <ph name="BEFORE_PHRASE" /></translation> +<translation id="7564773684901619629">.input {$$COUNT :number} .match $$COUNT 1{{apostrof}} *{{{$$COUNT} apostrof(a)}}</translation> <translation id="7569983096843329377">Crna</translation> <translation id="7579911500627256166">tačka <ph name="DOT" /></translation> <translation id="7592060599656252486">Neki</translation> @@ -982,6 +1016,7 @@ <translation id="7637342083105831460">Pritisnite tipku za pretraživanje i strelicu udesno da pronađete područje za vježbanje ili dugme za sljedeću lekciju. Zatim pritisnite tipke za pretraživanje i razmak da ga aktivirate.</translation> <translation id="7639968568612851608">Tamnosiva</translation> <translation id="7663318257180412551">Naslov 2</translation> +<translation id="7673144236430784711">.input {$$COUNT :number} .match $$COUNT 1{{dolar}} *{{{$$COUNT} znak(ov)a dolara}}</translation> <translation id="7674576868851035240">Sljedeći link</translation> <translation id="7674768236845044097">oznaka</translation> <translation id="7676847077928500578">Vraćanje postavki pretvaranja teksta u govor na zadano</translation> @@ -991,9 +1026,11 @@ <translation id="7696631298608145306">pređi na sljedeću riječ</translation> <translation id="7701040980221191251">Nema</translation> <translation id="7701196182766842984">autolst</translation> +<translation id="7708242671340939466">.input {$$COUNT :number} .match $$COUNT 1{{crtica}} *{{crtice({$$COUNT})}}</translation> <translation id="7714340021005120797">Nema sljedećeg kombiniranog okvira</translation> <translation id="7715455358521357192">Škiljenje desnim okom</translation> <translation id="7724603315864178912">Izreži</translation> +<translation id="7731002461127710752">.input {$$COUNT :number} .match $$COUNT 1{{zatvoreni jednostruki navodnik}} *{{zatvoreni jednostruki navodnici ({$$COUNT})}}</translation> <translation id="7731785449856576010">Nema sljedećeg vidžeta za medije</translation> <translation id="7735498529470878067">Istraživanje dodirom vam može pomoći da brzo steknete uvid u ono što se nalazi na ekranu.</translation> <translation id="773906353055481349">Za kretanje po ćelijama, pritisnite tipku za pretraživanje + Ctrl + Alt i strelice</translation> @@ -1010,9 +1047,11 @@ <translation id="7839679365527550018">Prethodna riječ</translation> <translation id="7846634333498149051">Tastatura</translation> <translation id="7851816175263618915">Neki znakovi interpunkcije</translation> +<translation id="7861676488745595432">.input {$$COUNT :number} .match $$COUNT 1{{lijeva zagrada}} *{{lijeve zagrade ({$$COUNT})}}</translation> <translation id="7871691770940645922">Virtualni Brailleov ekran</translation> <translation id="7882421473871500483">Smeđa</translation> <translation id="78826985582142166">klzč</translation> +<translation id="7889376040363236522">.input {$$COUNT :number} .match $$COUNT 1{{navodnik}} *{{navodnici ({$$COUNT})}}</translation> <translation id="7913106023953875143">Nema sljedećeg naslova 2. nivoa</translation> <translation id="7927711904086083099">Nije odabrano</translation> <translation id="7935627501098484003">Vremenska kontrola</translation> @@ -1052,6 +1091,7 @@ <translation id="8132248161074464367">Prethodna nevažeća stavka</translation> <translation id="8138880386467279117">Dodirnuti</translation> <translation id="8146613869421949343">Zatim ćete saznati nešto o tipki za pretraživanje. Tipka za pretraživanje se koristi u kombinaciji s drugim tipkama za komande ChromeVoxa. Tipka za pretraživanje se nalazi odmah iznad lijeve tipke Shift. Da nastavite, pritisnite tipku za pretraživanje.</translation> +<translation id="8153361283127969411">.input {$$COUNT :number} .match $$COUNT 1{{desna zagrada}} *{{desne zagrade ({$$COUNT})}}</translation> <translation id="8158033275290782295">odabir svih stavki</translation> <translation id="816818801578874684">Ovo je prvi naslov. Pritisnite tipku za pretraživanje i tipku H da pređete na sljedeći naslov.</translation> <translation id="8173092779156526980">Prevucite s četiri prsta ulijevo</translation> @@ -1144,6 +1184,7 @@ <translation id="8897030325301866860">Font <ph name="FONT_FAMILY" /></translation> <translation id="8898516272131543774">Ciklus ehoa interpunkcije</translation> <translation id="8908714597367957477">zglvljkol</translation> +<translation id="8909819899961392044">.input {$$COUNT :number} .match $$COUNT 1{{lijeva vitičasta zagrada}} *{{lijeve vitičaste zagrade ({$$COUNT})}}</translation> <translation id="8910180774920883033">Radnje su dostupne. Pritisnite Pretraživanje + Ctrl + A da ih prikažete</translation> <translation id="8937112856099038376">intlnk</translation> <translation id="8940925288729953902">Modifikacijske tipke</translation> @@ -1173,12 +1214,14 @@ <translation id="9108370397979208512">matematički</translation> <translation id="9108589040018540527">scbr</translation> <translation id="9128414153595658330">dlg</translation> +<translation id="9132815018758550541">.input {$$COUNT :number} .match $$COUNT 1{{uskličnik}} *{{{$$COUNT} uskličnik(a)}}</translation> <translation id="9133928141873682933">Boja pijeska</translation> <translation id="9149560530563164529">sctn</translation> <translation id="9150735707954472829">Kartica</translation> <translation id="9151249085738989067">Automatski prebacuj glas za ChromeVox na osnovu jezika</translation> <translation id="9153606228985488238">Visina glasa je <ph name="PERCENT" /> posto</translation> <translation id="9160096769946561184">Prelazak na kraj trenutne kolone</translation> +<translation id="916022049788356777">.input {$$COUNT :number} .match $$COUNT 1{{kosa crta}} *{{kose crte ({$$COUNT})}}</translation> <translation id="9173115498289768110">Jačina zvuka je na <ph name="PERCENT" /> posto</translation> <translation id="9185200690645120087">Vodič za upravljanje dodirom u ChromeVoxu</translation> <translation id="9192904702577636854">Pokretni tekst</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hr.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hr.xtb index c584e40..e20e03c 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hr.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hr.xtb
@@ -32,6 +32,7 @@ <translation id="1186712907912748007">U tijeku je povlačenje i ispuštanje. <ph name="GESTURE" /> da biste završili. Drugi pokreti privremeno nisu dostupni.</translation> <translation id="1188858454923323853">dopunski</translation> <translation id="1189258430971676908">Područje za vježbu: padajući popisi</translation> +<translation id="1193484659698721586">.input {$$COUNT :number} .match $$COUNT 1{{}} *{{ugniježđena razina {$$COUNT}}}</translation> <translation id="1195238899008218998">Pogovor</translation> <translation id="1197088940767939838">Narančasta</translation> <translation id="1198865190323699001">Pokreti dodira</translation> @@ -100,6 +101,7 @@ <translation id="1506187449813838456">Povećanje visine tona</translation> <translation id="151784044608172266">Sljedeća rečenica</translation> <translation id="1524531499102321782">Sljedeći redak brajice</translation> +<translation id="1534255288158532891">.input {$$COUNT :number} .match $$COUNT 1{{tilda}} *{{tilde ({$$COUNT})}}</translation> <translation id="1542513807034338907">Pomicanje na prethodnu stranicu</translation> <translation id="1546370775711804143">Kliznik</translation> <translation id="1551572888042734032">Ljeto</translation> @@ -135,7 +137,9 @@ <translation id="1756785467854861272">Tamna magenta</translation> <translation id="1758693804775271377">Prelazite jednim prstom ulijevo ili udesno da biste pregledavali lekcije za ovu temu</translation> <translation id="1765245556747822181">Prelazak jednim prstom prema gore</translation> +<translation id="1766900865718394987">.input {$$COUNT :number} .match $$COUNT 1{{funta}} *{{{$$COUNT} znak(ov)a funte}}</translation> <translation id="1771761307086386028">Pomicanje udesno</translation> +<translation id="1776454891300234201">.input {$$COUNT :number} .match $$COUNT 1{{kvadratna grafička oznaka}} *{{kvadratne grafičke oznake ({$$COUNT})}}</translation> <translation id="1781173782405573156">Tipka za izravni pristup</translation> <translation id="1787176709638001873">Tekst uređivanja zaporke</translation> <translation id="1795438342141780114">Vraćanje pokazivača na sredinu</translation> @@ -152,6 +156,7 @@ <translation id="1902396333223336119">Ćelija</translation> <translation id="1903683160884433981">Srednja proljetnozelena</translation> <translation id="1905379170753160525">Prikaz popisa naslova</translation> +<translation id="1909599030163690992">.input {$$COUNT :number} .match $$COUNT 1{{ampersand}} *{{{$$COUNT} ampersand(a)}}</translation> <translation id="1913761808037590218">#ed</translation> <translation id="1914424852593176649">Veličina: <ph name="FONT_SIZE" /></translation> <translation id="1914635379910604678">Akord <ph name="DOT" /></translation> @@ -159,6 +164,7 @@ <translation id="1926147969119007125">Pauzirajte upravljanje licem</translation> <translation id="1928932365747995741">Nema prethodnog tekstualnog polja koje je moguće urediti</translation> <translation id="1964135212174907577">Sljedeći objekt</translation> +<translation id="1969502304370936079">.input {$$COUNT :number} .match $$COUNT 1{{znak jednakosti}} *{{{$$COUNT} znaka jednakosti}}</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1988733631391393183">Prikaži brajične naredbe na izbornicima ChromeVoxa</translation> <translation id="2009187674653301682">Nije eksponent</translation> @@ -166,12 +172,14 @@ <translation id="203030071582665758">Nema prethodnog naslova 4. razine</translation> <translation id="2045055672832940894">Nema prethodne kontrole</translation> <translation id="2045606329038304310">Kontrola polja obrasca</translation> +<translation id="2061553293808239752">.input {$$COUNT :number} .match $$COUNT 1{{minuta}} *{{minute}}</translation> <translation id="2063539687800151747">Epigraf</translation> <translation id="2086961585857038472">Sljedeća riječ</translation> <translation id="2087981446621639008">dscrplst dtl</translation> <translation id="2089387485033699258">hr</translation> <translation id="2091933974477985526">Prethodno područje s mogućnošću uređivanja</translation> <translation id="2100350898815792233">Sva interpunkcija</translation> +<translation id="2109693710509473741">.input {$$COUNT :number} .match $$COUNT 1{{zarez}} *{{{$$COUNT} zarez(a)}}</translation> <translation id="2110480898214777136">Prelazak od početka do kraja ili od kraja do početka na stranici, u dijaloškom okviru ili nekom drugom spremniku</translation> <translation id="2119965627982867824">okgmb</translation> <translation id="2121067395472282800">pristupna tipka: <ph name="KEY" /></translation> @@ -211,6 +219,7 @@ <translation id="2371402123699727805">Diktiranje je aktivno. <ph name="GESTURE" /> da biste ga zaustavili. Drugi pokreti privremeno nisu dostupni.</translation> <translation id="2381733276052567791">Uključivanje ili isključivanje govora</translation> <translation id="2390264819538553347">Za prelazak na sljedeću stranicu pritisnite Enter, a za povratak pritisnite Backspace.</translation> +<translation id="2397408693730730860">.input {$$COUNT :number} .match $$COUNT 1{{zvjezdica}} *{{zvjezdice ({$$COUNT})}}</translation> <translation id="2398579267367951220">Unesite za pretraživanje stranice. Pritisnite tipku Enter za prelazak na rezultat, strelice prema gore ili dolje za pretraživanje rezultata, nastavite upisivati kako biste izmijenili pretraživanje ili pritisnite tipku Escape za poništavanje.</translation> <translation id="240709722712693803">Plavoljubičasta</translation> <translation id="2416512023405990736">Prazan potvrdni okvir</translation> @@ -267,6 +276,7 @@ <translation id="2708078563826046398">Peach Puff</translation> <translation id="2713444072780614174">Bijela</translation> <translation id="2717271541250958000">plkart</translation> +<translation id="2720806141886412599">.input {$$COUNT :number} .match $$COUNT 1{{obrnuta kosa crta}} *{{obrnute kose crte ({$$COUNT})}}</translation> <translation id="2723001399770238859">zvuk</translation> <translation id="2737898226590637227">Nema sljedećeg ARIA orijentira</translation> <translation id="2749275490991666823">Označen</translation> @@ -329,6 +339,7 @@ <translation id="3090227230165225418">Najavi obavijesti o preuzimanju</translation> <translation id="3090532668523289635">grp</translation> <translation id="3093176084511590672">Sljedeći orijentir</translation> +<translation id="3096276106587041702">.input {$$COUNT :number} .match $$COUNT 1{{sekunda}} *{{sekunde}}</translation> <translation id="3096671415663099226">kmbokv</translation> <translation id="309749186376891736">Pomicanje pokazivača</translation> <translation id="3103579948980282461">Srednja ljubičastocrvena</translation> @@ -367,6 +378,7 @@ <translation id="3270069636408109001">Nema sljedeće tablice</translation> <translation id="3273791280096244679">Spremi oznaku</translation> <translation id="3283583562490372694">nije odabrano</translation> +<translation id="3284124496287403323">.input {$$COUNT :number} .match $$COUNT 1{{s {$$COUNT} stavkom}} * {{sa stavkama ({$$COUNT})}}</translation> <translation id="3286372614333682499">portret</translation> <translation id="3286390186030710347">Klizač</translation> <translation id="3300733168898541351">poništi</translation> @@ -403,6 +415,7 @@ <translation id="3473744269398144689">Započnite diktirati</translation> <translation id="3490765818161916458">Rešetka popisa</translation> <translation id="3494946239022273294">stizb</translation> +<translation id="3501911317648720697">.input {$$COUNT :number} .match $$COUNT 1{{dvotočka}} *{{dvotočke ({$$COUNT})}}</translation> <translation id="3505359110822747654">Sažimanje izbornika ChromeVoxa</translation> <translation id="352577523970648069">Tekstualno polje koje se može urediti</translation> <translation id="3538907380453898475">dscrplst</translation> @@ -439,6 +452,7 @@ <translation id="3783640748446814672">alt</translation> <translation id="3783725005098956899">Prikaži datoteku zapisnika</translation> <translation id="3801735343383419236">Popis automatskog dovršavanja</translation> +<translation id="3805994235248464699">.input {$$COUNT :number} .match $$COUNT 1{{znak postotka}} *{{{$$COUNT} znak(ov)a postotka}}</translation> <translation id="3806327402890551732">Pomicanje na sljedeću ili prethodnu stavku</translation> <translation id="3810838688059735925">Video</translation> <translation id="3813387282697781382">Svijetlokoraljna</translation> @@ -449,6 +463,7 @@ <translation id="3856075812838139784">Samo za čitanje</translation> <translation id="3857141338659865495">Srednjetirkizna</translation> <translation id="3870295413168340326">Nema prethodnog naslova 3. razine</translation> +<translation id="3882892620695970398">.input {$$COUNT :number} .match $$COUNT 1{{znak pri}} *{{{$$COUNT} znak(ov)a pri}}</translation> <translation id="3887399638190992181">Ključne tipke</translation> <translation id="3887576927692165210">ed</translation> <translation id="3896762831164962772">Upravljanje licem je pauzirano. <ph name="GESTURE" /> da biste nastavili. Drugi pokreti privremeno nisu dostupni.</translation> @@ -479,10 +494,13 @@ <translation id="4054936709456751127">stat</translation> <translation id="4058278702844053247">Učitavanje stranice u tijeku</translation> <translation id="4065205963140826639">Sada pokušajte pritisnuti tipku za pretraživanje i desnu strelicu da biste pronašli gumb Sljedeća, a zatim pritisnite tipku za pretraživanje i razmaknicu da biste ga kliknuli.</translation> +<translation id="4079553331137067698">.input {$$COUNT :number} .match $$COUNT 1{{kursor}} *{{({$$COUNT})kursor(a)}}</translation> <translation id="409334809956508737">Prethodni objekt</translation> +<translation id="4096952912560611353">.input {$$COUNT :number} .match $$COUNT 1{{plus}} *{{{$$COUNT} znak(ov)a plus}}</translation> <translation id="4099274309791143834">s podizbornikom</translation> <translation id="4101527861445851766">Potvrdni okvir s kvačicom</translation> <translation id="410225014223200513">Oblikovanje kruga usnama</translation> +<translation id="411038122342629251">.input {$$COUNT :number} .match $$COUNT 1{{točka}} 3{{elipse}} *{{točke ({$$COUNT})}}</translation> <translation id="4115378294792113321">Magenta</translation> <translation id="4116415223832267137">Upozorenje</translation> <translation id="4159784952369912983">Ljubičasto</translation> @@ -516,6 +534,7 @@ <translation id="4289540628985791613">Pregled</translation> <translation id="4294967782363273192">Poredano uzlazno</translation> <translation id="4300318234632215983">Izgovaranje URL-a veze</translation> +<translation id="4306112273432859778">.input {$$COUNT :number} .match $$COUNT 1{{veće od}} *{{{$$COUNT} znak(ov)a veće od}}</translation> <translation id="4321179778687042513">ctrl</translation> <translation id="4322625298640984693">Oker</translation> <translation id="4352022650330571548">unesi <ph name="PHRASE" /></translation> @@ -550,12 +569,14 @@ <translation id="4547556996012970016">Sljedeći naslov razine 5</translation> <translation id="4562381607973973258">Zaglavlje</translation> <translation id="4597532268155981612">obrazac</translation> +<translation id="4601047876198186470">.input {$$COUNT :number} .match $$COUNT 1{{znak manje od}} *{{{$$COUNT} znak(ov)a manje od}}</translation> <translation id="4601367666219428522">tbl <ph name="TABLENAME" /> <ph name="TABLEROWS" /> x <ph name="TABLECOLS" /></translation> <translation id="4606933160360542263">Prilagođena kombinacija tipki: <ph name="KEY_COMBINATION" /></translation> <translation id="4615592953348396470">Zanemarivanje pritiska na sljedeću tipku</translation> <translation id="4617384941327705512">Pametan ljepljivi način isključen</translation> <translation id="4623097797855662355">Kolofon</translation> <translation id="4624970070706497034">TalkBack više ne pruža prilagodbu za Chromebookove. I dalje možete upotrebljavati TalkBack, no koristite njegove zadane tipkovne prečace. Pritisnite Search + A, a zatim K da biste vidjeli dostupne prečace. Ako i dalje želite upotrebljavati TalkBack, ponovo pritisnite tu naredbu.</translation> +<translation id="4636816104159717853">.input {$$COUNT :number} .match $$COUNT 1{{grafička oznaka}} *{{grafičke oznake ({$$COUNT})}}</translation> <translation id="4649220074413114917">Trenutačni govor možete zaustaviti dodirivanjem zaslona dvama prstima. To je korisno ako ne želite da ChromeVox nešto pročita. Da biste nastavili, dodirnite zaslon dvama prstima.</translation> <translation id="4661075872484491155">stablo</translation> <translation id="4668929960204016307">,</translation> @@ -590,6 +611,7 @@ <translation id="4854380505292502090">Nema widgeta za prethodni medij</translation> <translation id="4855927945655956315">Ključne tipke: Control</translation> <translation id="485806788160414322">Reproduciranje ili pauziranje medija</translation> +<translation id="4861593489403902434">.input {$$COUNT :number} .match $$COUNT 1{{desna zagrada}} *{{desne zagrade ({$$COUNT})}}</translation> <translation id="4862744964787595316">Nepodebljano</translation> <translation id="4865995900839719272">prijeđi na prethodni redak</translation> <translation id="4866956062845190338">rdstizb</translation> @@ -615,6 +637,7 @@ <translation id="4993152509206108683">Stopa <ph name="PERCENT" /> posto</translation> <translation id="4994420463726586413">Izgovori trenutačni status baterije</translation> <translation id="4997282455736854877"><ph name="NAME" />, izborni gumb odabran</translation> +<translation id="500303467799629809">.input {$$COUNT :number} .match $$COUNT 1{{upitnik}} *{{{$$COUNT} upitnik(a)}}</translation> <translation id="5012724933919010465">Izborni gumb stavke izbornika <ph name="NAME" /> je odabran</translation> <translation id="5014131807708055994">Nije moguće: <ph name="COMMAND" />, <ph name="REASON" /></translation> <translation id="5020651427400641814">Omogućite glasovnu prijavu</translation> @@ -715,6 +738,7 @@ <translation id="5669637233317991674">Pritisnite tipku za pretraživanje i strelicu desno ili tipku za pretraživanje i strelicu lijevo da biste se kretali ovom lekcijom</translation> <translation id="5677240841070992068">Trenutačna lokacija</translation> <translation id="5678161956734658133">mled</translation> +<translation id="5678971933640285754">.input {$$COUNT :number} .match $$COUNT 1{{desna vitičasta zagrada}} *{{desne vitičaste zagrade ({$$COUNT})}}</translation> <translation id="5681643281275621376">def</translation> <translation id="5682113568322255809">Orijentir</translation> <translation id="5683155931978483559">Prethodni potvrdni okvir</translation> @@ -755,6 +779,7 @@ <translation id="5899860758576822363">Smanji glasnoću reprodukcije kad ChromeVox govori</translation> <translation id="5901630391730855834">Žuta</translation> <translation id="5906974869830879618">Unesite PIN</translation> +<translation id="5911156080308275026">.input {$$COUNT :number} .match $$COUNT 1{{točka sa zarezom}} *{{točke sa zarezom ({$$COUNT})}}</translation> <translation id="5921587111466148855">Poglavlje</translation> <translation id="5923780477617566089">Trenutačni datum</translation> <translation id="5926889058434275234">Cijeli popis pokreta potražite u centru za pomoć.</translation> @@ -795,6 +820,7 @@ <translation id="6197361807490522975">Tamnoplava</translation> <translation id="6218813441317556731">zamijeni izraz <ph name="DELETE_PHRASE" /> izrazom <ph name="INSERT_PHRASE" /></translation> <translation id="6236061028292614533">Sljedeći naslov</translation> +<translation id="625349470169752824">.input {$$COUNT :number} .match $$COUNT 1{{cijev}} *{{vertikalne cijevi ({$$COUNT})}}</translation> <translation id="6254901459154107917">Sljedeće tekstualno područje s mogućnošću uređivanja</translation> <translation id="6259464875943891919">Napustili ste <ph name="TYPE" />.</translation> <translation id="6280088282605782512">Dodirnite dvaput</translation> @@ -827,6 +853,7 @@ <translation id="6493991254603208962">smanjivanje svjetline</translation> <translation id="6501595918865591267">Tirkizna</translation> <translation id="6508059270146105198">Premještanje brajičnog prikaza na dno stranice</translation> +<translation id="6511611327412641506">.input {$$COUNT :number} .match $$COUNT 1{{otvorena zagrada}} *{{otvorene zagrade ({$$COUNT})}}</translation> <translation id="6521550811716689390">Tamnoljubičasta</translation> <translation id="6536157907112457272">Lan</translation> <translation id="6540201937398578274">U ChromeVoxu tipka za pretraživanje ujedno služi kao modifikatorska tipka. Za većinu prečaca ChromeVoxa prvo trebate pritisnuti tipku za pretraživanje, a za kretanje koristite tipke strelica.</translation> @@ -867,6 +894,7 @@ <translation id="6859876496651143278">Prelazak jednim prstom ulijevo</translation> <translation id="6865519907510167493">Pravopisna pogreška</translation> <translation id="6873188295213080042">Savjet: zadržite tipku za pretraživanje i pritišćite tipke sa strelicama da biste se kretali.</translation> +<translation id="6889949222685321250">.input {$$COUNT :number} .match $$COUNT 1{{+{$$COUNT}}} *{{+{$$COUNT}}}</translation> <translation id="6894148351896207544">Izgovara trenutačno vrijeme i datum</translation> <translation id="6896758677409633944">Kopiraj</translation> <translation id="6897341342232909480">Pomakni lijevo</translation> @@ -880,6 +908,7 @@ <translation id="6951482098621102657">Nema sljedećeg naslova 5. razine</translation> <translation id="6955705049214951590">Maglenoružičasta</translation> <translation id="696356426651109308">Skoči na početak</translation> +<translation id="6978319636763404384">.input {$$COUNT :number} .match $$COUNT 1{{sat}} *{{sati}}</translation> <translation id="6994042831499278539">Referenca iz pojmovnika</translation> <translation id="6996566555547746822">Sljedeći kombinirani okvir</translation> <translation id="6997224546856374593">Prilikom čitanja velikih slova:</translation> @@ -888,6 +917,7 @@ <translation id="7005146664810010831">Nije pronađen nijedan URL</translation> <translation id="7026338066939101231">Pomak unatrag</translation> <translation id="7031651751836475482">stvk pops</translation> +<translation id="7032910411301673020">.input {$$COUNT :number} .match $$COUNT 1{{bijela grafička oznaka}} *{{bijele grafičke oznake ({$$COUNT})}}</translation> <translation id="7037042857287298941">Prethodni popis</translation> <translation id="7039555289296502784">Sivomaslinasta</translation> <translation id="7041173719775863268">Kraj odabira</translation> @@ -897,6 +927,7 @@ <translation id="7086377898680121060">povećavanje svjetline</translation> <translation id="7088743565397416204">Dvaput dodirnite da biste aktivirali ono što je u fokusu</translation> <translation id="7088960765736518739">Navigacija prekidačima</translation> +<translation id="7089749381037113497">.input {$$COUNT :number} .match $$COUNT 1{{podvlaka}} *{{podvlake ({$$COUNT})}}</translation> <translation id="7090715360595433170">To može biti učinkovitije od prelaženja jednim prstom ulijevo i udesno.</translation> <translation id="7091296112653361280">Navajo bijela</translation> <translation id="7095834689119144465">Samo numeričko uređivanje teksta</translation> @@ -907,6 +938,7 @@ <translation id="712735679809149106">odjek riječi</translation> <translation id="7137397390322864165">Boja lososa</translation> <translation id="7140168702531682811">Eksponent</translation> +<translation id="7141256465543825898">.input {$$COUNT :number} .match $$COUNT 1{{kartica}} *{{kartice ({$$COUNT})}}</translation> <translation id="7143034430156387447">Prebacivanje između brajice sa 6 i 8 točkica</translation> <translation id="7143207342074048698">Povezivanje</translation> <translation id="7153618581592392745">Lavanda</translation> @@ -936,6 +968,7 @@ <translation id="7289186959554153431">Naslov 3</translation> <translation id="7292195267473691167"><ph name="LOCALE" /> (<ph name="VARIANT" />)</translation> <translation id="7297440685387139507">Prekinite povlačenje i ispuštanje</translation> +<translation id="7307364818959876261">.input {$$COUNT :number} .match $$COUNT 1{{razmak}} *{{{$$COUNT} razmak(a)}}</translation> <translation id="7308519659008003150">Nema prethodnog polja obrasca</translation> <translation id="731121099745151312">stvkstab</translation> <translation id="7313717760367325059">pomoć</translation> @@ -966,6 +999,7 @@ <translation id="7543255924852002459">Odbaci oznaku</translation> <translation id="7552432549459840808">Korisni prečaci Chromea</translation> <translation id="7553679324939294712">umetni <ph name="INSERT_PHRASE" /> ispred <ph name="BEFORE_PHRASE" /></translation> +<translation id="7564773684901619629">.input {$$COUNT :number} .match $$COUNT 1{{apostrof}} *{{{$$COUNT} apostrof(a)}}</translation> <translation id="7569983096843329377">Crna</translation> <translation id="7579911500627256166">točkica <ph name="DOT" /></translation> <translation id="7592060599656252486">Neki</translation> @@ -982,6 +1016,7 @@ <translation id="7637342083105831460">Pritisnite tipku za pretraživanje i desnu strelicu da biste pronašli područje za vježbu ili gumb Sljedeća lekcija. Zatim pritisnite tipku za pretraživanje i razmaknicu da biste aktivirali odabranu opciju.</translation> <translation id="7639968568612851608">Tamnosiva</translation> <translation id="7663318257180412551">Naslov 2</translation> +<translation id="7673144236430784711">.input {$$COUNT :number} .match $$COUNT 1{{dolar}} *{{{$$COUNT} znak(ov)a dolara}}</translation> <translation id="7674576868851035240">Sljedeća veza</translation> <translation id="7674768236845044097">oznaka</translation> <translation id="7676847077928500578">Vraćanje postavki pretvaranja teksta u govor na zadano</translation> @@ -991,9 +1026,11 @@ <translation id="7696631298608145306">prijeđi na sljedeću riječ</translation> <translation id="7701040980221191251">Nema ih</translation> <translation id="7701196182766842984">autopop</translation> +<translation id="7708242671340939466">.input {$$COUNT :number} .match $$COUNT 1{{crtica}} *{{crtice({$$COUNT})}}</translation> <translation id="7714340021005120797">Nema sljedećeg kombiniranog okvira</translation> <translation id="7715455358521357192">Škiljenje na desno oko</translation> <translation id="7724603315864178912">Izreži</translation> +<translation id="7731002461127710752">.input {$$COUNT :number} .match $$COUNT 1{{zatvoreni jednostruki navodnik}} *{{zatvoreni jednostruki navodnici ({$$COUNT})}}</translation> <translation id="7731785449856576010">Nema sljedećeg widgeta medija</translation> <translation id="7735498529470878067">Istraživanje dodirom može vam pomoći da brzo dobijete uvid u to što se nalazi na zaslonu.</translation> <translation id="773906353055481349">Za kretanje od ćelije do ćelije pritisnite tipku za pretraživanje + Ctrl + Alt i strelice</translation> @@ -1010,9 +1047,11 @@ <translation id="7839679365527550018">Prethodna riječ</translation> <translation id="7846634333498149051">Tipkovnica</translation> <translation id="7851816175263618915">Neki interpunkcijski znakovi</translation> +<translation id="7861676488745595432">.input {$$COUNT :number} .match $$COUNT 1{{lijeva zagrada}} *{{lijeve zagrade ({$$COUNT})}}</translation> <translation id="7871691770940645922">Virtualni brajev redak</translation> <translation id="7882421473871500483">Smeđa</translation> <translation id="78826985582142166">klz</translation> +<translation id="7889376040363236522">.input {$$COUNT :number} .match $$COUNT 1{{navodnik}} *{{navodnici ({$$COUNT})}}</translation> <translation id="7913106023953875143">Nema sljedećeg naslova 2. razine</translation> <translation id="7927711904086083099">Nije odabran</translation> <translation id="7935627501098484003">Kontrola vremena</translation> @@ -1052,6 +1091,7 @@ <translation id="8132248161074464367">Prethodna nevažeća stavka</translation> <translation id="8138880386467279117">Dodir</translation> <translation id="8146613869421949343">U sljedećem koraku saznat ćete više o tipki za pretraživanje. Tipka za pretraživanje koristi se u kombinaciji s drugim tipkama za ChromeVoxove naredbe. Tipka za pretraživanje nalazi se neposredno iznad lijeve tipke Shift. Da biste nastavili, pritisnite tipku za pretraživanje.</translation> +<translation id="8153361283127969411">.input {$$COUNT :number} .match $$COUNT 1{{desna zagrada}} *{{desne zagrade ({$$COUNT})}}</translation> <translation id="8158033275290782295">odaberi sve</translation> <translation id="816818801578874684">Ovo je prvi naslov. Pritisnite tipku za pretraživanje i H da biste prešli na sljedeći naslov.</translation> <translation id="8173092779156526980">Prijeđite s četiri prsta ulijevo</translation> @@ -1144,6 +1184,7 @@ <translation id="8897030325301866860">Font <ph name="FONT_FAMILY" /></translation> <translation id="8898516272131543774">Kružna izmjena odjeka interpunkcije</translation> <translation id="8908714597367957477">zglvljstpc</translation> +<translation id="8909819899961392044">.input {$$COUNT :number} .match $$COUNT 1{{lijeva vitičasta zagrada}} *{{lijeve vitičaste zagrade ({$$COUNT})}}</translation> <translation id="8910180774920883033">Dostupne su radnje. Pritisnite Pretraživanje + Ctrl + A da biste ih pregledali</translation> <translation id="8937112856099038376">intveza</translation> <translation id="8940925288729953902">Modifikatorske tipke</translation> @@ -1173,12 +1214,14 @@ <translation id="9108370397979208512">mat</translation> <translation id="9108589040018540527">klzč</translation> <translation id="9128414153595658330">dij</translation> +<translation id="9132815018758550541">.input {$$COUNT :number} .match $$COUNT 1{{uskličnik}} *{{{$$COUNT} uskličnik(a)}}</translation> <translation id="9133928141873682933">Oker</translation> <translation id="9149560530563164529">odjljk</translation> <translation id="9150735707954472829">Kartica</translation> <translation id="9151249085738989067">Automatski prebaci ChromeVoxov glas na temelju jezika</translation> <translation id="9153606228985488238">Visina glasa: <ph name="PERCENT" /> posto</translation> <translation id="9160096769946561184">Prelazak na kraj trenutačnog stupca</translation> +<translation id="916022049788356777">.input {$$COUNT :number} .match $$COUNT 1{{kosa crta}} *{{kose crte ({$$COUNT})}}</translation> <translation id="9173115498289768110">Glasnoća <ph name="PERCENT" /> posto</translation> <translation id="9185200690645120087">Vodič za ChromeVoxovo upravljanje dodirom</translation> <translation id="9192904702577636854">Pomični tekst</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sl.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sl.xtb index f2b5e3ff..7bfa75da 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sl.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_sl.xtb
@@ -32,6 +32,7 @@ <translation id="1186712907912748007">Poteka vlečenje in spuščanje. <ph name="GESTURE" />, če želite prekiniti. Druge poteze trenutno niso na voljo.</translation> <translation id="1188858454923323853">dopolnilno</translation> <translation id="1189258430971676908">Območje za vajo: Spustni seznami</translation> +<translation id="1193484659698721586">.input {$$COUNT :number} .match $$COUNT 1{{}} *{{ugnezdena raven {$$COUNT}}}</translation> <translation id="1195238899008218998">Spremna beseda</translation> <translation id="1197088940767939838">Oranžna</translation> <translation id="1198865190323699001">Poteze z dotikom</translation> @@ -100,6 +101,7 @@ <translation id="1506187449813838456">Povečanje višine tona</translation> <translation id="151784044608172266">Naslednji stavek</translation> <translation id="1524531499102321782">Braillova pisava – naslednja vrstica</translation> +<translation id="1534255288158532891">.input {$$COUNT :number} .match $$COUNT 1{{tilda}} *{{toliko tild: {$$COUNT}}}</translation> <translation id="1542513807034338907">Pomik na prejšnjo stran</translation> <translation id="1546370775711804143">Drsni trak</translation> <translation id="1551572888042734032">Poletje</translation> @@ -135,7 +137,9 @@ <translation id="1756785467854861272">Temno škrlatna</translation> <translation id="1758693804775271377">Z enim prstom povlecite v levo ali desno, če želite brskati po lekcijah za to temo.</translation> <translation id="1765245556747822181">Z enim prstom povlecite gor</translation> +<translation id="1766900865718394987">.input {$$COUNT :number} .match $$COUNT 1{{lojtra}} *{{toliko lojter: {$$COUNT}}}</translation> <translation id="1771761307086386028">Pomik desno</translation> +<translation id="1776454891300234201">.input {$$COUNT :number} .match $$COUNT 1{{kvadratna oznaka seznama}} *{{toliko kvadratnih oznak seznama: {$$COUNT}}}</translation> <translation id="1781173782405573156">Prehodna tipka</translation> <translation id="1787176709638001873">Besedilo za urejanje gesla</translation> <translation id="1795438342141780114">Ponastavitev kazalca na sredino</translation> @@ -152,6 +156,7 @@ <translation id="1902396333223336119">Celica</translation> <translation id="1903683160884433981">Srednje pomladno zelena</translation> <translation id="1905379170753160525">Prikaz seznama naslovov</translation> +<translation id="1909599030163690992">.input {$$COUNT :number} .match $$COUNT 1{{znak »&«}} *{{toliko znakov »&«: {$$COUNT}}}</translation> <translation id="1913761808037590218">#el</translation> <translation id="1914424852593176649">Velikost: <ph name="FONT_SIZE" /></translation> <translation id="1914635379910604678"><ph name="DOT" /> ukaz s preslednico</translation> @@ -159,6 +164,7 @@ <translation id="1926147969119007125">Začasno zaustavite upravljanje z obrazom</translation> <translation id="1928932365747995741">Ni prejšnjega besedilnega polja, ki ga je mogoče urejati</translation> <translation id="1964135212174907577">Naslednji predmet</translation> +<translation id="1969502304370936079">.input {$$COUNT :number} .match $$COUNT 1{{enačaj}} *{{toliko enačajev: {$$COUNT}}}</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1988733631391393183">Prikaži ukaze v braillovi pisavi v menijih ChromeVoxa</translation> <translation id="2009187674653301682">Ni nadpisano</translation> @@ -166,12 +172,14 @@ <translation id="203030071582665758">Ni prejšnjega naslova na ravni 4</translation> <translation id="2045055672832940894">Ni prejšnjega kontrolnika</translation> <translation id="2045606329038304310">Kontrolnik za polje obrazca</translation> +<translation id="2061553293808239752">.input {$$COUNT :number} .match $$COUNT 1{{minuta}} *{{min}}</translation> <translation id="2063539687800151747">Epigraf</translation> <translation id="2086961585857038472">Naslednja beseda</translation> <translation id="2087981446621639008">pod sznmopisov</translation> <translation id="2089387485033699258">sl</translation> <translation id="2091933974477985526">Prejšnje besedilno polje, ki ga je mogoče urejati</translation> <translation id="2100350898815792233">Vsa ločila</translation> +<translation id="2109693710509473741">.input {$$COUNT :number} .match $$COUNT 1{{vejica}} *{{toliko vejic: {$$COUNT}}}</translation> <translation id="2110480898214777136">Prelom vrstice od začetka do konca ali od konca do začetka znotraj strani, pogovornega okna ali drugega vsebnika</translation> <translation id="2119965627982867824">pomik</translation> <translation id="2121067395472282800">tipka za dostop: <ph name="KEY" /></translation> @@ -211,6 +219,7 @@ <translation id="2371402123699727805">Narek je aktiven. <ph name="GESTURE" />, če želite ustaviti. Druge poteze trenutno niso na voljo.</translation> <translation id="2381733276052567791">Vklop ali izklop govora</translation> <translation id="2390264819538553347">Če želite nadaljevati, pritisnite tipko Enter, če se želite vrniti, pritisnite vračalko.</translation> +<translation id="2397408693730730860">.input {$$COUNT :number} .match $$COUNT 1{{zvezdica}} *{{toliko zvezdic: {$$COUNT}}}</translation> <translation id="2398579267367951220">Vnesite, če želite iskati na strani. Pritisnite tipko Enter, če želite skočiti na rezultat, puščični tipki gor in dol, če želite brskati po rezultatih, vnašajte naprej, če želite spremeniti iskanje, ali pritisnite tipko Escape, če želite preklicati.</translation> <translation id="240709722712693803">Vijoličnomodra</translation> <translation id="2416512023405990736">Neizbrano potrditveno polje</translation> @@ -267,6 +276,7 @@ <translation id="2708078563826046398">Bleda breskova</translation> <translation id="2713444072780614174">Bela</translation> <translation id="2717271541250958000">pdzzav</translation> +<translation id="2720806141886412599">.input {$$COUNT :number} .match $$COUNT 1{{poševnica nazaj}} *{{toliko poševnic nazaj: {$$COUNT}}}</translation> <translation id="2723001399770238859">zvok</translation> <translation id="2737898226590637227">Ni naslednjega identifikatorja območja na strani ARIA</translation> <translation id="2749275490991666823">Potrjeno</translation> @@ -329,6 +339,7 @@ <translation id="3090227230165225418">Najava obvestil za prenos</translation> <translation id="3090532668523289635">skp</translation> <translation id="3093176084511590672">Naslednji mejnik</translation> +<translation id="3096276106587041702">.input {$$COUNT :number} .match $$COUNT 1{{sekunda}} *{{s}}</translation> <translation id="3096671415663099226">kpo</translation> <translation id="309749186376891736">Premik kazalca</translation> <translation id="3103579948980282461">Srednje močna vijoličastordeča</translation> @@ -367,6 +378,7 @@ <translation id="3270069636408109001">Ni naslednje tabele</translation> <translation id="3273791280096244679">Shrani oznako</translation> <translation id="3283583562490372694">ni označeno</translation> +<translation id="3284124496287403323">.input {$$COUNT :number} .match $$COUNT 1{{z {$$COUNT} elementom}} * {{s toliko elementi: {$$COUNT}}}</translation> <translation id="3286372614333682499">pokončno</translation> <translation id="3286390186030710347">Drsnik</translation> <translation id="3300733168898541351">razveljavi</translation> @@ -403,6 +415,7 @@ <translation id="3473744269398144689">Začni narek</translation> <translation id="3490765818161916458">Mreža seznamov</translation> <translation id="3494946239022273294">elmen</translation> +<translation id="3501911317648720697">.input {$$COUNT :number} .match $$COUNT 1{{dvopičje}} *{{toliko dvopičij: {$$COUNT}}}</translation> <translation id="3505359110822747654">Strnitev menije za ChromeVox</translation> <translation id="352577523970648069">Besedilno polje, ki ga je mogoče urejati</translation> <translation id="3538907380453898475">sznmopisov</translation> @@ -439,6 +452,7 @@ <translation id="3783640748446814672">alt</translation> <translation id="3783725005098956899">Prikaz dnevnika</translation> <translation id="3801735343383419236">Samodokončanje seznama</translation> +<translation id="3805994235248464699">.input {$$COUNT :number} .match $$COUNT 1{{odstotno znamenje}} *{{toliko odstotnih znamenj: {$$COUNT}}}</translation> <translation id="3806327402890551732">Premik na naslednji ali prejšnji element</translation> <translation id="3810838688059735925">Video</translation> <translation id="3813387282697781382">Svetlo koralna</translation> @@ -449,6 +463,7 @@ <translation id="3856075812838139784">Samo za branje</translation> <translation id="3857141338659865495">Srednje močna turkizna</translation> <translation id="3870295413168340326">Ni prejšnjega naslova na ravni 3</translation> +<translation id="3882892620695970398">.input {$$COUNT :number} .match $$COUNT 1{{afna}} *{{toliko afen: {$$COUNT}}}</translation> <translation id="3887399638190992181">Pomembne tipke</translation> <translation id="3887576927692165210">el</translation> <translation id="3896762831164962772">Upravljanje z obrazom je začasno zaustavljeno. <ph name="GESTURE" />, če želite nadaljevati. Druge poteze trenutno niso na voljo.</translation> @@ -479,10 +494,13 @@ <translation id="4054936709456751127">stn</translation> <translation id="4058278702844053247">Poteka nalaganje strani</translation> <translation id="4065205963140826639">Pritisnite tipko za iskanje in puščico desno, da poiščete gumb za naprej, nato pritisnite tipko za iskanje in preslednico, da ga kliknete.</translation> +<translation id="4079553331137067698">.input {$$COUNT :number} .match $$COUNT 1{{strešica}} *{{toliko strešic: {$$COUNT}}}</translation> <translation id="409334809956508737">Prejšnji predmet</translation> +<translation id="4096952912560611353">.input {$$COUNT :number} .match $$COUNT 1{{znak plus}} *{{toliko znakov plus: {$$COUNT}}}</translation> <translation id="4099274309791143834">ima podmeni</translation> <translation id="4101527861445851766">Izbrano potrditveno polje</translation> <translation id="410225014223200513">Oblikovanje ustnic v krog</translation> +<translation id="411038122342629251">.input {$$COUNT :number} .match $$COUNT 1{{pika}} 3{{tropičje}} *{{toliko pik: {$$COUNT}}}</translation> <translation id="4115378294792113321">Škrlatna</translation> <translation id="4116415223832267137">Opozorilo</translation> <translation id="4159784952369912983">Vijolična</translation> @@ -516,6 +534,7 @@ <translation id="4289540628985791613">Pregled</translation> <translation id="4294967782363273192">Naraščajoče razvrščanje</translation> <translation id="4300318234632215983">Obvestilo o URL-ju povezave</translation> +<translation id="4306112273432859778">.input {$$COUNT :number} .match $$COUNT 1{{znak »večje od«}} *{{toliko znakov »večje od«: {$$COUNT}}}</translation> <translation id="4321179778687042513">ctrl</translation> <translation id="4322625298640984693">Rjavordeča</translation> <translation id="4352022650330571548">vnesi <ph name="PHRASE" /></translation> @@ -550,12 +569,14 @@ <translation id="4547556996012970016">Naslednji naslov na ravni 5</translation> <translation id="4562381607973973258">Glava</translation> <translation id="4597532268155981612">obrazec</translation> +<translation id="4601047876198186470">.input {$$COUNT :number} .match $$COUNT 1{{znak »manjše od«}} *{{toliko znakov »manjše od«: {$$COUNT}}}</translation> <translation id="4601367666219428522">razpr <ph name="TABLENAME" /> <ph name="TABLEROWS" />x<ph name="TABLECOLS" /></translation> <translation id="4606933160360542263">Kombinacija tipk po meri: <ph name="KEY_COMBINATION" /></translation> <translation id="4615592953348396470">Prezrtje naslednjega pritiska tipke</translation> <translation id="4617384941327705512">Pametni lepljivi način je izklopljen</translation> <translation id="4623097797855662355">Kolofon</translation> <translation id="4624970070706497034">Funkcija TalkBack prilagajanja po meri za Chromebooke ne zagotavlja več. Še vedno jo lahko uporabljate, vendar uporabljajte privzete bližnjične tipke za TalkBack. Za prikaz razpoložljivih bližnjic pritisnite gumb za iskanje + A, nato K. Če še vedno želite uporabljati TalkBack, znova pritisnite tipke za ukaz.</translation> +<translation id="4636816104159717853">.input {$$COUNT :number} .match $$COUNT 1{{oznaka seznama}} *{{toliko oznak seznama: {$$COUNT}}}</translation> <translation id="4649220074413114917">Z dotikom zaslona z dvema prstoma lahko ustavite kateri koli trenutni govor. To je koristno, če ne želite, da ChromeVox kaj prebere. Če želite nadaljevati, se dotaknite zaslona z dvema prstoma.</translation> <translation id="4661075872484491155">drevo</translation> <translation id="4668929960204016307">,</translation> @@ -590,6 +611,7 @@ <translation id="4854380505292502090">Ni pripomočka za prejšnjo predstavnost</translation> <translation id="4855927945655956315">Pomembne tipke: Control</translation> <translation id="485806788160414322">Predvajanje ali začasna zaustavitev predstavnosti</translation> +<translation id="4861593489403902434">.input {$$COUNT :number} .match $$COUNT 1{{zaklepaj}} *{{toliko zaklepajev: {$$COUNT}}}</translation> <translation id="4862744964787595316">Ni krepko</translation> <translation id="4865995900839719272">premik na prejšnjo vrstico</translation> <translation id="4866956062845190338">izelmen</translation> @@ -615,6 +637,7 @@ <translation id="4993152509206108683">Hitrost: <ph name="PERCENT" /> %</translation> <translation id="4994420463726586413">Najava trenutnega stanja akumulatorja</translation> <translation id="4997282455736854877">Izbirni gumb <ph name="NAME" /> je izbran</translation> +<translation id="500303467799629809">.input {$$COUNT :number} .match $$COUNT 1{{vprašaj}} *{{toliko vprašajev: {$$COUNT}}}</translation> <translation id="5012724933919010465"><ph name="NAME" />, izbran je izbirni gumb menijskega elementa</translation> <translation id="5014131807708055994">Ni mogoče <ph name="COMMAND" />, <ph name="REASON" /></translation> <translation id="5020651427400641814">Omogočanje zapisovanja dnevnikov govora</translation> @@ -715,6 +738,7 @@ <translation id="5669637233317991674">Če se želite pomikati po tej lekciji, pritisnite tipko za iskanje + puščico desno ali tipko za iskanje + puščico levo.</translation> <translation id="5677240841070992068">Trenutna lokacija</translation> <translation id="5678161956734658133">vvel</translation> +<translation id="5678971933640285754">.input {$$COUNT :number} .match $$COUNT 1{{zaviti zaklepaj}} *{{toliko zavitih zaklepajev: {$$COUNT}}}</translation> <translation id="5681643281275621376">opr</translation> <translation id="5682113568322255809">Mejnik</translation> <translation id="5683155931978483559">Prejšnje potrditveno polje</translation> @@ -755,6 +779,7 @@ <translation id="5899860758576822363">Predvajaj pri nižji glasnosti, ko ChromeVox govori</translation> <translation id="5901630391730855834">Rumena</translation> <translation id="5906974869830879618">Vnesite kodo PIN</translation> +<translation id="5911156080308275026">.input {$$COUNT :number} .match $$COUNT 1{{podpičje}} *{{toliko podpičij: {$$COUNT}}}</translation> <translation id="5921587111466148855">Poglavje</translation> <translation id="5923780477617566089">Trenutni datum</translation> <translation id="5926889058434275234">Celoten seznam potez je v centru za pomoč.</translation> @@ -795,6 +820,7 @@ <translation id="6197361807490522975">Temno modra</translation> <translation id="6218813441317556731">zamenjava besedne zveze <ph name="DELETE_PHRASE" /> z besedno zvezo <ph name="INSERT_PHRASE" /></translation> <translation id="6236061028292614533">Naslednji naslov</translation> +<translation id="625349470169752824">.input {$$COUNT :number} .match $$COUNT 1{{navpičnica}} *{{toliko navpičnic: {$$COUNT}}}</translation> <translation id="6254901459154107917">Naslednje besedilno polje, ki ga je mogoče urejati</translation> <translation id="6259464875943891919"><ph name="TYPE" /> zaprt.</translation> <translation id="6280088282605782512">Dvakratni dotik</translation> @@ -827,6 +853,7 @@ <translation id="6493991254603208962">zmanjšanje svetlosti</translation> <translation id="6501595918865591267">Turkizna</translation> <translation id="6508059270146105198">Premik Braillove vrstice na dno strani</translation> +<translation id="6511611327412641506">.input {$$COUNT :number} .match $$COUNT 1{{oklepaj}} *{{toliko oklepajev: {$$COUNT}}}</translation> <translation id="6521550811716689390">Temno vijoličasta</translation> <translation id="6536157907112457272">Bež</translation> <translation id="6540201937398578274">V ChromeVoxu je tipka za iskanje modifikatorska tipka. Večina bližnjičnih tipk ChromeVoxa se začne s tipko za iskanje. Za pomikanje boste prav tako uporabljali puščične tipke.</translation> @@ -867,6 +894,7 @@ <translation id="6859876496651143278">Z enim prstom povlecite v levo</translation> <translation id="6865519907510167493">Napačno črkovano</translation> <translation id="6873188295213080042">Namig: Pridržite tipko za iskanje in pritisnite puščične tipke za pomikanje.</translation> +<translation id="6889949222685321250">.input {$$COUNT :number} .match $$COUNT 1{{in še {$$COUNT}}} *{{in še {$$COUNT}}}</translation> <translation id="6894148351896207544">Izgovorjava trenutne ure in datuma</translation> <translation id="6896758677409633944">Kopiraj</translation> <translation id="6897341342232909480">Pomik v levo</translation> @@ -880,6 +908,7 @@ <translation id="6951482098621102657">Ni naslednjega naslova na ravni 5</translation> <translation id="6955705049214951590">Svetlo rožnata</translation> <translation id="696356426651109308">Skok na začetek</translation> +<translation id="6978319636763404384">.input {$$COUNT :number} .match $$COUNT 1{{ura}} *{{h}}</translation> <translation id="6994042831499278539">Vnos v glosarju</translation> <translation id="6996566555547746822">Naslednje kombinirano polje</translation> <translation id="6997224546856374593">Pri branju velikih črk:</translation> @@ -888,6 +917,7 @@ <translation id="7005146664810010831">URL-ja ni mogoče najti</translation> <translation id="7026338066939101231">Pomanjšava</translation> <translation id="7031651751836475482">el szn</translation> +<translation id="7032910411301673020">.input {$$COUNT :number} .match $$COUNT 1{{bela oznaka seznama}} *{{toliko belih oznak seznama: {$$COUNT}}}</translation> <translation id="7037042857287298941">Prejšnji seznam</translation> <translation id="7039555289296502784">Olivno sivorjava</translation> <translation id="7041173719775863268">Konec izbora</translation> @@ -897,6 +927,7 @@ <translation id="7086377898680121060">povečanje svetlosti</translation> <translation id="7088743565397416204">Dvakrat se dotaknite, če želite aktivirati izbrani element</translation> <translation id="7088960765736518739">Dostop s stikalom</translation> +<translation id="7089749381037113497">.input {$$COUNT :number} .match $$COUNT 1{{podčrtaj}} *{{toliko podčrtajev: {$$COUNT}}}</translation> <translation id="7090715360595433170">Prav tako je lahko učinkoviteje kot vlečenje levo ali desno z enim prstom.</translation> <translation id="7091296112653361280">Navajo bela</translation> <translation id="7095834689119144465">Urejanje besedila – samo številke</translation> @@ -907,6 +938,7 @@ <translation id="712735679809149106">izgovarjanje besed ob vnosu</translation> <translation id="7137397390322864165">Lososova</translation> <translation id="7140168702531682811">Nadpisano</translation> +<translation id="7141256465543825898">.input {$$COUNT :number} .match $$COUNT 1{{tabulator}} *{{toliko tabulatorjev: {$$COUNT}}}</translation> <translation id="7143034430156387447">Preklop med braillovo pisavo s 6 pikami in z 8 pikami</translation> <translation id="7143207342074048698">Povezovanje</translation> <translation id="7153618581592392745">Svetlo vijolična</translation> @@ -936,6 +968,7 @@ <translation id="7289186959554153431">Naslov 3</translation> <translation id="7292195267473691167"><ph name="LOCALE" /> (<ph name="VARIANT" />)</translation> <translation id="7297440685387139507">Končajte vlečenje in spuščanje</translation> +<translation id="7307364818959876261">.input {$$COUNT :number} .match $$COUNT 1{{presledek}} *{{toliko presledkov: {$$COUNT}}}</translation> <translation id="7308519659008003150">Ni prejšnjega polja obrazca</translation> <translation id="731121099745151312">eldrv</translation> <translation id="7313717760367325059">pomoč</translation> @@ -966,6 +999,7 @@ <translation id="7543255924852002459">Oznaka za opustitev</translation> <translation id="7552432549459840808">Uporabne bližnjice za Chrome</translation> <translation id="7553679324939294712">vstavljanje besedne zveze <ph name="INSERT_PHRASE" /> pred besedno zvezo <ph name="BEFORE_PHRASE" /></translation> +<translation id="7564773684901619629">.input {$$COUNT :number} .match $$COUNT 1{{opuščaj}} *{{toliko opuščajev: {$$COUNT}}}</translation> <translation id="7569983096843329377">Črna</translation> <translation id="7579911500627256166">pika <ph name="DOT" /></translation> <translation id="7592060599656252486">Nekatera</translation> @@ -982,6 +1016,7 @@ <translation id="7637342083105831460">Če želite poiskati območje za vajo ali gumb za naslednjo lekcijo, pritisnite tipko za iskanje + puščico desno. Za aktiviranje nato pritisnite tipko za iskanje + preslednico.</translation> <translation id="7639968568612851608">Temno siva</translation> <translation id="7663318257180412551">Naslov 2</translation> +<translation id="7673144236430784711">.input {$$COUNT :number} .match $$COUNT 1{{znak za dolar}} *{{toliko znakov za dolar: {$$COUNT}}}</translation> <translation id="7674576868851035240">Naslednja povezava</translation> <translation id="7674768236845044097">oznk</translation> <translation id="7676847077928500578">Ponastavitev nastavitev pretvorbe besedila v govor</translation> @@ -991,9 +1026,11 @@ <translation id="7696631298608145306">premik na naslednjo besedo</translation> <translation id="7701040980221191251">Nič</translation> <translation id="7701196182766842984">samosez</translation> +<translation id="7708242671340939466">.input {$$COUNT :number} .match $$COUNT 1{{pomišljaj}} *{{toliko pomišljajev: {$$COUNT}}}</translation> <translation id="7714340021005120797">Ni naslednjega kombiniranega polja</translation> <translation id="7715455358521357192">Priprtje desnega očesa</translation> <translation id="7724603315864178912">Izreži</translation> +<translation id="7731002461127710752">.input {$$COUNT :number} .match $$COUNT 1{{krativec}} *{{toliko krativcev: {$$COUNT}}}</translation> <translation id="7731785449856576010">Ni pripomočka za naslednjo predstavnost</translation> <translation id="7735498529470878067">Z raziskovanjem z dotikom lahko hitro dobite občutek, kaj je na zaslonu.</translation> <translation id="773906353055481349">Pritisnite tipko za iskanje + Ctrl + Alt s puščičnimi tipkami, če se želite pomikati po celicah</translation> @@ -1010,9 +1047,11 @@ <translation id="7839679365527550018">Prejšnja beseda</translation> <translation id="7846634333498149051">Tipkovnica</translation> <translation id="7851816175263618915">Nekaj ločil</translation> +<translation id="7861676488745595432">.input {$$COUNT :number} .match $$COUNT 1{{oglati oklepaj}} *{{toliko oglatih oklepajev: {$$COUNT}}}</translation> <translation id="7871691770940645922">Navidezni bralnik braille</translation> <translation id="7882421473871500483">Rjava</translation> <translation id="78826985582142166">sldr</translation> +<translation id="7889376040363236522">.input {$$COUNT :number} .match $$COUNT 1{{narekovaj}} *{{toliko narekovajev: {$$COUNT}}}</translation> <translation id="7913106023953875143">Ni naslednjega naslova na ravni 2</translation> <translation id="7927711904086083099">Ni izbrano</translation> <translation id="7935627501098484003">Kontrolnik za čas</translation> @@ -1052,6 +1091,7 @@ <translation id="8132248161074464367">Prejšnji neveljavni element</translation> <translation id="8138880386467279117">Dotik</translation> <translation id="8146613869421949343">Zdaj boste izvedeli več o tipki za iskanje. Tipka za iskanje se uporablja skupaj z drugimi tipkami za ukaze ChromeVoxa. Tipko za iskanje najdete neposredno nad levo tipko Shift. Če želite nadaljevati, pritisnite tipko za iskanje.</translation> +<translation id="8153361283127969411">.input {$$COUNT :number} .match $$COUNT 1{{oglati zaklepaj}} *{{toliko oglatih zaklepajev: {$$COUNT}}}</translation> <translation id="8158033275290782295">izbira vseh</translation> <translation id="816818801578874684">To je prvi naslov. Pritisnite tipko za iskanje + tipko H, da odprete naslednji naslov.</translation> <translation id="8173092779156526980">S štirimi prsti povlecite v levo</translation> @@ -1144,6 +1184,7 @@ <translation id="8897030325301866860">Pisava <ph name="FONT_FAMILY" /></translation> <translation id="8898516272131543774">Kroženje med možnostmi izgovarjanja ločil</translation> <translation id="8908714597367957477">glvstp</translation> +<translation id="8909819899961392044">.input {$$COUNT :number} .match $$COUNT 1{{zaviti oklepaj}} *{{toliko zavitih oklepajev: {$$COUNT}}}</translation> <translation id="8910180774920883033">Na voljo so dejanja. Pritisnite tipko za iskanje + Ctrl + A, če si jih želite ogledati.</translation> <translation id="8937112856099038376">intpvz</translation> <translation id="8940925288729953902">Modifikacijske tipke</translation> @@ -1173,12 +1214,14 @@ <translation id="9108370397979208512">matematika</translation> <translation id="9108589040018540527">drsn</translation> <translation id="9128414153595658330">pog ok</translation> +<translation id="9132815018758550541">.input {$$COUNT :number} .match $$COUNT 1{{klicaj}} *{{toliko klicajev: {$$COUNT}}}</translation> <translation id="9133928141873682933">Rumenorjava</translation> <translation id="9149560530563164529">razd</translation> <translation id="9150735707954472829">Zavihek</translation> <translation id="9151249085738989067">Samodejni preklop glasu ChromeVoxa glede na jezik</translation> <translation id="9153606228985488238">Višina tona: <ph name="PERCENT" /> %</translation> <translation id="9160096769946561184">Pomik na konec trenutnega stolpca</translation> +<translation id="916022049788356777">.input {$$COUNT :number} .match $$COUNT 1{{poševnica}} *{{toliko poševnic: {$$COUNT}}}</translation> <translation id="9173115498289768110">Glasnost: <ph name="PERCENT" /> %</translation> <translation id="9185200690645120087">Vadnica dotikanja s ChromeVoxom</translation> <translation id="9192904702577636854">Potujoči napis</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb index e662bff..e25caf67 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_uz.xtb
@@ -32,6 +32,7 @@ <translation id="1186712907912748007">Tortib tashlanmoqda. Tugatish uchun “<ph name="GESTURE" />” ishorasini ishlating. Boshqa ishoralar vaqtincha ishlamaydi.</translation> <translation id="1188858454923323853">qo‘shimcha</translation> <translation id="1189258430971676908">Mashq hududi: Pastga ochiladigan roʻyxatlar</translation> +<translation id="1193484659698721586">.input {$$COUNT :number} .match $$COUNT 1{{}} *{{nested level {$$COUNT}}}</translation> <translation id="1195238899008218998">Xotima</translation> <translation id="1197088940767939838">Apelsinrang</translation> <translation id="1198865190323699001">Sensorli ishoralar</translation> @@ -99,6 +100,7 @@ <translation id="1506187449813838456">Harflar zichligini oshirish</translation> <translation id="151784044608172266">Keyingi gap</translation> <translation id="1524531499102321782">Keyingi qatorga o‘tish</translation> +<translation id="1534255288158532891">.input {$$COUNT :number} .match $$COUNT 1{{tilde}} *{{{$$COUNT} tildes}}</translation> <translation id="1542513807034338907">Avvalgi sahifaga varaqlash</translation> <translation id="1546370775711804143">Siljitish dastagi</translation> <translation id="1551572888042734032">Yoz</translation> @@ -134,7 +136,9 @@ <translation id="1756785467854861272">Siyohrang</translation> <translation id="1758693804775271377">Bu mavzuga oid darslarni ochish uchun bir barmoqni yon tomonlarga suring</translation> <translation id="1765245556747822181">Bitta barmoq bilan tepaga suring</translation> +<translation id="1766900865718394987">.input {$$COUNT :number} .match $$COUNT 1{{pound}} *{{{$$COUNT} pound signs}}</translation> <translation id="1771761307086386028">Oʻngga aylantirish</translation> +<translation id="1776454891300234201">.input {$$COUNT :number} .match $$COUNT 1{{square bullet}} *{{{$$COUNT} square bullets}}</translation> <translation id="1781173782405573156">Bosilishni o‘tkazib yuborish</translation> <translation id="1787176709638001873">Parol kiritish joyi</translation> <translation id="1795438342141780114">Kursorni markazga tiklash</translation> @@ -151,6 +155,7 @@ <translation id="1902396333223336119">Katakcha</translation> <translation id="1903683160884433981">Yam yashil</translation> <translation id="1905379170753160525">Sarlavhalar ro‘yxatini ko‘rsatish</translation> +<translation id="1909599030163690992">.input {$$COUNT :number} .match $$COUNT 1{{ampersand}} *{{{$$COUNT} ampersands}}</translation> <translation id="1913761808037590218">#ed</translation> <translation id="1914424852593176649">Hajmi: <ph name="FONT_SIZE" /></translation> <translation id="1914635379910604678">kombinatsiya: <ph name="DOT" /></translation> @@ -158,6 +163,7 @@ <translation id="1926147969119007125">Yuz bilan boshqarishni pauza qilish</translation> <translation id="1928932365747995741">Avvalgi tahrirlanadigan matn maydonchasi mavjud emas</translation> <translation id="1964135212174907577">Keyingi obyekt</translation> +<translation id="1969502304370936079">.input {$$COUNT :number} .match $$COUNT 1{{equal}} *{{{$$COUNT} equal signs}}</translation> <translation id="1973886230221301399">ChromeVox</translation> <translation id="1988733631391393183">ChromeVox menyusida brayl buyruqlari chiqsin</translation> <translation id="2009187674653301682">Ustki satr emas</translation> @@ -165,12 +171,14 @@ <translation id="203030071582665758">Bundan oldin boshqa 4-darajali sarlavha mavjud emas</translation> <translation id="2045055672832940894">Avvalgi boshqaruv elementi mavjud emas</translation> <translation id="2045606329038304310">Navigatsiya uchun shakl maydonchasi elementlari ishlatiladi.</translation> +<translation id="2061553293808239752">.input {$$COUNT :number} .match $$COUNT 1{{minute}} *{{minutes}}</translation> <translation id="2063539687800151747">Epigraf</translation> <translation id="2086961585857038472">Keyingi so‘z</translation> <translation id="2087981446621639008">dscrplst dtl</translation> <translation id="2089387485033699258">uz</translation> <translation id="2091933974477985526">Avvalgi matn tahrirlash qatori</translation> <translation id="2100350898815792233">Barcha tinish belgilari</translation> +<translation id="2109693710509473741">.input {$$COUNT :number} .match $$COUNT 1{{comma}} *{{{$$COUNT} commas}}</translation> <translation id="2110480898214777136">Sahifa ichida, muloqot oynasida yoki boshqa konteynerda boshidan oxiriga yoki oxiridan boshiga o‘tkazish</translation> <translation id="2119965627982867824">spnbtn</translation> <translation id="2121067395472282800">access key:<ph name="KEY" /></translation> @@ -210,6 +218,7 @@ <translation id="2371402123699727805">Ovoz bilan yozish yoniq. Toʻxtatish uchun “<ph name="GESTURE" />” ishorasini ishlating. Boshqa ishoralar vaqtincha ishlamaydi.</translation> <translation id="2381733276052567791">Ovozli bildirgilarni yoqish yoki o‘chirib qo‘yish</translation> <translation id="2390264819538553347">Davom etish uchun “Enter” tugmasini, ortga qaytish uchun esa “Backspace” tugmasini bosing.</translation> +<translation id="2397408693730730860">.input {$$COUNT :number} .match $$COUNT 1{{asterisk}} *{{{$$COUNT} asterisks}}</translation> <translation id="2398579267367951220">Sahifada qidirish uchun soʻrovni kiriting. Natijaga sakrash uchun Enter tugmasini, natijalarni qarab chiqish uchun yuqoriga yoki pastga strelkalarini bosing. Qidiruvni oʻzgartirish uchun soʻrovni kiritishda davom eting yoki bekor qilish uchun escape tugmasini bosing.</translation> <translation id="240709722712693803">Koʻkimtir siyohrang</translation> <translation id="2416512023405990736">Belgilanmagan katakcha</translation> @@ -266,6 +275,7 @@ <translation id="2708078563826046398">Pardozli yuz</translation> <translation id="2713444072780614174">Oq</translation> <translation id="2717271541250958000">tabpnl</translation> +<translation id="2720806141886412599">.input {$$COUNT :number} .match $$COUNT 1{{backslash}} *{{{$$COUNT} backslashes}}</translation> <translation id="2723001399770238859">audio</translation> <translation id="2737898226590637227">Keyingi ARIA belgisi mavjud emas</translation> <translation id="2749275490991666823">Belgilandi</translation> @@ -328,6 +338,7 @@ <translation id="3090227230165225418">Yuklanma bildirishnomalari xabar qilinsin</translation> <translation id="3090532668523289635">grp</translation> <translation id="3093176084511590672">Keyingi mo‘ljal</translation> +<translation id="3096276106587041702">.input {$$COUNT :number} .match $$COUNT 1{{second}} *{{seconds}}</translation> <translation id="3096671415663099226">cbo</translation> <translation id="309749186376891736">Kursorni surish</translation> <translation id="3103579948980282461">Toʻq pushti</translation> @@ -366,6 +377,7 @@ <translation id="3270069636408109001">Bundan keyin boshqa jadval mavjud emas</translation> <translation id="3273791280096244679">Yorliqni saqlash</translation> <translation id="3283583562490372694">belgilanmagan</translation> +<translation id="3284124496287403323">.input {$$COUNT :number} .match $$COUNT 1{{with {$$COUNT} item}} * {{with {$$COUNT} items}}</translation> <translation id="3286372614333682499">tik</translation> <translation id="3286390186030710347">Slayder</translation> <translation id="3300733168898541351">bekor qilish</translation> @@ -402,6 +414,7 @@ <translation id="3473744269398144689">Ovoz bilan yozishni boshlash</translation> <translation id="3490765818161916458">ListGrid elementi</translation> <translation id="3494946239022273294">mnuitm</translation> +<translation id="3501911317648720697">.input {$$COUNT :number} .match $$COUNT 1{{colon}} *{{{$$COUNT} colons}}</translation> <translation id="3505359110822747654">ChromeVox menyularini yigʻish</translation> <translation id="352577523970648069">Tahrirlanadigan matn</translation> <translation id="3538907380453898475">dscrplst</translation> @@ -438,6 +451,7 @@ <translation id="3783640748446814672">alt</translation> <translation id="3783725005098956899">Jurnalni ochish</translation> <translation id="3801735343383419236">Avtomatik to‘ldirish ro‘yxati</translation> +<translation id="3805994235248464699">.input {$$COUNT :number} .match $$COUNT 1{{percent}} *{{{$$COUNT} percent signs}}</translation> <translation id="3806327402890551732">Keyingi yoki avvalgi elementga oʻtish</translation> <translation id="3810838688059735925">Video</translation> <translation id="3813387282697781382">Och marjonrang</translation> @@ -448,6 +462,7 @@ <translation id="3856075812838139784">Faqat o‘qish</translation> <translation id="3857141338659865495">Feruzarangli</translation> <translation id="3870295413168340326">Bundan oldin boshqa 4-darajali sarlavha mavjud emas</translation> +<translation id="3882892620695970398">.input {$$COUNT :number} .match $$COUNT 1{{at}} *{{{$$COUNT} at signs}}</translation> <translation id="3887399638190992181">Asosiy tugmalar</translation> <translation id="3887576927692165210">ed</translation> <translation id="3896762831164962772">Yuz bilan boshqarish pauzada. Davom ettirish uchun “<ph name="GESTURE" />” ishorasini ishlating. Boshqa ishoralar vaqtincha ishlamaydi.</translation> @@ -478,10 +493,13 @@ <translation id="4054936709456751127">sts</translation> <translation id="4058278702844053247">Sahifa yuklanmoqda</translation> <translation id="4065205963140826639">“Next” tugmasini topish uchun “Search + O‘ngga strelka” tugmalaridan foydalaning, keyin esa “Search + Bo‘shliq” tugmalari yordamida ustiga bosing.</translation> +<translation id="4079553331137067698">.input {$$COUNT :number} .match $$COUNT 1{{caret}} *{{{$$COUNT} carets}}</translation> <translation id="409334809956508737">Avvalgi obyekt</translation> +<translation id="4096952912560611353">.input {$$COUNT :number} .match $$COUNT 1{{plus}} *{{{$$COUNT} plus signs}}</translation> <translation id="4099274309791143834">quyi menyusi bor</translation> <translation id="4101527861445851766">Belgilangan katakcha</translation> <translation id="410225014223200513">Ogʻizni "O" deb oching</translation> +<translation id="411038122342629251">.input {$$COUNT :number} .match $$COUNT 1{{dot}} 3{{ellipsis}} *{{{$$COUNT} dots}}</translation> <translation id="4115378294792113321">Siyohrang</translation> <translation id="4116415223832267137">Ogohlantirish</translation> <translation id="4159784952369912983">Siyohrang</translation> @@ -515,6 +533,7 @@ <translation id="4289540628985791613">Umumiy</translation> <translation id="4294967782363273192">Boshidan tartiblash</translation> <translation id="4300318234632215983">Havoladan keyingi URL manzilni e’lon qilish</translation> +<translation id="4306112273432859778">.input {$$COUNT :number} .match $$COUNT 1{{greater than}} *{{{$$COUNT} greater than signs}}</translation> <translation id="4321179778687042513">ctrl</translation> <translation id="4322625298640984693">Toʻq zangrang</translation> <translation id="4352022650330571548"><ph name="PHRASE" /> deb yozing</translation> @@ -549,12 +568,14 @@ <translation id="4547556996012970016">Keyingi 5-darajali sarlavha</translation> <translation id="4562381607973973258">Sarlavha</translation> <translation id="4597532268155981612">shakl</translation> +<translation id="4601047876198186470">.input {$$COUNT :number} .match $$COUNT 1{{less than}} *{{{$$COUNT} less than signs}}</translation> <translation id="4601367666219428522">jdv <ph name="TABLENAME" /> <ph name="TABLEROWS" />x<ph name="TABLECOLS" /></translation> <translation id="4606933160360542263">Maxsus tugmalar birikmasi: <ph name="KEY_COMBINATION" /></translation> <translation id="4615592953348396470">Keyingi tugmalar bosilishini o‘tkazib yuborish</translation> <translation id="4617384941327705512">Smart yopishqoq rejim oʻchiq</translation> <translation id="4623097797855662355">Nashriyot ramzi</translation> <translation id="4624970070706497034">TalkBack endi Chromebook qurilmalarini sozlamaydi. Undan foydalanishingiz mumkin, lekin TalkBack standart klaviatura tugmalaridan foydalaning. Mavjud tugmalarni koʻrish uchun avval Search+A, keyin esa K tugmasini bosing. Hali ham TalkBack ishlatishni istasangiz, buyruq ustiga yana bir marta bosing.</translation> +<translation id="4636816104159717853">.input {$$COUNT :number} .match $$COUNT 1{{bullet}} *{{{$$COUNT} bullets}}</translation> <translation id="4649220074413114917">Ekranni ikkita barmoq bilan bosish orqali joriy qidiruvni bekor qilish mumkin. Bu ChromeVox biror nimani oʻqimasligi kerak boʻlganda qulay. Davom etish uchun ekranni ikkita barmoq bilan bosing.</translation> <translation id="4661075872484491155">daraxt</translation> <translation id="4668929960204016307">,</translation> @@ -589,6 +610,7 @@ <translation id="4854380505292502090">Avvalgi media vidjet mavjud emas</translation> <translation id="4855927945655956315">Asosiy tugmalar: Control</translation> <translation id="485806788160414322">Media ijrosi yoki pauza</translation> +<translation id="4861593489403902434">.input {$$COUNT :number} .match $$COUNT 1{{close paren}} *{{{$$COUNT} close parens}}</translation> <translation id="4862744964787595316">Qalin emas</translation> <translation id="4865995900839719272">avvalgi qatorga oʻtish</translation> <translation id="4866956062845190338">rdmnuitm</translation> @@ -614,6 +636,7 @@ <translation id="4993152509206108683">Nutq tezligi: <ph name="PERCENT" />%</translation> <translation id="4994420463726586413">Batareyaning joriy holati aytilsin</translation> <translation id="4997282455736854877">“<ph name="NAME" />” tanlash tugmasi belgilandi</translation> +<translation id="500303467799629809">.input {$$COUNT :number} .match $$COUNT 1{{question mark}} *{{{$$COUNT} question marks}}</translation> <translation id="5012724933919010465"><ph name="NAME" />, menyu elementi (radio tugma) tanlandi</translation> <translation id="5014131807708055994"><ph name="COMMAND" /> imkonsiz, <ph name="REASON" /></translation> <translation id="5020651427400641814">Ovozlar jurnalini yoqish</translation> @@ -714,6 +737,7 @@ <translation id="5669637233317991674">Dars bilan tanishish uchun Qidiruv + Oʻngga yoki Qidiruv + Chapga strelkasini bosing</translation> <translation id="5677240841070992068">Hozirgi joy</translation> <translation id="5678161956734658133">mled</translation> +<translation id="5678971933640285754">.input {$$COUNT :number} .match $$COUNT 1{{right brace}} *{{{$$COUNT} right braces}}</translation> <translation id="5681643281275621376">def</translation> <translation id="5682113568322255809">Mo‘ljal</translation> <translation id="5683155931978483559">Avvalgi belgilash katakchasi</translation> @@ -754,6 +778,7 @@ <translation id="5899860758576822363">ChromeVox ekrandan o‘qiyotganda ovoz pasaytirilsin</translation> <translation id="5901630391730855834">Sariq</translation> <translation id="5906974869830879618">PIN kodni kiriting</translation> +<translation id="5911156080308275026">.input {$$COUNT :number} .match $$COUNT 1{{semicolon}} *{{{$$COUNT} semicolons}}</translation> <translation id="5921587111466148855">Bob</translation> <translation id="5923780477617566089">Joriy sana</translation> <translation id="5926889058434275234">Ishoralarning toʻliq roʻyxatini yordam markazidan topish mumkin.</translation> @@ -794,6 +819,7 @@ <translation id="6197361807490522975">Toʻq moviy</translation> <translation id="6218813441317556731"><ph name="DELETE_PHRASE" /> iborasini <ph name="INSERT_PHRASE" />ga almashtirish</translation> <translation id="6236061028292614533">Keyingi sarlavha</translation> +<translation id="625349470169752824">.input {$$COUNT :number} .match $$COUNT 1{{pipe}} *{{{$$COUNT} vertical pipes}}</translation> <translation id="6254901459154107917">Keyingi matn tahrirlash qatori</translation> <translation id="6259464875943891919"><ph name="TYPE" /> konteyneridan chiqish.</translation> <translation id="6280088282605782512">Ikki marta tegining</translation> @@ -826,6 +852,7 @@ <translation id="6493991254603208962">Yorqinlikni pasaytirish</translation> <translation id="6501595918865591267">Feruzarang</translation> <translation id="6508059270146105198">Breyl ekranini sahifa tepasiga joylash</translation> +<translation id="6511611327412641506">.input {$$COUNT :number} .match $$COUNT 1{{open paren}} *{{{$$COUNT} open parens}}</translation> <translation id="6521550811716689390">Toʻq siyohrang</translation> <translation id="6536157907112457272">Durrarang</translation> <translation id="6540201937398578274">ChromeVox funksiyasida “Search” tugmasi modifikator tugma hisoblanadi. Ko‘plab ChromeVox tezkor tugmalari “Search” tugmasi bilan boshlanadi. Shuningdek strelka tugmalari navigatsiya amallarini bajarishda foydalaniladi.</translation> @@ -866,6 +893,7 @@ <translation id="6859876496651143278">Bitta barmoq bilan chapga suring</translation> <translation id="6865519907510167493">imloviy xato</translation> <translation id="6873188295213080042">Maslahat: Oʻtish uchun Qidiruv tugmasini bosib turib, strelka tugmalarini bosing.</translation> +<translation id="6889949222685321250">.input {$$COUNT :number} .match $$COUNT 1{{+{$$COUNT}}} *{{+{$$COUNT}}}</translation> <translation id="6894148351896207544">Hozirgi sana va vaqt aytilsin</translation> <translation id="6896758677409633944">Nusxa olish</translation> <translation id="6897341342232909480">Chapga ko‘chirish</translation> @@ -879,6 +907,7 @@ <translation id="6951482098621102657">Bundan keyin boshqa 2-darajali sarlavha mavjud emas</translation> <translation id="6955705049214951590">Iliq yuzrang</translation> <translation id="696356426651109308">Boshiga borish</translation> +<translation id="6978319636763404384">.input {$$COUNT :number} .match $$COUNT 1{{hour}} *{{hours}}</translation> <translation id="6994042831499278539">Lug‘at havolasi</translation> <translation id="6996566555547746822">Keyingi ro‘yxatli maydon</translation> <translation id="6997224546856374593">Katta harflarni oʻqish vaqtida:</translation> @@ -887,6 +916,7 @@ <translation id="7005146664810010831">URL manzil topilmadi</translation> <translation id="7026338066939101231">Kamaytirish</translation> <translation id="7031651751836475482">lstitm</translation> +<translation id="7032910411301673020">.input {$$COUNT :number} .match $$COUNT 1{{white bullet}} *{{{$$COUNT} white bullets}}</translation> <translation id="7037042857287298941">Avvalgi ro‘yxat</translation> <translation id="7039555289296502784">Yashil bargrang</translation> <translation id="7041173719775863268">Belgilanildi</translation> @@ -896,6 +926,7 @@ <translation id="7086377898680121060">Yorqinlikni ko‘tarish</translation> <translation id="7088743565397416204">Tanlangan elementni ikki marta bosib faollashtiring</translation> <translation id="7088960765736518739">Switch Access</translation> +<translation id="7089749381037113497">.input {$$COUNT :number} .match $$COUNT 1{{underscore}} *{{{$$COUNT} underscores}}</translation> <translation id="7090715360595433170">Bu bir barmoq bilan yon tomonlarga surishdan qulayroq boʻlishi mumkin.</translation> <translation id="7091296112653361280">Terirang</translation> <translation id="7095834689119144465">Matn tahriri: faqat sonlar</translation> @@ -906,6 +937,7 @@ <translation id="712735679809149106">so‘zlarning aytilishi</translation> <translation id="7137397390322864165">Qizgʻish</translation> <translation id="7140168702531682811">Ustki satr</translation> +<translation id="7141256465543825898">.input {$$COUNT :number} .match $$COUNT 1{{tab}} *{{{$$COUNT} tabs}}</translation> <translation id="7143034430156387447">6 yoki 8 nuqtali yozuvlar o‘rtasida almashish</translation> <translation id="7143207342074048698">Ulanmoqda</translation> <translation id="7153618581592392745">Och siyohrang</translation> @@ -935,6 +967,7 @@ <translation id="7289186959554153431">3-darajali sarlavha</translation> <translation id="7292195267473691167"><ph name="LOCALE" /> (<ph name="VARIANT" />)</translation> <translation id="7297440685387139507">Tortib tashlashni yakunlash</translation> +<translation id="7307364818959876261">.input {$$COUNT :number} .match $$COUNT 1{{space}} *{{{$$COUNT} spaces}}</translation> <translation id="7308519659008003150">Avvalgi shakl maydoni mavjud emas</translation> <translation id="731121099745151312">tritm</translation> <translation id="7313717760367325059">yordam</translation> @@ -965,6 +998,7 @@ <translation id="7543255924852002459">“Bekor qilish” tugmasi</translation> <translation id="7552432549459840808">Foydali Chrome tezkor tugmalari</translation> <translation id="7553679324939294712"><ph name="INSERT_PHRASE" /> iborasini <ph name="BEFORE_PHRASE" /> dan avval joylash</translation> +<translation id="7564773684901619629">.input {$$COUNT :number} .match $$COUNT 1{{apostrophe}} *{{{$$COUNT} apostrophes}}</translation> <translation id="7569983096843329377">Qora</translation> <translation id="7579911500627256166">nuqta <ph name="DOT" /></translation> <translation id="7592060599656252486">Ayrimlar</translation> @@ -981,6 +1015,7 @@ <translation id="7637342083105831460">Mashq hududini yoki keyingi dars tugmasini topish uchun Qidiruv + Oʻngga strelkasini bosing. Keyin esa faollashtirish uchun Qidiruv + Boʻsh joy tugmalarini bosing.</translation> <translation id="7639968568612851608">Toʻq kulrang</translation> <translation id="7663318257180412551">Sarlavha 2</translation> +<translation id="7673144236430784711">.input {$$COUNT :number} .match $$COUNT 1{{dollar}} *{{{$$COUNT} dollar signs}}</translation> <translation id="7674576868851035240">Keyingi havola</translation> <translation id="7674768236845044097">mark</translation> <translation id="7676847077928500578">Nutq sintezatori sozlamalarini asliga qaytarish</translation> @@ -990,9 +1025,11 @@ <translation id="7696631298608145306">keyingi soʻzga oʻtish</translation> <translation id="7701040980221191251">Hech qanday</translation> <translation id="7701196182766842984">autolst</translation> +<translation id="7708242671340939466">.input {$$COUNT :number} .match $$COUNT 1{{dash}} *{{{$$COUNT} dashes}}</translation> <translation id="7714340021005120797">Keyingi kombinatsiyalangan roʻyxat mavjud emas</translation> <translation id="7715455358521357192">Oʻng koʻzni yuming</translation> <translation id="7724603315864178912">Qirqish</translation> +<translation id="7731002461127710752">.input {$$COUNT :number} .match $$COUNT 1{{backtick}} *{{{$$COUNT} backticks}}</translation> <translation id="7731785449856576010">Keyingi media vidjeti mavjud emas.</translation> <translation id="7735498529470878067">Teginib oʻrganish funksiyasi ekrandagi elementlarni tez aniqlash imkonini beradi.</translation> <translation id="773906353055481349">Katakka oʻtish uchun Search+Ctrl+Alt bilan birga strelkalardan foydalaning</translation> @@ -1009,9 +1046,11 @@ <translation id="7839679365527550018">Avvalgi so‘z</translation> <translation id="7846634333498149051">Klaviatura</translation> <translation id="7851816175263618915">Ba’zi tinish belgilari</translation> +<translation id="7861676488745595432">.input {$$COUNT :number} .match $$COUNT 1{{left bracket}} *{{{$$COUNT} left brackets}}</translation> <translation id="7871691770940645922">Virtual brayl ekrani</translation> <translation id="7882421473871500483">Jigarrang</translation> <translation id="78826985582142166">sldr</translation> +<translation id="7889376040363236522">.input {$$COUNT :number} .match $$COUNT 1{{quote}} *{{{$$COUNT} quotes}}</translation> <translation id="7913106023953875143">Bundan keyin boshqa 2-darajali sarlavha mavjud emas</translation> <translation id="7927711904086083099">Tanlanmagan</translation> <translation id="7935627501098484003">Vaqt nazorati</translation> @@ -1051,6 +1090,7 @@ <translation id="8132248161074464367">Avvalgi yaroqsiz element</translation> <translation id="8138880386467279117">Teginish</translation> <translation id="8146613869421949343">Endi esa Qidiruv tugmasini oʻrganasiz. Qdiiruv tugmasi ChromeVox buyruqlari uchun boshqa tugmalari bilgan birga ishlatish uchun foydalaniladi. Qidiruv tugmasi chap Shift tugmasi ustida joylashgan. Davom etish uchun Qidiruv tugmasini bosing.</translation> +<translation id="8153361283127969411">.input {$$COUNT :number} .match $$COUNT 1{{right bracket}} *{{{$$COUNT} right brackets}}</translation> <translation id="8158033275290782295">hammasini tanlash</translation> <translation id="816818801578874684">Bu birinchi sarlavha. Keyingi sarlavhaga oʻtish uchun Qidiruv + H tugmalarini bosing.</translation> <translation id="8173092779156526980">Toʻrtta barmoq bilan chapga suring</translation> @@ -1143,6 +1183,7 @@ <translation id="8897030325301866860"><ph name="FONT_FAMILY" /> shrifti</translation> <translation id="8898516272131543774">Imloni qayta e’lon qilish</translation> <translation id="8908714597367957477">colhdr</translation> +<translation id="8909819899961392044">.input {$$COUNT :number} .match $$COUNT 1{{left brace}} *{{{$$COUNT} left braces}}</translation> <translation id="8910180774920883033">Mavjud amallar. Koʻrish uchun Qidiruv+Ctrl+A tugmalarini bosing</translation> <translation id="8937112856099038376">intlnk</translation> <translation id="8940925288729953902">O‘zgartirish tugmalari</translation> @@ -1172,12 +1213,14 @@ <translation id="9108370397979208512">math</translation> <translation id="9108589040018540527">scbr</translation> <translation id="9128414153595658330">dlg</translation> +<translation id="9132815018758550541">.input {$$COUNT :number} .match $$COUNT 1{{exclamation}} *{{{$$COUNT} exclamations}}</translation> <translation id="9133928141873682933">Xaki</translation> <translation id="9149560530563164529">sctn</translation> <translation id="9150735707954472829">Varaq</translation> <translation id="9151249085738989067">ChromeVox ovozining tilini avtomatik almashtirish</translation> <translation id="9153606228985488238">Ovoz balandligi: <ph name="PERCENT" /></translation> <translation id="9160096769946561184">Joriy ustun oxiri</translation> +<translation id="916022049788356777">.input {$$COUNT :number} .match $$COUNT 1{{slash}} *{{{$$COUNT} slashes}}</translation> <translation id="9173115498289768110">Tovush balandligi: <ph name="PERCENT" />%</translation> <translation id="9185200690645120087">ChromeVoxda teginish darsi</translation> <translation id="9192904702577636854">Yuguruvchi qator</translation>
diff --git a/chrome/browser/resources/chromeos/floating_workspace/BUILD.gn b/chrome/browser/resources/chromeos/floating_workspace/BUILD.gn index c20ebf1..0eafae5b 100644 --- a/chrome/browser/resources/chromeos/floating_workspace/BUILD.gn +++ b/chrome/browser/resources/chromeos/floating_workspace/BUILD.gn
@@ -13,6 +13,7 @@ ts_definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ] ts_deps = [ + "//ash/webui/common/resources:build_ts", "//ash/webui/common/resources/cr_elements:build_ts", "//chrome/browser/resources/chromeos/login:build_ts", "//third_party/cros-components:cros_components_ts",
diff --git a/chrome/browser/resources/chromeos/floating_workspace/app.html b/chrome/browser/resources/chromeos/floating_workspace/app.html index 8939c2573..836231e 100644 --- a/chrome/browser/resources/chromeos/floating_workspace/app.html +++ b/chrome/browser/resources/chromeos/floating_workspace/app.html
@@ -5,34 +5,82 @@ --> <style include="oobe-dialog-host-styles"> - #floatingDialog { - width: 100%; - height: 100%; + #defaultDialog { background-color: var(--cros-sys-app_base_shaded); } #checkingAnimation { max-height: 90%; } + + #networkErrorDialog { + background-color: var(--cros-sys-app_base_shaded); + } + + #generalErrorDialog { + background-color: var(--cros-sys-app_base_shaded); + } </style> -<oobe-adaptive-dialog id="floatingDialog" - tabindex="0" aria-live="polite" footer-shrinkable> +<oobe-adaptive-dialog id="defaultDialog" +aria-live="polite" footer-shrinkable> <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> <h1 slot="title"> - [[titleString]] + [[defaultDialogTitleString]] </h1> <paper-progress slot="progress" id="checking-progress" indeterminate> </paper-progress> <div slot="content" class="flex layout vertical center-justified center"> <oobe-cr-lottie id="checkingAnimation" - animation-url="animations/checking_for_update.json" playing=true> + animation-url="animations/checking_for_update.json"> </oobe-cr-lottie> </div> - <div slot="bottom-buttons"> <oobe-text-button id="cancelButton" on-click="onCancelButtonClick_" text-key="floatingWorkspaceStartupDialogButton" border> </oobe-text-button> </div> +</oobe-adaptive-dialog> + +<oobe-adaptive-dialog id="networkErrorDialog" +aria-live="polite" footer-shrinkable> + <iron-icon slot="icon" icon="oobe-32:wifi"></iron-icon> + <h1 slot="title"> + $i18n{floatingWorkspaceNetworkDialogTitle} + </h1> + <div slot="subtitle"> + $i18n{floatingWorkspaceNetworkDialogSubtitle} + </div> + <div slot="content" class="flex layout vertical"> + <network-select on-network-item-selected="onNetworkItemSelected" + on-custom-item-selected="onCustomItemSelected" + custom-items="[[getNetworkCustomItems()]]"> + </network-select> + </div> + <div slot="bottom-buttons"> + <oobe-text-button id="cancelButton" on-click="onCancelButtonClick_" + text-key="floatingWorkspaceStartupDialogButton" border> + </oobe-text-button> + </div> +</oobe-adaptive-dialog> + +<oobe-adaptive-dialog id="generalErrorDialog" +aria-live="polite" footer-shrinkable> + <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> + <h1 slot="title"> + $i18n{floatingWorkspaceErrorDialogTitle} + </h1> + <div slot="subtitle"> + $i18n{floatingWorkspaceErrorDialogSubtitle} + </div> + <div slot="content" class="flex layout vertical center center-justified"> + <iron-icon icon="oobe-illos:error-illo" class="illustration-jelly"> + </iron-icon> + </div> + <div slot="bottom-buttons"> + <oobe-text-button id="cancelButton" on-click="onCancelButtonClick_" + text-key="floatingWorkspaceErrorDialogButton" class="focus-on-show" + border> + </oobe-text-button> + </div> </oobe-adaptive-dialog> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/floating_workspace/app.ts b/chrome/browser/resources/chromeos/floating_workspace/app.ts index 17459d40..05bfdaa 100644 --- a/chrome/browser/resources/chromeos/floating_workspace/app.ts +++ b/chrome/browser/resources/chromeos/floating_workspace/app.ts
@@ -6,20 +6,39 @@ import '//resources/polymer/v3_0/paper-progress/paper-progress.js'; import '/components/oobe_cr_lottie.js'; import '/components/oobe_icons.html.js'; +import '/components/oobe_illo_icons.html.js'; +import '/components/oobe_network_icons.html.js'; import '/components/common_styles/oobe_dialog_host_styles.css.js'; import '/components/dialogs/oobe_adaptive_dialog.js'; +import '/components/buttons/oobe_text_button.js'; +import 'chrome://resources/ash/common/network/network_select.js'; +import {NetworkList} from '//resources/ash/common/network/network_list_types.js'; +import {$} from '//resources/ash/common/util.js'; import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import type {OobeAdaptiveDialog} from '/components/dialogs/oobe_adaptive_dialog.js'; +import {OobeCrLottie} from '/components/oobe_cr_lottie.js'; import {I18nMixin} from 'chrome://resources/ash/common/cr_elements/i18n_mixin.js'; +import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js'; +import type {CrosNetworkConfigRemote} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; +import {CrosNetworkConfig, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js'; import {getTemplate} from './app.html.js'; const EXPECTED_LOAD_TIME_MILLISEC = 5000; +interface NetworkCustomItem { + customItemType: NetworkList.CustomItemType; + customItemName: string; + polymerIcon: string; + showBeforeNetworksList: boolean; +} + export interface FloatingWorkspace { $: { - floatingDialog: OobeAdaptiveDialog, + defaultDialog: OobeAdaptiveDialog, + networkErrorDialog: OobeAdaptiveDialog, + generalErrorDialog: OobeAdaptiveDialog }; } @@ -34,14 +53,17 @@ return getTemplate(); } - // Main string of the dialog. It is changed after - // EXPECTED_LOAD_TIME_MILLISEC of time. - private titleString: string|''; + private networkConfig: CrosNetworkConfigRemote = + CrosNetworkConfig.getRemote(); + // Main string of the default dialog. It is expected to change after + // EXPECTED_LOAD_TIME_MILLISEC of time. + private defaultDialogTitleString: string; constructor() { super(); - this.titleString = this.i18n('floatingWorkspaceStartupDialogTitle'); + this.defaultDialogTitleString = + this.i18n('floatingWorkspaceStartupDialogTitle'); } override ready(): void { @@ -58,15 +80,44 @@ }); this.onWindowResolutionChange_(); - // Change title when floating workspace takes too long. - setTimeout(this.onNoResponse.bind(this), EXPECTED_LOAD_TIME_MILLISEC); - this.$.floatingDialog.onBeforeShow(); - this.$.floatingDialog.show(); + // This would open one of the 3 screens depending on the state + // provided in the message handler. + chrome.send('initialize'); } - private onNoResponse(): void { - this.titleString = - this.i18n('floatingWorkspaceStartupDialogLongResponseTitle'); + showDefaultScreen(): void { + this.hideAllScreens(); + this.$.defaultDialog.hidden = false; + + this.defaultDialogTitleString = + this.i18n('floatingWorkspaceStartupDialogTitle'); + // Change title when floating workspace takes too long. + setTimeout(this.onNoResponse.bind(this), EXPECTED_LOAD_TIME_MILLISEC); + this.$.defaultDialog.onBeforeShow(); + this.$.defaultDialog.show(); + this.playAnimation(); + } + + showNetworkScreen(): void { + this.hideAllScreens(); + this.$.networkErrorDialog.hidden = false; + + this.$.networkErrorDialog.onBeforeShow(); + this.$.networkErrorDialog.show(); + } + + showErrorScreen(): void { + this.hideAllScreens(); + this.$.generalErrorDialog.hidden = false; + + this.$.generalErrorDialog.onBeforeShow(); + this.$.generalErrorDialog.show(); + } + + private hideAllScreens(): void { + this.$.networkErrorDialog.hidden = true; + this.$.defaultDialog.hidden = true; + this.$.generalErrorDialog.hidden = true; } private onWindowResolutionChange_(): void { @@ -83,9 +134,56 @@ } } + // Responsible for "Add WiFi" button. + private getNetworkCustomItems(): NetworkCustomItem[] { + return [{ + customItemType: NetworkList.CustomItemType.OOBE, + customItemName: 'addWiFiListItemName', + polymerIcon: 'oobe-network-20:add-wifi', + showBeforeNetworksList: false, + }]; + } + + private onNetworkItemSelected( + event: CustomEvent<OncMojo.NetworkStateProperties>) { + const networkState = event.detail; + // If the network is already connected, show network details. + if (OncMojo.connectionStateIsConnected(networkState.connectionState)) { + chrome.send('showNetworkDetails', [networkState.guid]); + return; + } + // If the network is not connectable, show a configuration dialog. + if (networkState.connectable === false || networkState.errorState) { + chrome.send('showNetworkConfig', [networkState.guid]); + return; + } + // Otherwise, connect. + this.networkConfig.startConnect(networkState.guid).then(response => { + if (response.result === StartConnectResult.kSuccess) { + return; + } + chrome.send('showNetworkConfig', [networkState.guid]); + }); + } + private onCustomItemSelected(event: CustomEvent<{customData: string}>) { + chrome.send('addNetwork', [event.detail.customData]); + } + + private onNoResponse(): void { + this.defaultDialogTitleString = + this.i18n('floatingWorkspaceStartupDialogLongResponseTitle'); + } + private onCancelButtonClick_(): void { chrome.send('dialogClose', ['stopRestoringSession']); } + + private playAnimation(): void { + const animation = this.shadowRoot?.querySelector('#checkingAnimation'); + if (animation instanceof OobeCrLottie) { + animation.playing = true; + } + } } declare global { @@ -93,5 +191,12 @@ [FloatingWorkspace.is]: FloatingWorkspace; } } - +function initialize() { + // '$(id)' is an alias for 'document.getElementById(id)'. It is defined + // in chrome://resources/ash/common/util.js. If this function is not exposed + // via the global object, it would not be available to tests that inject + // JavaScript directly into the renderer. + (window as any).$ = $; +} customElements.define(FloatingWorkspace.is, FloatingWorkspace); +initialize();
diff --git a/chrome/browser/resources/chromeos/floating_workspace/floating_workspace.html b/chrome/browser/resources/chromeos/floating_workspace/floating_workspace.html index 0e0874b..ba18122 100644 --- a/chrome/browser/resources/chromeos/floating_workspace/floating_workspace.html +++ b/chrome/browser/resources/chromeos/floating_workspace/floating_workspace.html
@@ -7,11 +7,13 @@ <title></title> <link rel="stylesheet" href="chrome://theme/colors.css?sets=sys"> <link rel="stylesheet" href="chrome://theme/typography.css"> + <link rel="stylesheet" href="chrome://resources/css/text_defaults.css"> + <link rel="stylesheet" href="chrome://resources/chromeos/colors/cros_styles.css"> <link rel="stylesheet" href="./oobe.css"> </head> <body class="jelly-enabled"> - <floating-workspace></floating-workspace> + <floating-workspace id="floating-workspace-dialog"></floating-workspace> <script type="module" src="app.js"></script> </body> </html> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/nearby_share/nearby_discovery_page.ts b/chrome/browser/resources/chromeos/nearby_share/nearby_discovery_page.ts index 5c2fe4e7c8..2d2a4ae 100644 --- a/chrome/browser/resources/chromeos/nearby_share/nearby_discovery_page.ts +++ b/chrome/browser/resources/chromeos/nearby_share/nearby_discovery_page.ts
@@ -94,8 +94,6 @@ /** * A list of all discovered nearby self-share targets. - * Used only if isSelfShareEnabled is true, otherwise only |shareTargets_| - * is used. */ selfShareTargets_: { type: Array, @@ -104,8 +102,6 @@ /** * A list of all discovered nearby non-self-share targets. - * Used only if isSelfShareEnabled is true, otherwise only |shareTargets_| - * is used. */ nonSelfShareTargets_: { type: Array,
diff --git a/chrome/browser/resources/glic/fre/BUILD.gn b/chrome/browser/resources/glic/fre/BUILD.gn index 71d2a483..0e9c5ed 100644 --- a/chrome/browser/resources/glic/fre/BUILD.gn +++ b/chrome/browser/resources/glic/fre/BUILD.gn
@@ -27,7 +27,7 @@ "//ui/webui/resources/mojo:build_ts", ] - mojo_files_deps = [ "//chrome/browser/glic:mojo_bindings_ts__generator" ] + mojo_files_deps = [ "//chrome/browser/glic/fre:mojo_bindings_ts__generator" ] mojo_files = [ "$root_gen_dir/chrome/browser/glic/fre/glic_fre.mojom-webui.ts" ]
diff --git a/chrome/browser/resources/side_panel/bookmarks/bookmarks_api_proxy.ts b/chrome/browser/resources/side_panel/bookmarks/bookmarks_api_proxy.ts index 061ebc4..8fc4696 100644 --- a/chrome/browser/resources/side_panel/bookmarks/bookmarks_api_proxy.ts +++ b/chrome/browser/resources/side_panel/bookmarks/bookmarks_api_proxy.ts
@@ -19,7 +19,6 @@ showUi(): void; getAllBookmarks(): Promise<{nodes: BookmarksTreeNode[]}>; getActiveUrl(): Promise<string|undefined>; - isActiveTabInSplit(): Promise<{isSplit: boolean}>; // Side Panel display choices. setSortOrder(sortOrder: SortOrder): void; @@ -166,12 +165,6 @@ }); } - // TODO(crbug.com/406794014): Use the extensions API for this once - // implemented. - isActiveTabInSplit() { - return this.handler.isActiveTabInSplit(); - } - openBookmark( id: string, depth: number, clickModifiers: ClickModifiers, source: ActionSource) {
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.html index 537cdf84..d0fb073 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.html +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.html
@@ -12,8 +12,7 @@ <cr-action-menu id="menu" on-mousedown="onMousedown_"> <template is="dom-repeat" items="[[getMenuItemsForBookmarks_( - bookmarks_, priceTracked_, priceTrackingEligible_, - isInSplitView_)]]"> + bookmarks_, priceTracked_, priceTrackingEligible_)]]"> <template is="dom-if" if="[[!showDivider_(item)]]" restamp> <button class="dropdown-item" on-click="onMenuItemClicked_" disabled="[[item.disabled]]">
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts index a9ae4ff..3a405ae8 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_context_menu.ts
@@ -68,7 +68,6 @@ }, priceTracked_: Boolean, priceTrackingEligible_: Boolean, - isInSplitView_: Boolean, }; } @@ -79,16 +78,13 @@ declare private bookmarks_: BookmarksTreeNode[]; declare private priceTracked_: boolean; declare private priceTrackingEligible_: boolean; - declare private isInSplitView_: boolean; showAt( event: MouseEvent, bookmarks: BookmarksTreeNode[], priceTracked: boolean, - priceTrackingEligible: boolean, isInSplitView: boolean, - onShown: Function = () => {}) { + priceTrackingEligible: boolean, onShown: Function = () => {}) { this.bookmarks_ = bookmarks; this.priceTracked_ = priceTracked; this.priceTrackingEligible_ = priceTrackingEligible; - this.isInSplitView_ = isInSplitView; const target = event.target as HTMLElement; afterNextRender(this, () => { this.$.menu.showAt(target); @@ -98,12 +94,10 @@ showAtPosition( event: MouseEvent, bookmarks: BookmarksTreeNode[], priceTracked: boolean, - priceTrackingEligible: boolean, isInSplitView: boolean, - onShown: Function = () => {}) { + priceTrackingEligible: boolean, onShown: Function = () => {}) { this.bookmarks_ = bookmarks; this.priceTracked_ = priceTracked; this.priceTrackingEligible_ = priceTrackingEligible; - this.isInSplitView_ = isInSplitView; const menuMargin = 20; const doc = document.scrollingElement!; const minX = doc.scrollLeft + menuMargin; @@ -169,7 +163,6 @@ menuItems.push({ id: MenuItemId.OPEN_SPLIT_VIEW, label: loadTimeData.getString('menuOpenSplitView'), - disabled: this.isInSplitView_, }); }
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts index 5ed668a..1f3c7e4 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -1058,21 +1058,13 @@ !!this.bookmarksService_.getAvailableProductInfo(event.detail.bookmark); const bookmark = event.detail.bookmark; if (event.detail.event.button === 0) { - this.bookmarksApi_.isActiveTabInSplit().then( - (result: {isSplit: boolean}) => { - this.$.contextMenu.showAt( - event.detail.event, [bookmark], priceTracked, - priceTrackingEligible, result.isSplit, - this.onContextMenuShown_.bind(this, bookmark)); - }); + this.$.contextMenu.showAt( + event.detail.event, [bookmark], priceTracked, priceTrackingEligible, + this.onContextMenuShown_.bind(this, bookmark)); } else { - this.bookmarksApi_.isActiveTabInSplit().then( - (result: {isSplit: boolean}) => { - this.$.contextMenu.showAtPosition( - event.detail.event, [bookmark], priceTracked, - priceTrackingEligible, result.isSplit, - this.onContextMenuShown_.bind(this, bookmark)); - }); + this.$.contextMenu.showAtPosition( + event.detail.event, [bookmark], priceTracked, priceTrackingEligible, + this.onContextMenuShown_.bind(this, bookmark)); } } @@ -1213,12 +1205,8 @@ private onBulkEditMenuClicked_(event: MouseEvent) { event.preventDefault(); event.stopPropagation(); - this.bookmarksApi_.isActiveTabInSplit().then( - (result: {isSplit: boolean}) => { - this.$.contextMenu.showAt( - event, this.getSelectedBookmarksList_(), false, false, - result.isSplit); - }); + this.$.contextMenu.showAt( + event, this.getSelectedBookmarksList_(), false, false); } private onSortTypeClicked_(event: DomRepeatEvent<SortOption>) {
diff --git a/chrome/browser/search/search_unittest.cc b/chrome/browser/search/search_unittest.cc index 08925f8..cea3da7a 100644 --- a/chrome/browser/search/search_unittest.cc +++ b/chrome/browser/search/search_unittest.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. - #include "chrome/browser/search/search.h" #include <stddef.h> @@ -21,6 +20,7 @@ #include "chrome/browser/signin/chrome_signin_client_factory.h" #include "chrome/browser/signin/chrome_signin_client_test_util.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" +#include "chrome/browser/supervised_user/supervised_user_test_util.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/browser_with_test_window_test.h" @@ -361,16 +361,13 @@ } TEST_F(SearchTest, UseLocalNTPIfNTPURLIsBlockedForSupervisedUser) { - // Mark the profile as supervised, otherwise the URL filter won't be checked. + // Initialize the Supervised user service, so it will allow to be enabled. + SupervisedUserServiceFactory::GetForProfile(profile())->Init(); + // Enable supervision, otherwise the URL filter won't be checked. profile()->SetIsSupervisedProfile(); // Block access to foo.com in the URL filter. - supervised_user::SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile()); - supervised_user::SupervisedUserURLFilter* url_filter = - supervised_user_service->GetURLFilter(); - std::map<std::string, bool> hosts; - hosts["foo.com"] = false; - url_filter->SetManualHosts(std::move(hosts)); + supervised_user_test_util::SetManualFilterForHost(profile(), "foo.com", + /*allowlist=*/false); EXPECT_EQ(chrome::kChromeUINewTabPageThirdPartyURL, GetNewTabPageURL(profile()));
diff --git a/chrome/browser/security_events/security_event_sync_bridge_impl.cc b/chrome/browser/security_events/security_event_sync_bridge_impl.cc index 3d3f3ba..f148354 100644 --- a/chrome/browser/security_events/security_event_sync_bridge_impl.cc +++ b/chrome/browser/security_events/security_event_sync_bridge_impl.cc
@@ -156,12 +156,12 @@ } std::string SecurityEventSyncBridgeImpl::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string SecurityEventSyncBridgeImpl::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKeyFromSpecifics(entity_data.specifics.security_event()); }
diff --git a/chrome/browser/security_events/security_event_sync_bridge_impl.h b/chrome/browser/security_events/security_event_sync_bridge_impl.h index a5db170f..a9290e3 100644 --- a/chrome/browser/security_events/security_event_sync_bridge_impl.h +++ b/chrome/browser/security_events/security_event_sync_bridge_impl.h
@@ -45,8 +45,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/chrome/browser/signin/chrome_signin_client.cc b/chrome/browser/signin/chrome_signin_client.cc index 91e7bfa..04bb7dd 100644 --- a/chrome/browser/signin/chrome_signin_client.cc +++ b/chrome/browser/signin/chrome_signin_client.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/enterprise/util/managed_browser_utils.h" +#include "chrome/browser/metrics/chrome_metrics_service_accessor.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" #include "chrome/browser/profiles/profile_manager.h" @@ -45,11 +46,13 @@ #include "components/signin/public/base/signin_client.h" #include "components/signin/public/base/signin_metrics.h" #include "components/signin/public/base/signin_pref_names.h" +#include "components/signin/public/base/signin_prefs.h" #include "components/signin/public/base/signin_switches.h" #include "components/signin/public/identity_manager/access_token_info.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/primary_account_change_event.h" #include "components/signin/public/identity_manager/scope_set.h" +#include "components/variations/synthetic_trials.h" #include "components/version_info/channel.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/storage_partition.h" @@ -407,6 +410,21 @@ #if !BUILDFLAG(IS_CHROMEOS) RecordOpenTabCount(access_point, consent_level); #endif + + if (consent_level == signin::ConsentLevel::kSignin && + SigninPrefs(*GetPrefs()) + .GetBookmarksExplicitBrowserSignin( + event_details.GetCurrentState().primary_account.gaia)) { + // `Enabled` group contains all users that have butter for bookmarks + // active - this is used to differentiate between the users that have + // the feature active `switches::kSyncEnableBookmarksInTransportMode` + // and butter active (in this group). + // There is no equivalent control group recorded for the field trial. + ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial( + "UnoDesktopBookmarksButterActive", "Enabled", + variations::SyntheticTrialAnnotationMode::kCurrentLog); + } + break; } } }
diff --git a/chrome/browser/ssl/OWNERS b/chrome/browser/ssl/OWNERS index ab9874e9..3460464 100644 --- a/chrome/browser/ssl/OWNERS +++ b/chrome/browser/ssl/OWNERS
@@ -1,5 +1,4 @@ -agl@chromium.org carlosil@chromium.org estark@chromium.org meacer@chromium.org -cthomp@chromium.org \ No newline at end of file +cthomp@chromium.org
diff --git a/chrome/browser/supervised_user/classify_url_navigation_throttle_unittest.cc b/chrome/browser/supervised_user/classify_url_navigation_throttle_unittest.cc index 7433694..8da3f1c 100644 --- a/chrome/browser/supervised_user/classify_url_navigation_throttle_unittest.cc +++ b/chrome/browser/supervised_user/classify_url_navigation_throttle_unittest.cc
@@ -82,16 +82,6 @@ EnableParentalControls(*profile()->GetPrefs()); } - std::unique_ptr<TestingProfile> CreateTestingProfile() override { - TestingProfile::Builder builder; - builder.AddTestingFactories(GetTestingFactories()); - // Important. Testing profile must be of supervised user, otherwise the - // supervised user settings service stack won't be fully initialized (the - // pref service will lack supervised user pref store). - builder.SetIsSupervisedProfile(); - return builder.Build(); - } - std::unique_ptr<content::MockNavigationThrottleRegistry> CreateNavigationThrottle(const std::vector<GURL> redirects) { CHECK_GT(redirects.size(), 0U) << "At least one url is required"; @@ -162,8 +152,8 @@ TEST_F(ClassifyUrlNavigationThrottleTest, AllowedUrlsRecordedInAllowBucket) { GURL allowed_url(kExampleURL); - std::map<std::string, bool> hosts{{allowed_url.host(), true}}; - GetSupervisedUserURLFilter()->SetManualHosts(std::move(hosts)); + supervised_user_test_util::SetManualFilterForHost( + profile(), allowed_url.host(), /*allowlist=*/true); std::unique_ptr<content::MockNavigationThrottleRegistry> registry = CreateNavigationThrottle(allowed_url); @@ -188,9 +178,8 @@ TEST_F(ClassifyUrlNavigationThrottleTest, BlocklistedUrlsRecordedInBlockManualBucket) { GURL blocked_url(kExampleURL); - std::map<std::string, bool> hosts; - hosts[blocked_url.host()] = false; - GetSupervisedUserURLFilter()->SetManualHosts(std::move(hosts)); + supervised_user_test_util::SetManualFilterForHost( + profile(), blocked_url.host(), /*allowlist=*/false); ASSERT_TRUE(GetSupervisedUserURLFilter() ->GetFilteringBehavior(blocked_url) .IsBlocked());
diff --git a/chrome/browser/supervised_user/supervised_user_pending_state_navigation_browsertest.cc b/chrome/browser/supervised_user/supervised_user_pending_state_navigation_browsertest.cc index 2ed9e2a4..c998c28 100644 --- a/chrome/browser/supervised_user/supervised_user_pending_state_navigation_browsertest.cc +++ b/chrome/browser/supervised_user/supervised_user_pending_state_navigation_browsertest.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/supervised_user/child_accounts/child_account_service_factory.h" #include "chrome/browser/supervised_user/supervised_user_browser_utils.h" #include "chrome/browser/supervised_user/supervised_user_service_factory.h" +#include "chrome/browser/supervised_user/supervised_user_test_util.h" #include "chrome/browser/supervised_user/supervised_user_verification_controller_client.h" #include "chrome/browser/supervised_user/supervised_user_verification_page.h" #include "chrome/browser/ui/browser.h" @@ -194,14 +195,9 @@ .embedded_test_server_options = {.resolver_rules_map_host_list = "*.example.com"}}}; - void SetManualHost(GURL url, bool allowlist) { - supervised_user::SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(browser()->profile()); - supervised_user::SupervisedUserURLFilter* url_filter = - supervised_user_service->GetURLFilter(); - std::map<std::string, bool> hosts; - hosts[url.host()] = allowlist; - url_filter->SetManualHosts(std::move(hosts)); + void SetManualHost(const GURL& url, bool allowlist) { + supervised_user_test_util::SetManualFilterForHost(browser()->profile(), + url.host(), allowlist); } content::RenderFrameHost* FindFrameByName(const std::string& name) {
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter_extensions_unittest.cc b/chrome/browser/supervised_user/supervised_user_url_filter_extensions_unittest.cc index 8661b33..0754e46 100644 --- a/chrome/browser/supervised_user/supervised_user_url_filter_extensions_unittest.cc +++ b/chrome/browser/supervised_user/supervised_user_url_filter_extensions_unittest.cc
@@ -7,14 +7,24 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" -#include "base/test/task_environment.h" +#include "chrome/browser/profiles/profile_key.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/browser/supervised_user/android/supervised_user_service_platform_delegate.h" #include "chrome/browser/supervised_user/supervised_user_browser_utils.h" -#include "components/prefs/testing_pref_service.h" +#include "chrome/browser/supervised_user/supervised_user_service_factory.h" +#include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h" +#include "chrome/browser/supervised_user/supervised_user_test_util.h" +#include "chrome/browser/sync/sync_service_factory.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "chrome/test/base/testing_profile.h" +#include "components/keyed_service/core/keyed_service_factory.h" #include "components/safe_search_api/fake_url_checker_client.h" #include "components/supervised_user/core/browser/supervised_user_preferences.h" -#include "components/supervised_user/core/browser/supervised_user_sync_data_fake.h" +#include "components/supervised_user/core/browser/supervised_user_service.h" +#include "components/supervised_user/core/browser/supervised_user_settings_service.h" #include "components/supervised_user/core/browser/supervised_user_url_filter.h" #include "components/supervised_user/core/browser/supervised_user_utils.h" +#include "content/public/browser/storage_partition.h" #include "extensions/buildflags/buildflags.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -32,25 +42,36 @@ } }; -class SupervisedUserURLFilterExtensionsTest : public ::testing::Test { - public: - SupervisedUserURLFilterExtensionsTest() { - RegisterProfilePrefs(pref_service_.registry()); - sync_data_fake_.Init(); - filter_.SetURLCheckerClient( - std::make_unique<safe_search_api::FakeURLCheckerClient>()); - sync_data_fake_.SetWebFilterType(WebFilterType::kCertainSites); +std::unique_ptr<KeyedService> BuildSupervisedUserService( + content::BrowserContext* browser_context) { + Profile* profile = Profile::FromBrowserContext(browser_context); + return std::make_unique<SupervisedUserService>( + IdentityManagerFactory::GetForProfile(profile), + profile->GetDefaultStoragePartition() + ->GetURLLoaderFactoryForBrowserProcess(), + *profile->GetPrefs(), + *SupervisedUserSettingsServiceFactory::GetInstance()->GetForKey( + profile->GetProfileKey()), + SyncServiceFactory::GetInstance()->GetForProfile(profile), + std::make_unique<FakeURLFilterDelegate>(), + std::make_unique<SupervisedUserServicePlatformDelegate>(*profile)); +} + +class SupervisedUserURLFilterExtensionsTest + : public ChromeRenderViewHostTestHarness { + protected: + std::unique_ptr<TestingProfile> CreateTestingProfile() override { + return TestingProfile::Builder() + .SetIsSupervisedProfile() + .AddTestingFactory(SupervisedUserServiceFactory::GetInstance(), + base::BindRepeating(&BuildSupervisedUserService)) + .Build(); } - protected: - base::test::TaskEnvironment task_environment_; - TestingPrefServiceSimple pref_service_; - test::SupervisedUserSyncDataFake<TestingPrefServiceSimple> sync_data_fake_{ - pref_service_}; - - SupervisedUserURLFilter filter_ = - SupervisedUserURLFilter(pref_service_, - std::make_unique<FakeURLFilterDelegate>()); + SupervisedUserURLFilter& filter() { + return *SupervisedUserServiceFactory::GetForProfile(profile()) + ->GetURLFilter(); + } }; TEST_F(SupervisedUserURLFilterExtensionsTest, @@ -81,27 +102,33 @@ GURL webstore_url("https://chrome.google.com/webstore"); GURL new_webstore_url("https://chromewebstore.google.com/"); - sync_data_fake_.SetWebFilterType(WebFilterType::kCertainSites); - EXPECT_TRUE(filter_.GetFilteringBehavior(crx_download_url1).IsAllowed()); - EXPECT_TRUE(filter_.GetFilteringBehavior(crx_download_url2).IsAllowed()); - EXPECT_TRUE(filter_.GetFilteringBehavior(crx_download_url3).IsAllowed()); - EXPECT_TRUE(filter_.GetFilteringBehavior(webstore_url).IsAllowed()); - EXPECT_TRUE(filter_.GetFilteringBehavior(new_webstore_url).IsAllowed()); + supervised_user_test_util::SetWebFilterType(profile(), + WebFilterType::kCertainSites); + EXPECT_TRUE(filter().GetFilteringBehavior(crx_download_url1).IsAllowed()); + EXPECT_TRUE(filter().GetFilteringBehavior(crx_download_url2).IsAllowed()); + EXPECT_TRUE(filter().GetFilteringBehavior(crx_download_url3).IsAllowed()); + EXPECT_TRUE(filter().GetFilteringBehavior(webstore_url).IsAllowed()); + EXPECT_TRUE(filter().GetFilteringBehavior(new_webstore_url).IsAllowed()); // Set explicit host rules to block those website, and make sure the // URLs still work. - std::map<std::string, bool> hosts; - hosts["clients2.google.com"] = false; - hosts["clients2.googleusercontent.com"] = false; - hosts["chrome.google.com"] = false; - hosts["chromewebstore.google.com"] = false; - filter_.SetManualHosts(std::move(hosts)); - sync_data_fake_.SetWebFilterType(WebFilterType::kAllowAllSites); - EXPECT_TRUE(filter_.GetFilteringBehavior(crx_download_url1).IsAllowed()); - EXPECT_TRUE(filter_.GetFilteringBehavior(crx_download_url2).IsAllowed()); - EXPECT_TRUE(filter_.GetFilteringBehavior(crx_download_url3).IsAllowed()); - EXPECT_TRUE(filter_.GetFilteringBehavior(webstore_url).IsAllowed()); - EXPECT_TRUE(filter_.GetFilteringBehavior(new_webstore_url).IsAllowed()); + supervised_user_test_util::SetManualFilterForHost( + profile(), "clients2.google.com", /*allowlist=*/false); + supervised_user_test_util::SetManualFilterForHost( + profile(), "clients2.googleusercontent.com", + /*allowlist=*/false); + supervised_user_test_util::SetManualFilterForHost( + profile(), "chrome.google.com", /*allowlist=*/false); + supervised_user_test_util::SetManualFilterForHost( + profile(), "chromewebstore.google.com", /*allowlist=*/false); + supervised_user_test_util::SetWebFilterType(profile(), + WebFilterType::kAllowAllSites); + + EXPECT_TRUE(filter().GetFilteringBehavior(crx_download_url1).IsAllowed()); + EXPECT_TRUE(filter().GetFilteringBehavior(crx_download_url2).IsAllowed()); + EXPECT_TRUE(filter().GetFilteringBehavior(crx_download_url3).IsAllowed()); + EXPECT_TRUE(filter().GetFilteringBehavior(webstore_url).IsAllowed()); + EXPECT_TRUE(filter().GetFilteringBehavior(new_webstore_url).IsAllowed()); } } // namespace
diff --git a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc index a23e0a6..59c1ab6d 100644 --- a/chrome/browser/sync/test/integration/sync_service_impl_harness.cc +++ b/chrome/browser/sync/test/integration/sync_service_impl_harness.cc
@@ -244,19 +244,17 @@ case SigninType::FAKE_SIGNIN: { signin_delegate_->SigninFake(profile_, username_, consent_level); - - // TODO(b/1523197): The below checks should also be satisfied for the - // above case. - signin::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile_); - CHECK(identity_manager->HasPrimaryAccount(consent_level)); - CHECK(identity_manager->HasPrimaryAccountWithRefreshToken(consent_level)); - CHECK(!service()->GetAccountInfo().IsEmpty()); - break; } } + signin::IdentityManager* identity_manager = + IdentityManagerFactory::GetForProfile(profile_); + CHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)); + CHECK(identity_manager->HasPrimaryAccount(consent_level)); + CHECK(identity_manager->HasPrimaryAccountWithRefreshToken(consent_level)); + CHECK(!service()->GetAccountInfo().IsEmpty()); + return true; }
diff --git a/chrome/browser/transition_manager/OWNERS b/chrome/browser/transition_manager/OWNERS index a3629f2..0a1c69a 100644 --- a/chrome/browser/transition_manager/OWNERS +++ b/chrome/browser/transition_manager/OWNERS
@@ -1,2 +1 @@ -mheikal@chromium.org hanxi@chromium.org
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index bfbfbcc..b363714 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -1966,6 +1966,10 @@ deps += [ "//ui/base/ime/linux" ] } + if (is_win && is_chrome_branded) { + deps += [ "//chrome/browser/win/installer_downloader:controller" ] + } + if (enable_dice_support) { deps += [ "//chrome/browser/ui/webui/signin/signout_confirmation", @@ -5727,10 +5731,14 @@ "//chrome/browser/background/glic", "//chrome/browser/glic", "//chrome/browser/glic:impl", + "//chrome/browser/glic/browser_ui", + "//chrome/browser/glic/fre", ] allow_circular_includes_from += [ "//chrome/browser/actor", "//chrome/browser/glic:impl", + "//chrome/browser/glic/fre", + "//chrome/browser/glic/browser_ui", ] }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index 34c3e3ba..4a10ece3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">የሚታይ ነገር ዕይታን በማሳየት ላይ</translation> <translation id="1928696683969751773">ዝማኔዎች</translation> <translation id="1939549834451474504">የGoogle Play አገልግሎቶች ስለማይገኙ የይለፍ ቃላት በቅርቡ መሥራት ያቆማሉ። መሥራት ከማቆማቸው በፊት የተቀመጡ የይለፍ ቃላትዎን ቅጂ ማድረግ ይችላሉ። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">የእርስዎ የተከፈቱ ትሮች አሁን XR ውስጥ የተዘመነ መልክ አላቸው</translation> <translation id="1943432128510653496">የይለፍ ቃላትን አስቀምጥ</translation> <translation id="1944535645109964458">ምንም የይለፍ ቁልፎች አይገኙም</translation> <translation id="1957557050935255529">PDF በመጫን ላይ…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index 0d960ab3..d61a218a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">ভিজুৱেল ভিউ দেখুৱাই থকা হৈছে</translation> <translation id="1928696683969751773">আপডে’টসমূহ</translation> <translation id="1939549834451474504">Google Play সেৱা উপলব্ধ নোহোৱাৰ বাবে পাছৱৰ্ডসমূহে সোনকালে কাম কৰা বন্ধ কৰিব। সেইসমূহে কাম কৰা বন্ধ কৰাৰ আগতে আপুনি আপোনাৰ ছেভ কৰি থোৱা পাছৱৰ্ডসমূহ প্ৰতিলিপি কৰিব পাৰে। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">আপোনাৰ খোলা টেবসমূহৰ এতিয়া XRত এটা আপডে’ট কৰা ৰূপ আছে</translation> <translation id="1943432128510653496">পাছৱৰ্ড ছেভ কৰক</translation> <translation id="1944535645109964458">কোনো পাছকী উপলব্ধ নহয়</translation> <translation id="1957557050935255529">PDF ল’ড কৰি থকা হৈছে…</translation> @@ -435,6 +436,7 @@ <translation id="2979639724566107830">নতুন ৱিণ্ড'ত খোলক</translation> <translation id="2981364137500752533">আপোনাৰ ৫ খনলৈকে ৱিণ্ড’ থাকিব পাৰে।</translation> <translation id="2983102365694924129">এটা ছাইটত আপোনাৰ কাৰ্যকলাপৰ ওপৰত ভিত্তি কৰি। এই ছেটিংটো অফ হৈ আছে।</translation> +<translation id="2983398917942897288">নিষ্ক্ৰিয় হৈ আছে (<ph name="ITEM_COUNT" />)</translation> <translation id="2984978667043170458">Googleত কৰা সন্ধানত আশে-পাশে থকা পাঠ ব্যৱহাৰ কৰক</translation> <translation id="2988638966064514052">আপোনাৰ পাছৱর্ডসমূহ অধিক শক্তিশালী কৰক</translation> <translation id="2989523299700148168">শেহতীয়াকৈ চোৱা</translation> @@ -467,6 +469,7 @@ <translation id="314939179385989105">Chromeৰ গৃহপৃষ্ঠা</translation> <translation id="3158667104057012316">মেনুৱেল ক্ৰম অনুসৰি সজাই থকা হৈছে</translation> <translation id="3159335509547415276">অৱৰোধ কৰা একাউণ্টৰ বিষয়ে জানক</translation> +<translation id="3161699713309727585"><ph name="BUTTON_TEXT" />, এটা নতুন টেবত খোলে</translation> <translation id="3166827708714933426">টেব আৰু ৱিণ্ড’ৰ শ্বৰ্টকাট</translation> <translation id="316694332262407393">ইয়াত ইতিমধ্যে Chrome চলি আছে।</translation> <translation id="3167258285411721858">আপুনি <ph name="HOST_NAME" />ৰ ম’বাইলৰ ছাইটৰ বাবে অনুৰোধ কৰিব পাৰে</translation> @@ -791,6 +794,7 @@ <translation id="469286762610133730">অধিক ভাল সমল পাওক</translation> <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 আৰু <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />টা}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 আৰু <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />টা}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 আৰু <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />টা}}</translation> <translation id="4698061626562952596">আপোনাৰ নিস্ক্ৰিয় টেবসমূহ ইয়াত পৰ্যালোচনা কৰক</translation> +<translation id="4698757800236023795">সক্ৰিয় হৈ আছে (<ph name="ITEM_COUNT" />)</translation> <translation id="4699172675775169585">কেশ্ব প্ৰতিচ্ছবি আৰু ফাইল</translation> <translation id="4710167854527459075">নতুন অনুসৰি সজাওক</translation> <translation id="4718044610319080485">AI সহায়কক আহ্বান জনায়</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index b01a9bf..79ff019 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Vizual görünüş göstərilir</translation> <translation id="1928696683969751773">Güncəlləşmələr</translation> <translation id="1939549834451474504">Google Play xidmətləri əlçatan olmadığı üçün parollar tezliklə işləməyəcək. Yadda saxlanan parollar işlədiyi müddətcə onların surətini çıxara bilərsiniz. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Açıq tablarınızın uzadılmış reallıqda yenilənmiş görünüşü var</translation> <translation id="1943432128510653496">Parolları yadda saxlayın</translation> <translation id="1944535645109964458">Əlçatan giriş açarı yoxdur</translation> <translation id="1957557050935255529">PDF yüklənir…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 57ae476f..1870e72 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Выбрана нагляднае адлюстраванне</translation> <translation id="1928696683969751773">Абнаўленні</translation> <translation id="1939549834451474504">Неўзабаве паролі перастануць працаваць, бо сэрвісы Google Play недаступныя. Вы можаце скапіраваць захаваныя паролі да таго, як яны перастануць працаваць. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Адкрытыя ўкладкі цяпер маюць новы выгляд у XR</translation> <translation id="1943432128510653496">Захоўваць паролі</translation> <translation id="1944535645109964458">Няма даступных ключоў доступу</translation> <translation id="1957557050935255529">Ідзе загрузка файла PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 97c3930..3d3e1ec 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -208,7 +208,7 @@ <translation id="1928618076168182477">Prikazivanje vizuelnog prikaza</translation> <translation id="1928696683969751773">Ažuriranja</translation> <translation id="1939549834451474504">Lozinke će uskoro prestati funkcionirati jer Google Play usluge nisu dostupne. Možete napraviti kopiju sačuvanih lozinki prije nego što prestanu funkcionirati. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> -<translation id="1943398124995840148">Vaše otvorene kartice sada imaju ažurirani izgled u XR-u</translation> +<translation id="1943398124995840148">Izgled otvorenih kartica je ažuriran u XR-u</translation> <translation id="1943432128510653496">Sačuvaj lozinke</translation> <translation id="1944535645109964458">Nije dostupan nijedan pristupni ključ</translation> <translation id="1957557050935255529">Učitavanje PDF fajla…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index c7299e38..c69cec9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">S'està mostrant la visualització visual</translation> <translation id="1928696683969751773">Actualitzacions</translation> <translation id="1939549834451474504">Les contrasenyes deixaran de funcionar aviat perquè Serveis de Google Play no està disponible. Pots fer una còpia de les contrasenyes desades abans que deixin de funcionar. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Ara les pestanyes obertes tenen un aspecte actualitzat a XR</translation> <translation id="1943432128510653496">Desa les contrasenyes</translation> <translation id="1944535645109964458">No hi ha cap clau d'accés disponible</translation> <translation id="1957557050935255529">S'està carregant el PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 3c10c58..78cd718 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -435,6 +435,7 @@ <translation id="2979639724566107830">Otevřít v novém okně</translation> <translation id="2981364137500752533">Můžete mít až 5 oken.</translation> <translation id="2983102365694924129">Na základě vaší aktivity na webu. Toto nastavení je vypnuté.</translation> +<translation id="2983398917942897288">Neaktivní (<ph name="ITEM_COUNT" />)</translation> <translation id="2984978667043170458">Při vyhledávání na Googlu zahrnovat okolní text</translation> <translation id="2988638966064514052">Zesilte svá hesla</translation> <translation id="2989523299700148168">Nedávno navštívené</translation> @@ -467,6 +468,7 @@ <translation id="314939179385989105">Domovská stránka Chromu</translation> <translation id="3158667104057012316">Ruční řazení</translation> <translation id="3159335509547415276">Další informace o blokovaných účtech</translation> +<translation id="3161699713309727585"><ph name="BUTTON_TEXT" />, otevře se na nové kartě</translation> <translation id="3166827708714933426">Zkratky pro okna a karty</translation> <translation id="316694332262407393">Chrome už je spuštěný.</translation> <translation id="3167258285411721858">Můžete požádat o web <ph name="HOST_NAME" /> pro mobily</translation> @@ -791,6 +793,7 @@ <translation id="469286762610133730">Získejte lepší obsah</translation> <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" /> a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> další}few{<ph name="SHIPPING_OPTION_PREVIEW" /> a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> další}many{<ph name="SHIPPING_OPTION_PREVIEW" /> a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> další}other{<ph name="SHIPPING_OPTION_PREVIEW" /> a <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> dalších}}</translation> <translation id="4698061626562952596">Tady najdete své neaktivní karty</translation> +<translation id="4698757800236023795">Aktivní (<ph name="ITEM_COUNT" />)</translation> <translation id="4699172675775169585">Obrázky a soubory v mezipaměti</translation> <translation id="4710167854527459075">Seřadit od nejnovějších</translation> <translation id="4718044610319080485">Vyvolá AI asistenta</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb index abaceaf..d3a571e8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Wrthi'n dangos gwedd weledol</translation> <translation id="1928696683969751773">Diweddariadau</translation> <translation id="1939549834451474504">Bydd cyfrineiriau yn stopio gweithio yn fuan oherwydd nad yw gwasanaethau Google Play ar gael. Gallwch wneud copi o'ch cyfrineiriau sydd wedi'u cadw cyn iddynt stopio gweithio. <ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Mae gan eich tabiau agored gwedd wedi'i diweddaru yn XR bellach</translation> <translation id="1943432128510653496">Cadw cyfrineiriau</translation> <translation id="1944535645109964458">Dim codau pas ar gael</translation> <translation id="1957557050935255529">Wrthi'n llwytho PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 88116f2..9eadee0a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Visuel visning anvendes</translation> <translation id="1928696683969751773">Opdateringer</translation> <translation id="1939549834451474504">Du mister snart adgangen til dine gemte adgangskoder, fordi Google Play-tjenester ikke længere er tilgængelige. Du kan lave en kopi af adgangskoderne, før du mister adgangen. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Dine åbne faner har fået et opdateret design i XR</translation> <translation id="1943432128510653496">Gem adgangskoder</translation> <translation id="1944535645109964458">Ingen tilgængelige adgangsnøgler</translation> <translation id="1957557050935255529">Indlæser PDF-fil…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index f57c4c3..9e4fff3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Visuelle Ansicht wird angezeigt</translation> <translation id="1928696683969751773">Aktualisierungen</translation> <translation id="1939549834451474504">Deine Passwörter funktionieren bald nicht mehr, weil die Google Play-Dienste nicht verfügbar sind. Du kannst eine Kopie deiner gespeicherten Passwörter erstellen, bevor du diese nicht mehr verwenden kannst. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Deine geöffneten Tabs haben jetzt ein neues Design in XR</translation> <translation id="1943432128510653496">Passwörter speichern</translation> <translation id="1944535645109964458">Keine Passkeys verfügbar</translation> <translation id="1957557050935255529">PDF wird geladen…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index d0114c8..bc66330 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Se muestra la vista con imágenes</translation> <translation id="1928696683969751773">Actualizaciones</translation> <translation id="1939549834451474504">Las contraseñas dejarán de funcionar pronto porque los Servicios de Google Play no están disponibles. Puedes hacer una copia de tus contraseñas guardadas antes de que dejen de funcionar. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Tus pestañas abiertas ahora tienen un diseño actualizado en RE</translation> <translation id="1943432128510653496">Guardar contraseñas</translation> <translation id="1944535645109964458">No hay llaves de acceso disponibles</translation> <translation id="1957557050935255529">Cargando PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index af78f6c..59adcc5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Mostrando vista visual</translation> <translation id="1928696683969751773">Actualizaciones</translation> <translation id="1939549834451474504">Las contraseñas dejarán de funcionar pronto porque Servicios de Google Play no está disponible. Puedes hacer una copia de tus contraseñas guardadas antes de que esto ocurra. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Tus pestañas abiertas ahora tienen un nuevo aspecto en RE</translation> <translation id="1943432128510653496">Guardar contraseñas</translation> <translation id="1944535645109964458">No hay llaves de acceso disponibles</translation> <translation id="1957557050935255529">Cargando PDF...</translation> @@ -710,7 +711,7 @@ <translation id="4285498937028063278">Desfijar</translation> <translation id="4285846616383034558">Cookies, caché y otros datos de sitios</translation> <translation id="4291407919474070700"><ph name="BEGIN_LINK" />Activa el bloqueo de pantalla en los ajustes de Android<ph name="END_LINK" /></translation> -<translation id="4296252229500326964">Nueva pestaña Incógnito</translation> +<translation id="4296252229500326964">Nueva pestaña de Incógnito</translation> <translation id="4298388696830689168">Sitios web enlazados</translation> <translation id="4303044213806199882">chrome_screenshot_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="4307992518367153382">Configuración básica</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index 61b7b38..06b3c37 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Näidatakse visuaalset vaadet</translation> <translation id="1928696683969751773">Värskendused</translation> <translation id="1939549834451474504">Paroolid peagi enam ei tööta, kuna Google Play teenused pole saadaval. Võite oma salvestatud paroolidest koopia teha, enne kui need enam ei tööta. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Teie avatud vahelehtede välimust XR-is värskendati</translation> <translation id="1943432128510653496">Paroolide salvestamine</translation> <translation id="1944535645109964458">Saadaval pole ühtegi pääsuvõtit</translation> <translation id="1957557050935255529">PDF-i laadimine …</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 9789529..76efe51 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Näytetään visuaalinen näkymä</translation> <translation id="1928696683969751773">Päivitykset</translation> <translation id="1939549834451474504">Salasanat lakkaavat pian toimimasta, koska Google Play Palvelut ei ole käytettävissä. Voit luoda kopion tallennetuista salasanoista ennen kuin ne lakkaavat toimimasta. <ph name="BEGIN_LINK" />Lue lisää<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Avoimilla välilehdillä on nyt uusi ulkoasu XR:ssä</translation> <translation id="1943432128510653496">Salasanojen tallentaminen</translation> <translation id="1944535645109964458">Avainkoodeja ei ole saatavilla</translation> <translation id="1957557050935255529">Ladataan PDF:ää…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 80861e2..0710c434 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">વિઝ્યુઅલ વ્યૂ બતાવી રહ્યાં છે</translation> <translation id="1928696683969751773">અપડેટ</translation> <translation id="1939549834451474504">પાસવર્ડ ટૂંક સમયમાં કામ કરવાનું બંધ કરશે કારણ કે Google Play સેવાઓ ઉપલબ્ધ નથી. તમારા સાચવેલા પાસવર્ડ કામ કરવાનું બંધ કરે તે પહેલાં તમે તેની કૉપિ બનાવી શકો છો. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">તમારા ખુલ્લા ટૅબ હવે XRમાં અપડેટ કરેલો દેખાવ ધરાવે છે</translation> <translation id="1943432128510653496">પાસવર્ડ સાચવો</translation> <translation id="1944535645109964458">કોઈ પાસકી ઉપલબ્ધ નથી</translation> <translation id="1957557050935255529">PDF લોડ કરી રહ્યાં છીએ…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index 1352094..c65f273 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">विज़ुअल व्यू दिखाया जा रहा है</translation> <translation id="1928696683969751773">अपडेट</translation> <translation id="1939549834451474504">इस डिवाइस पर Google Play services उपलब्ध नहीं है. इसलिए, सेव किए गए पासवर्ड ऐक्सेस नहीं किए जा सकेंगे. इससे पहले कि आप सेव किए गए अपने पासवर्ड का ऐक्सेस खो दें, उनकी कॉपी बना लें. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">XR डिवाइस में खुले हुए आपके टैब अब नए लुक में दिखेंगे</translation> <translation id="1943432128510653496">पासवर्ड सेव करें</translation> <translation id="1944535645109964458">कोई पासकी उपलब्ध नहीं है</translation> <translation id="1957557050935255529">PDF लोड हो रहा है…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 08428952..0b43e61 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Menampilkan tampilan visual</translation> <translation id="1928696683969751773">Update</translation> <translation id="1939549834451474504">Sandi akan segera berhenti berfungsi karena layanan Google Play tidak tersedia. Anda dapat membuat salinan sandi tersimpan Anda sebelum sandi berhenti berfungsi. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Tab yang terbuka kini memiliki tampilan baru di perangkat XR</translation> <translation id="1943432128510653496">Simpan sandi</translation> <translation id="1944535645109964458">Tidak ada kunci sandi yang tersedia</translation> <translation id="1957557050935255529">Memuat PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index b3039ef..e6a3ad53 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -436,6 +436,7 @@ <translation id="2979639724566107830">Apri in un'altra finestra</translation> <translation id="2981364137500752533">Puoi avere fino a 5 finestre.</translation> <translation id="2983102365694924129">In base alla tua attività svolta su un sito. Questa impostazione non è attiva.</translation> +<translation id="2983398917942897288">Non attive: <ph name="ITEM_COUNT" /></translation> <translation id="2984978667043170458">Includi il testo circostante nelle ricerche Google</translation> <translation id="2988638966064514052">Rendi le tue password più efficaci</translation> <translation id="2989523299700148168">Visitati di recente</translation> @@ -468,6 +469,7 @@ <translation id="314939179385989105">Pagina iniziale di Chrome</translation> <translation id="3158667104057012316">Ordinamento manuale</translation> <translation id="3159335509547415276">Scopri di più sugli account bloccati</translation> +<translation id="3161699713309727585"><ph name="BUTTON_TEXT" />, si apre in una nuova scheda</translation> <translation id="3166827708714933426">Scorciatoie di finestre e schede</translation> <translation id="316694332262407393">Chrome è già in esecuzione qui.</translation> <translation id="3167258285411721858">Puoi richiedere il sito mobile di <ph name="HOST_NAME" /></translation> @@ -792,6 +794,7 @@ <translation id="469286762610133730">Ottieni contenuti migliori</translation> <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 e altre <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 e altre <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation> <translation id="4698061626562952596">Esamina le schede non attive qui</translation> +<translation id="4698757800236023795">Attive: <ph name="ITEM_COUNT" /></translation> <translation id="4699172675775169585">Immagini e file memorizzati nella cache</translation> <translation id="4710167854527459075">Ordina per più recente</translation> <translation id="4718044610319080485">Attiva l'assistente AI</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index cd02af9..ff3b80d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">ビジュアル表示を表示しています</translation> <translation id="1928696683969751773">更新</translation> <translation id="1939549834451474504">Google Play 開発者サービスが利用できないため、まもなくパスワード機能は動作を停止します。保存したパスワードが使えなくなる前にコピーを作成できます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">XR で開いているタブのデザインが更新されました</translation> <translation id="1943432128510653496">パスワードの保存</translation> <translation id="1944535645109964458">利用可能なパスキーがありません</translation> <translation id="1957557050935255529">PDF を読み込んでいます…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 157135b..ca474d1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">ნაჩვენებია ვიზუალური ხედი</translation> <translation id="1928696683969751773">განახლება</translation> <translation id="1939549834451474504">პაროლები მალე შეწყვეტს მუშაობას, რადგან Google Play services მიუწვდომელია. მისი მუშაობის შეწყვეტამდე შეგიძლიათ პაროლების ასლის შექმნა. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">თქვენი გახსნილი ჩანართები ახლა სხვანაირად გამოჩნდება XR-ში</translation> <translation id="1943432128510653496">პაროლების შენახვა</translation> <translation id="1944535645109964458">წვდომის გასაღებები მიუწვდომელია</translation> <translation id="1957557050935255529">მიმდინარეობს PDF-ის ჩატვირთვა…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 69f09627..5120017 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Көрнекі көрініс таңдалды</translation> <translation id="1928696683969751773">Жаңартулар</translation> <translation id="1939549834451474504">Құпия сөздер жақында жұмыс істемейтін болады, себебі Google Play қызметтері қолжетімді емес. Сақталған құпия сөздер жұмысы тоқтағанша, олардың көшірмесін жасай аласыз. <ph name="BEGIN_LINK" />Толық ақпарат<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Ашық қойындыларыңыздың XR-дағы сыртқы көрінісі өзгерді.</translation> <translation id="1943432128510653496">Құпия сөздерді сақтау</translation> <translation id="1944535645109964458">Кіру кілттері жоқ</translation> <translation id="1957557050935255529">PDF жүктеліп жатыр…</translation> @@ -435,6 +436,7 @@ <translation id="2979639724566107830">Жаңа терезеде ашу</translation> <translation id="2981364137500752533">Ең көбі 5 терезе аша аласыз.</translation> <translation id="2983102365694924129">Сайттағы әрекетіңізге негізделген. Бұл параметр өшірулі.</translation> +<translation id="2983398917942897288">Әрекетсіз (<ph name="ITEM_COUNT" />)</translation> <translation id="2984978667043170458">Google іздеу сұрауларында көбірек мәтінді қамту</translation> <translation id="2988638966064514052">Құпия сөздеріңізді күшейтіңіз</translation> <translation id="2989523299700148168">Соңғы кіргендер</translation> @@ -467,6 +469,7 @@ <translation id="314939179385989105">Chrome браузерінің негізгі беті</translation> <translation id="3158667104057012316">Қолмен сұрыптау</translation> <translation id="3159335509547415276">Блокталған аккаунттар туралы ақпарат</translation> +<translation id="3161699713309727585"><ph name="BUTTON_TEXT" /> жаңа қойындыда ашылады</translation> <translation id="3166827708714933426">Қойынды мен терезенің пернелер тіркесімі</translation> <translation id="316694332262407393">Chrome жұмыс істеп тұр.</translation> <translation id="3167258285411721858"><ph name="HOST_NAME" /> мобильдік сайтын сұрауға болады</translation> @@ -791,6 +794,7 @@ <translation id="469286762610133730">Жақсырақ контент алыңыз</translation> <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 және тағы <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 және тағы <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation> <translation id="4698061626562952596">Әрекетсіз қойындыларды осы жерден қарауға болады.</translation> +<translation id="4698757800236023795">Белсенді (<ph name="ITEM_COUNT" />)</translation> <translation id="4699172675775169585">Кэштелген кескіндер мен файлдар</translation> <translation id="4710167854527459075">Ең жаңасы бойынша сұрыптау</translation> <translation id="4718044610319080485">AI көмекшісі ашылады</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index 8486f788..f4aeb1f2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">បង្ហាញទិដ្ឋភាពមើលឃើញ</translation> <translation id="1928696683969751773">ធ្វើបច្ចុប្បន្នភាព</translation> <translation id="1939549834451474504">ពាក្យសម្ងាត់នឹងឈប់ដំណើរការក្នុងពេលឆាប់ៗនេះ ដោយសារមិនអាចប្រើសេវាកម្ម Google Play បានទេ។ អ្នកអាចចម្លងពាក្យសម្ងាត់ដែលអ្នកបានរក្សាទុក មុនពេលពាក្យសម្ងាត់ទាំងនោះឈប់ដំណើរការ។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">ឥឡូវនេះ ផ្ទាំងដែលអ្នកបើកមានរូបរាងថ្មីនៅក្នុង XR ហើយ</translation> <translation id="1943432128510653496">រក្សាទុកពាក្យសម្ងាត់</translation> <translation id="1944535645109964458">មិនមានកូដសម្ងាត់ទេ</translation> <translation id="1957557050935255529">កំពុងផ្ទុក PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index baad246..68ec40c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">ವಿಷುವಲ್ ವೀಕ್ಷಣೆಯನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="1928696683969751773">ಅಪ್ಡೇಟ್ಗಳು</translation> <translation id="1939549834451474504">Google Play ಸೇವೆಗಳು ಲಭ್ಯವಿಲ್ಲದ ಕಾರಣ, ಪಾಸ್ವರ್ಡ್ಗಳು ಶೀಘ್ರದಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುತ್ತವೆ. ಸೇವ್ ಮಾಡಿದ ಪಾಸ್ವರ್ಡ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸುವ ಮೊದಲು, ನೀವು ಅವುಗಳನ್ನು ಕಾಪಿ ಮಾಡಿಟ್ಟುಕೊಳ್ಳಬಹುದು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">ನಿಮ್ಮ ತೆರೆದ ಟ್ಯಾಬ್ಗಳು ಈಗ XR ನಲ್ಲಿ ಅಪ್ಡೇಟ್ ಮಾಡಿದ ಲುಕ್ ಅನ್ನು ಹೊಂದಿವೆ</translation> <translation id="1943432128510653496">ಉಳಿಸಲಾದ ಪಾಸ್ವರ್ಡ್ಗಳು</translation> <translation id="1944535645109964458">ಯಾವುದೇ ಪಾಸ್ಕೀಗಳು ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="1957557050935255529">PDF ಲೋಡ್ ಆಗುತ್ತಿದೆ…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index bca6e4a..7be6d07e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">시각적 뷰 표시 중</translation> <translation id="1928696683969751773">업데이트</translation> <translation id="1939549834451474504">Google Play 서비스를 사용할 수 없으므로 비밀번호가 곧 작동하지 않게 됩니다. 비밀번호가 작동을 중지하기 전에 저장된 비밀번호의 사본을 만들 수 있습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">이제 XR에서 열려 있는 탭의 디자인이 업데이트되었습니다.</translation> <translation id="1943432128510653496">비밀번호 저장</translation> <translation id="1944535645109964458">패스키 없음</translation> <translation id="1957557050935255529">PDF 로드 중…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 5da313f..807d1ff 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Визуалдык көрүнүш</translation> <translation id="1928696683969751773">Жаңыртуулар</translation> <translation id="1939549834451474504">Google Play кызматтары жеткиликсиз болгондуктан, сырсөздөр жакында иштебей калат. Сакталган сырсөздөрүңүздү алар иштебей калганга чейин көчүрүп алсаңыз болот. <ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Кеңейтилген чындыкта ачык өтмөктөрүңүздүн көрүнүшү жаңырды</translation> <translation id="1943432128510653496">Сырсөздөрдү сактоо</translation> <translation id="1944535645109964458">Киргизүүчү ачкычтар жок</translation> <translation id="1957557050935255529">PDF жүктөлүүдө…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 90df3b0..b8b03b0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">ການສະແດງມຸມມອງພາບ</translation> <translation id="1928696683969751773">ອັບເດດ</translation> <translation id="1939549834451474504">ລະຫັດຜ່ານຈະຢຸດເຮັດວຽກໃນໄວໆນີ້ເນື່ອງຈາກບໍລິການ Google Play ບໍ່ພ້ອມນຳໃຊ້. ທ່ານສາມາດສ້າງສຳເນົາລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ກ່ອນທີ່ລະຫັດຜ່ານຈະຢຸດເຮັດວຽກໄດ້. <ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">ຕອນນີ້ແຖບທີ່ເປີດຢູ່ຂອງທ່ານມີຮູບລັກທີ່ອັບເດດໃນ XR ແລ້ວ</translation> <translation id="1943432128510653496">ບັນທຶກລະຫັດຜ່ານ</translation> <translation id="1944535645109964458">ກະແຈຜ່ານໃຊ້ບໍ່ໄດ້</translation> <translation id="1957557050935255529">ກຳລັງໂຫຼດ PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index b3369ce..27e8f2c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Визуал харагдах байдлыг харуулж байна</translation> <translation id="1928696683969751773">Шинэчлэл</translation> <translation id="1939549834451474504">Google Play үйлчилгээ боломжгүй тул нууц үгнүүд удахгүй ажиллахаа болино Та хадгалсан нууц үгнүүдээ ажиллахаа болихоос нь өмнө хуулбарыг нь үүсгэх боломжтой. <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Таны нээлттэй таб одоо XR-т шинэчлэгдсэн төрхтэй боллоо</translation> <translation id="1943432128510653496">Нууц үг хадгалах</translation> <translation id="1944535645109964458">Боломжтой passkey байхгүй</translation> <translation id="1957557050935255529">PDF-г ачаалж байна…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index 60d56c9..fc6849326 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">व्हिज्युअल दृश्य दाखवत आहे</translation> <translation id="1928696683969751773">अपडेट</translation> <translation id="1939549834451474504">Google Play सेवा उपलब्ध नसल्यामुळे पासवर्ड लवकरच काम करणे थांबवतील. तुमच्या सेव्ह केलेल्या पासवर्डनी काम करणे थांबवण्याआधी तुम्ही त्यांची कॉपी तयार करू शकता. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">तुमच्या उघड्या टॅबना आता XR मध्ये अपडेट केलेला लुक आहे</translation> <translation id="1943432128510653496">पासवर्ड सेव्ह करा</translation> <translation id="1944535645109964458">कोणत्याही पासकी उपलब्ध नाहीत</translation> <translation id="1957557050935255529">PDF लोड करत आहे…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index 55c02f3f..fac4fcd2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Menunjukkan paparan visual</translation> <translation id="1928696683969751773">Kemaskinian</translation> <translation id="1939549834451474504">Kata laluan akan berhenti berfungsi tidak lama lagi kerana perkhidmatan Google Play tidak tersedia. Anda boleh membuat salinan kata laluan anda yang telah disimpan sebelum kata laluan tersebut berhenti berfungsi. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Kini tab terbuka anda dengan rupa yang dibaharui dalam XR</translation> <translation id="1943432128510653496">Simpan kata laluan</translation> <translation id="1944535645109964458">Tiada kunci laluan tersedia</translation> <translation id="1957557050935255529">Memuatkan PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index d8919e15..f3304d3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Visuele weergave tonen</translation> <translation id="1928696683969751773">Updates</translation> <translation id="1939549834451474504">Wachtwoorden werken binnenkort niet meer omdat Google Play-services niet beschikbaar is. Je kunt een kopie van je opgeslagen wachtwoorden maken voordat ze niet meer werken. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Je geopende tabbladen hebben nu een vernieuwde look in XR</translation> <translation id="1943432128510653496">Wachtwoorden opslaan</translation> <translation id="1944535645109964458">Geen toegangssleutels beschikbaar</translation> <translation id="1957557050935255529">Pdf laden…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 1f483ec5..ce5e9c5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Viser visuell visning</translation> <translation id="1928696683969751773">Oppdateringer</translation> <translation id="1939549834451474504">Passord slutter å fungere snart fordi Google Play-tjenester ikke er tilgjengelige. Du kan lage en kopi av de lagrede passordene dine før de slutter å fungere. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">De åpne fanene har nå et oppdatert utseende i XR</translation> <translation id="1943432128510653496">Lagring av passord</translation> <translation id="1944535645109964458">Ingen passnøkler er tilgjengelige</translation> <translation id="1957557050935255529">Laster inn PDF …</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index e5b2c3dc..0ee356d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -435,6 +435,7 @@ <translation id="2979639724566107830">ନୂତନ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ</translation> <translation id="2981364137500752533">ଆପଣ 5ଟି ପର୍ଯ୍ୟନ୍ତ ୱିଣ୍ଡୋକୁ ଖୋଲିପାରିବେ।</translation> <translation id="2983102365694924129">କୌଣସି ସାଇଟରେ ଆପଣଙ୍କ କାର୍ଯ୍ୟକଳାପ ଆଧାରରେ। ଏହି ସେଟିଂ ବନ୍ଦ ଅଛି।</translation> +<translation id="2983398917942897288">ନିଷ୍କ୍ରିୟ (<ph name="ITEM_COUNT" />)</translation> <translation id="2984978667043170458">Google ସନ୍ଧାନଗୁଡ଼ିକରେ ଆଖପାଖର ଟେକ୍ସଟକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରନ୍ତୁ</translation> <translation id="2988638966064514052">ଆପଣଙ୍କ ପାସୱାର୍ଡଗୁଡ଼ିକୁ ସୁଦୃଢ଼ କରନ୍ତୁ</translation> <translation id="2989523299700148168">ନିକଟରେ ଯାଇଥିବା</translation> @@ -467,6 +468,7 @@ <translation id="314939179385989105">Chromeର ମୂଳପୃଷ୍ଠା</translation> <translation id="3158667104057012316">ମାନୁଆଲ କ୍ରମରେ ସର୍ଟ କରାଯାଉଛି</translation> <translation id="3159335509547415276">ବ୍ଲକ କରାଯାଇଥିବା ଆକାଉଣ୍ଟଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ</translation> +<translation id="3161699713309727585"><ph name="BUTTON_TEXT" />, ଏକ ନୂଆ ଟାବରେ ଖୋଲେ</translation> <translation id="3166827708714933426">ଟାବ୍ ଏବଂ ୱିଣ୍ଡୋ ସର୍ଟକଟ୍</translation> <translation id="316694332262407393">Chrome ପୂର୍ବରୁ ଏଠାରେ ଚାଲୁଛି।</translation> <translation id="3167258285411721858">ଆପଣ <ph name="HOST_NAME" /> ପାଇଁ ମୋବାଇଲ ସାଇଟ ଅନୁରୋଧ କରିପାରିବେ</translation> @@ -791,6 +793,7 @@ <translation id="469286762610133730">ଆହୁରି ଭଲ ବିଷୟବସ୍ତୁ ପାଆନ୍ତୁ</translation> <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ଏବଂ <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ଅଧିକ}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 ଏବଂ <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> ଅଧିକ}}</translation> <translation id="4698061626562952596">ଆପଣଙ୍କ ନିଷ୍ଟ୍ରିୟ ଟାବଗୁଡ଼ିକୁ ଏଠାରେ ସମୀକ୍ଷା କରନ୍ତୁ</translation> +<translation id="4698757800236023795">ସକ୍ରିୟ (<ph name="ITEM_COUNT" />)</translation> <translation id="4699172675775169585">କେଚ୍ ଛବି ଏବଂ ଫାଇଲ୍</translation> <translation id="4710167854527459075">ସବୁଠୁ ନୂଆ ଅନୁସାରେ ସର୍ଟ କର</translation> <translation id="4718044610319080485">AI ଆସିଷ୍ଟାଣ୍ଟକୁ ଆରମ୍ଭ କରେ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 9c0b5a2c9..02a4d8c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Wyświetlam widok rozszerzony</translation> <translation id="1928696683969751773">Aktualizacje</translation> <translation id="1939549834451474504">Hasła wkrótce przestaną działać, ponieważ usługi Google Play są niedostępne. Zanim zapisane hasła przestaną działać, możesz utworzyć ich kopię. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Otwarte karty mają teraz nowy wygląd w XR</translation> <translation id="1943432128510653496">Zapisuj hasła</translation> <translation id="1944535645109964458">Brak dostępnych kluczy dostępu</translation> <translation id="1957557050935255529">Wczytuję PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index 1a1c8ae..089f9be 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -435,6 +435,7 @@ <translation id="2979639724566107830">Abrir em uma nova janela</translation> <translation id="2981364137500752533">Você pode ter até cinco janelas.</translation> <translation id="2983102365694924129">Com base na sua atividade em um site. Esta configuração está desativada.</translation> +<translation id="2983398917942897288">Guias inativas (<ph name="ITEM_COUNT" />)</translation> <translation id="2984978667043170458">Incluir o texto ao redor nas pesquisas do Google</translation> <translation id="2988638966064514052">Use senhas mais fortes</translation> <translation id="2989523299700148168">Visitados recentemente</translation> @@ -467,6 +468,7 @@ <translation id="314939179385989105">Página inicial do Chrome</translation> <translation id="3158667104057012316">Ordenar manualmente</translation> <translation id="3159335509547415276">Saiba mais sobre contas bloqueadas</translation> +<translation id="3161699713309727585"><ph name="BUTTON_TEXT" />, abre em uma nova guia</translation> <translation id="3166827708714933426">Atalhos de guias e janelas</translation> <translation id="316694332262407393">O Chrome já está aberto.</translation> <translation id="3167258285411721858">Você pode solicitar o site móvel para <ph name="HOST_NAME" /></translation> @@ -792,6 +794,7 @@ <translation id="469286762610133730">Receba conteúdos melhores</translation> <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 e mais <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}one{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 e mais <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 e mais <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation> <translation id="4698061626562952596">Revise suas guias inativas aqui</translation> +<translation id="4698757800236023795">Guias ativas (<ph name="ITEM_COUNT" />)</translation> <translation id="4699172675775169585">Imagens e arquivos armazenados em cache</translation> <translation id="4710167854527459075">Ordenar por mais recente</translation> <translation id="4718044610319080485">Aciona o assistente de IA</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 0a083a2..d877b26 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Apare afișarea vizuală</translation> <translation id="1928696683969751773">Actualizări</translation> <translation id="1939549834451474504">Parolele nu vor mai funcționa în curând deoarece serviciile Google Play nu sunt disponibile. Poți face o copie a parolelor salvate înainte să devină nefuncționale. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Filele deschise au acum un aspect actualizat în XR</translation> <translation id="1943432128510653496">Parole salvate</translation> <translation id="1944535645109964458">Nu sunt disponibile chei de acces</translation> <translation id="1957557050935255529">Se încarcă fișierul PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index 7aa3b0c..82e99289 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Включен расширенный вид</translation> <translation id="1928696683969751773">Обновления</translation> <translation id="1939549834451474504">Сохраненные пароли скоро перестанут работать, потому что сервисы Google Play недоступны. Чтобы не потерять пароли, вы можете сделать их копию. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Открытые вкладки теперь выглядят по-новому в расширенной реальности</translation> <translation id="1943432128510653496">Сохранение паролей</translation> <translation id="1944535645109964458">Ключи доступа не найдены</translation> <translation id="1957557050935255529">Загрузка PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 8e7722b..960a2a2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -435,6 +435,7 @@ <translation id="2979639724566107830">නව කවුළුවක විවෘත කරන්න</translation> <translation id="2981364137500752533">ඔබට කවුළු 5ක් දක්වා තිබිය හැකිය.</translation> <translation id="2983102365694924129">අඩවියක ඔබේ ක්රියාකාරකම් මත පදනම්ව. මෙම සැකසීම ක්රියාවිරහිතයි.</translation> +<translation id="2983398917942897288">අක්රිය (<ph name="ITEM_COUNT" />)</translation> <translation id="2984978667043170458">Google සෙවීම් තුළ අවට පෙළ ඇතුළත් කරන්න</translation> <translation id="2988638966064514052">ඔබේ මුරපද ශක්තිමත් කරන්න</translation> <translation id="2989523299700148168">මෑතදී පිවිසි</translation> @@ -467,6 +468,7 @@ <translation id="314939179385989105">Chrome හි මුල් පිටුව</translation> <translation id="3158667104057012316">හස්තීය අනුපිළිවෙල අනුව වර්ග කිරීම</translation> <translation id="3159335509547415276">අවහිර කළ ගිණුම් පිළිබඳව දැන ගන්න</translation> +<translation id="3161699713309727585"><ph name="BUTTON_TEXT" />, නව පටිත්තක විවෘත වේ</translation> <translation id="3166827708714933426">ටැබ සහ කවුළු කෙටි මං</translation> <translation id="316694332262407393">Chrome දැනටමත් මෙහි ධාවනය වේ.</translation> <translation id="3167258285411721858">ඔබට <ph name="HOST_NAME" /> සඳහා ජංගම අඩවිය ඉල්ලා සිටිය හැක</translation> @@ -791,6 +793,7 @@ <translation id="469286762610133730">ඉතා හොඳ අන්තර්ගතය ලබා ගන්න</translation> <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />... සහ තවත් <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}one{<ph name="SHIPPING_OPTION_PREVIEW" />... සහ තවත් <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}other{<ph name="SHIPPING_OPTION_PREVIEW" />... සහ තවත් <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" />}}</translation> <translation id="4698061626562952596">ඔබේ අක්රිය පටිති මෙහි සමාලෝචනය කරන්න</translation> +<translation id="4698757800236023795">සක්රිය (<ph name="ITEM_COUNT" />)</translation> <translation id="4699172675775169585">අනුරූ සහ ගොනු කෑෂ් කරන්න</translation> <translation id="4710167854527459075">නවතම අනුව වර්ග කරන්න</translation> <translation id="4718044610319080485">AI සහායකයාට ආරාධනා කරයි</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index 6d2518a..6d9274b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -435,6 +435,7 @@ <translation id="2979639724566107830">Hape në një dritare të re</translation> <translation id="2981364137500752533">Mund të kesh deri në 5 dritare.</translation> <translation id="2983102365694924129">Bazuar në aktivitetin tënd në një sajt. Ky cilësim është joaktiv.</translation> +<translation id="2983398917942897288">Joaktiv (<ph name="ITEM_COUNT" />)</translation> <translation id="2984978667043170458">Përfshi tekstin përreth në kërkimet e Google</translation> <translation id="2988638966064514052">Forco fjalëkalimet e tua</translation> <translation id="2989523299700148168">Vizituar së fundi</translation> @@ -467,6 +468,7 @@ <translation id="314939179385989105">Faqja kryesore e Chrome</translation> <translation id="3158667104057012316">Po renditen sipas renditjes manuale</translation> <translation id="3159335509547415276">Mëso rreth llogarive të bllokuara</translation> +<translation id="3161699713309727585"><ph name="BUTTON_TEXT" />; hapet në një skedë të re</translation> <translation id="3166827708714933426">Shkurtoret e skedës dhe dritares</translation> <translation id="316694332262407393">Chrome është tashmë duke u ekzekutuar këtu.</translation> <translation id="3167258285411721858">Mund të kërkosh sajtin për celular për <ph name="HOST_NAME" /></translation> @@ -791,6 +793,7 @@ <translation id="469286762610133730">Merr përmbajtje më të mirë</translation> <translation id="4695891336199304370">{SHIPPING_OPTIONS,plural, =1{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 dhe <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> tjetër}other{<ph name="SHIPPING_OPTION_PREVIEW" />\u2026 dhe <ph name="NUMBER_OF_ADDITIONAL_SHIPPING_OPTIONS" /> të tjera}}</translation> <translation id="4698061626562952596">Rishiko skedat e tua joaktive këtu</translation> +<translation id="4698757800236023795">Aktiv (<ph name="ITEM_COUNT" />)</translation> <translation id="4699172675775169585">Imazhet dhe skedarët në memorien specifike</translation> <translation id="4710167854527459075">Rendit nga më i riu</translation> <translation id="4718044610319080485">Thërret asistentin me IA-në</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index d52db22..9d004f52 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Visar visuell vy</translation> <translation id="1928696683969751773">Uppdateringar</translation> <translation id="1939549834451474504">Lösenorden slutar snart att fungera eftersom Google Play-tjänster inte är tillgängliga. Du kan kopiera dina sparade lösenord innan de slutar fungera. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Dina öppna flikar har nu ett uppdaterat utseende i XR</translation> <translation id="1943432128510653496">Spara lösenord</translation> <translation id="1944535645109964458">Inga nycklar är tillgängliga</translation> <translation id="1957557050935255529">Läser in PDF …</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index 3019ffec..a0a09fe3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">விஷுவல் காட்சியில் காட்டுகிறது</translation> <translation id="1928696683969751773">புதுப்பிப்புகள்</translation> <translation id="1939549834451474504">Google Play சேவைகள் இல்லாததால் கடவுச்சொற்கள் விரைவில் செயல்படாமல் போகும். நீங்கள் சேமித்த கடவுச்சொற்கள் செயல்படாமல் போவதற்கு முன்பு அவற்றை நகலெடுக்கலாம். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">இப்போது XRரில் உள்ள திறந்துள்ள பக்கங்களின் தோற்றத்தைப் புதுப்பித்துள்ளோம்</translation> <translation id="1943432128510653496">கடவுச்சொற்களைச் சேமி</translation> <translation id="1944535645109964458">கடவுக்குறியீடுகள் எதுவுமில்லை</translation> <translation id="1957557050935255529">PDFஐ ஏற்றுகிறது…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 3554dd3..57731eb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">Показано візуальний перегляд</translation> <translation id="1928696683969751773">Оновлення</translation> <translation id="1939549834451474504">Паролі припинять працювати, оскільки сервіси Google Play недоступні. Перш ніж це станеться, ви можете створити копію збережених паролів. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">Відкриті вкладки тепер мають новий вигляд у розширеній реальності</translation> <translation id="1943432128510653496">Зберігання паролів</translation> <translation id="1944535645109964458">Ключів доступу не знайдено</translation> <translation id="1957557050935255529">Завантаження файлу PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index d315d16..7e3ff5a9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">当前显示的是直观视图</translation> <translation id="1928696683969751773">更新</translation> <translation id="1939549834451474504">由于无法使用 Google Play 服务,已保存的密码即将失效。您可以在密码失效之前备份这些密码。<ph name="BEGIN_LINK" />了解详情<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">现在扩展现实设备中打开的标签页外观焕然一新</translation> <translation id="1943432128510653496">保存密码</translation> <translation id="1944535645109964458">没有可用的通行密钥</translation> <translation id="1957557050935255529">正在加载 PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 12dc744..f78c4a7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">顯示緊視覺化檢視</translation> <translation id="1928696683969751773">更新</translation> <translation id="1939549834451474504">由於無法使用 Google Play 服務,密碼即將停止運作。你可在此之前複製已儲存的密碼。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">XR 中開啟的分頁已換上全新外觀。</translation> <translation id="1943432128510653496">儲存密碼</translation> <translation id="1944535645109964458">沒有密鑰</translation> <translation id="1957557050935255529">正在載入 PDF…</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 9eace4aa..6732727 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -208,6 +208,7 @@ <translation id="1928618076168182477">目前顯示的是視覺化檢視</translation> <translation id="1928696683969751773">更新</translation> <translation id="1939549834451474504">由於無法使用 Google Play 服務,密碼即將停止運作。在密碼失效前,你可以複製已儲存的密碼。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> +<translation id="1943398124995840148">現在 XR 中開啟的分頁外觀煥然一新</translation> <translation id="1943432128510653496">儲存密碼</translation> <translation id="1944535645109964458">沒有密碼金鑰</translation> <translation id="1957557050935255529">正在載入 PDF…</translation>
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java index ad191fd..749a65b9 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java
@@ -35,6 +35,8 @@ import org.chromium.base.supplier.ObservableSupplierImpl; import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.Features.EnableFeatures; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.layouts.LayoutType; import org.chromium.chrome.browser.tab_ui.TabModelDotInfo; @@ -319,6 +321,7 @@ } @Test + @EnableFeatures(ChromeFeatureList.TAB_STRIP_INCOGNITO_MIGRATION) public void testSwitchToIncognitoIphIsShown() { ToggleTabStackButtonCoordinator toggleTabStackButtonCoordinator = newToggleTabStackButtonCoordinator(
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc index 8c6140d4..e1e8bcfe 100644 --- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc +++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller.cc
@@ -633,8 +633,7 @@ return chrome::HasBookmarkURLs(selection_); case IDC_BOOKMARK_BAR_OPEN_SPLIT_VIEW: return chrome::HasBookmarkURLs(selection_) && - base::FeatureList::IsEnabled(features::kSideBySide) && browser_ && - !browser_->GetActiveTabInterface()->IsSplit(); + base::FeatureList::IsEnabled(features::kSideBySide); case IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW: return chrome::HasBookmarkURLs(selection_) && incognito_avail != policy::IncognitoModeAvailability::kForced;
diff --git a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc index 747580d5..3891d9b 100644 --- a/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc +++ b/chrome/browser/ui/bookmarks/bookmark_context_menu_controller_unittest.cc
@@ -184,7 +184,7 @@ controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); EXPECT_TRUE( controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); - EXPECT_FALSE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_SPLIT_VIEW)); + EXPECT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_OPEN_SPLIT_VIEW)); EXPECT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_REMOVE)); EXPECT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); EXPECT_TRUE(controller.IsCommandIdEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER));
diff --git a/chrome/browser/ui/color/chrome_color_id.h b/chrome/browser/ui/color/chrome_color_id.h index f836c73..d3f5d447 100644 --- a/chrome/browser/ui/color/chrome_color_id.h +++ b/chrome/browser/ui/color/chrome_color_id.h
@@ -39,10 +39,12 @@ E_CPONLY(kColorAvatarButtonHighlightSigninPaused) \ E_CPONLY(kColorAvatarButtonHighlightExplicitText) \ E_CPONLY(kColorAvatarButtonHighlightIncognito) \ + E_CPONLY(kColorAvatarButtonHighlightManagement) \ E_CPONLY(kColorAvatarButtonHighlightNormalForeground) \ E_CPONLY(kColorAvatarButtonHighlightDefaultForeground) \ E_CPONLY(kColorAvatarButtonHighlightSyncErrorForeground) \ E_CPONLY(kColorAvatarButtonHighlightIncognitoForeground) \ + E_CPONLY(kColorAvatarButtonHighlightManagementForeground) \ E_CPONLY(kColorAvatarButtonIncognitoHover) \ E_CPONLY(kColorAvatarButtonNormalRipple) \ E_CPONLY(kColorAvatarStroke) \
diff --git a/chrome/browser/ui/color/material_chrome_color_mixer.cc b/chrome/browser/ui/color/material_chrome_color_mixer.cc index 32b371e..497a6b4 100644 --- a/chrome/browser/ui/color/material_chrome_color_mixer.cc +++ b/chrome/browser/ui/color/material_chrome_color_mixer.cc
@@ -33,6 +33,11 @@ mixer[kColorAppMenuHighlightSeverityLow] = {kColorAppMenuHighlightDefault}; mixer[kColorAppMenuHighlightSeverityMedium] = {kColorAppMenuHighlightDefault}; mixer[kColorAppMenuHighlightSeverityHigh] = {kColorAppMenuHighlightDefault}; + + mixer[kColorAvatarButtonHighlightManagementForeground] = { + kColorAppMenuExpandedForegroundDefault}; + mixer[kColorAvatarButtonHighlightManagement] = { + kColorAppMenuHighlightDefault}; } } // namespace
diff --git a/chrome/browser/ui/hats/survey_config.cc b/chrome/browser/ui/hats/survey_config.cc index 1a259d2..502954d 100644 --- a/chrome/browser/ui/hats/survey_config.cc +++ b/chrome/browser/ui/hats/survey_config.cc
@@ -68,15 +68,7 @@ constexpr char kHatsSurveyTriggerNtpModules[] = "ntp-modules"; constexpr char kHatsSurveyTriggerNtpPhotosModuleOptOut[] = "ntp-photos-module-opt-out"; -constexpr char kHatsSurveyTriggerPerformanceControlsPerformance[] = - "performance-general"; constexpr char kHatsSurveyTriggerPerformanceControlsPPM[] = "performance-ppm"; -constexpr char kHatsSurveyTriggerPerformanceControlsBatteryPerformance[] = - "performance-battery"; -constexpr char kHatsSurveyTriggerPerformanceControlsMemorySaverOptOut[] = - "performance-high-efficiency-opt-out"; -constexpr char kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut[] = - "performance-battery-saver-opt-out"; // The permission prompt trigger permits configuring multiple triggers // simultaneously. Each trigger increments a counter at the end --> // "permission-prompt0", "permission-prompt1", ... @@ -485,13 +477,6 @@ // Performance Controls surveys. survey_configs.emplace_back( - &performance_manager::features::kPerformanceControlsPerformanceSurvey, - kHatsSurveyTriggerPerformanceControlsPerformance, - /*presupplied_trigger_id=*/std::nullopt, - std::vector<std::string>{"Memory Saver Mode Enabled", - "Battery Saver Mode Enabled"}, - std::vector<std::string>{}); - survey_configs.emplace_back( &performance_manager::features::kPerformanceControlsPPMSurvey, kHatsSurveyTriggerPerformanceControlsPPM, /*presupplied_trigger_id=*/std::nullopt, @@ -504,22 +489,6 @@ "Performance Characteristics (OS and Total Memory)"}, /*log_responses_to_uma=*/true, /*log_responses_to_ukm=*/true); - survey_configs.emplace_back( - &performance_manager::features:: - kPerformanceControlsBatteryPerformanceSurvey, - kHatsSurveyTriggerPerformanceControlsBatteryPerformance, - /*presupplied_trigger_id=*/std::nullopt, - std::vector<std::string>{"Memory Saver Mode Enabled", - "Battery Saver Mode Enabled"}, - std::vector<std::string>{}); - survey_configs.emplace_back( - &performance_manager::features:: - kPerformanceControlsMemorySaverOptOutSurvey, - kHatsSurveyTriggerPerformanceControlsMemorySaverOptOut); - survey_configs.emplace_back( - &performance_manager::features:: - kPerformanceControlsBatterySaverOptOutSurvey, - kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut); // Red Warning surveys. survey_configs.emplace_back(
diff --git a/chrome/browser/ui/hats/survey_config.h b/chrome/browser/ui/hats/survey_config.h index 538fab3..f036eef 100644 --- a/chrome/browser/ui/hats/survey_config.h +++ b/chrome/browser/ui/hats/survey_config.h
@@ -33,11 +33,7 @@ extern const char kHatsSurveyTriggerLensOverlayResults[]; extern const char kHatsSurveyTriggerNtpModules[]; extern const char kHatsSurveyTriggerNtpPhotosModuleOptOut[]; -extern const char kHatsSurveyTriggerPerformanceControlsPerformance[]; extern const char kHatsSurveyTriggerPerformanceControlsPPM[]; -extern const char kHatsSurveyTriggerPerformanceControlsBatteryPerformance[]; -extern const char kHatsSurveyTriggerPerformanceControlsMemorySaverOptOut[]; -extern const char kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut[]; extern const char kHatsSurveyTriggerPrivacyGuide[]; extern const char kHatsSurveyTriggerRedWarning[]; extern const char kHatsSurveyTriggerSafetyHubOneOffExperimentControl[];
diff --git a/chrome/browser/ui/lens/lens_search_controller.cc b/chrome/browser/ui/lens/lens_search_controller.cc index 23be008..94f012d 100644 --- a/chrome/browser/ui/lens/lens_search_controller.cc +++ b/chrome/browser/ui/lens/lens_search_controller.cc
@@ -492,6 +492,10 @@ lens_session_metrics_logger_->OnSessionStart(invocation_source, tab_->GetContents()); + // Let the searchbox controller know that a new session has started so it can + // initialize any data needed for the searchbox. + lens_searchbox_controller_->OnSessionStart(); + // Reset session state. hats_triggered_in_session_ = false; }
diff --git a/chrome/browser/ui/lens/lens_searchbox_controller.cc b/chrome/browser/ui/lens/lens_searchbox_controller.cc index 614fd4f5..d8f5d46 100644 --- a/chrome/browser/ui/lens/lens_searchbox_controller.cc +++ b/chrome/browser/ui/lens/lens_searchbox_controller.cc
@@ -28,6 +28,11 @@ : lens_search_controller_(lens_search_controller) {} LensSearchboxController::~LensSearchboxController() = default; +void LensSearchboxController::OnSessionStart() { + // Initialize any data needed for the searchbox. + init_data_ = std::make_unique<LensSearchboxInitializationData>(); +} + void LensSearchboxController::SetSidePanelSearchboxHandler( std::unique_ptr<LensSearchboxHandler> handler) { side_panel_searchbox_handler_ = std::move(handler); @@ -49,6 +54,7 @@ void LensSearchboxController::SetSearchboxInputText(const std::string& text) { if (side_panel_searchbox_handler_ && side_panel_searchbox_handler_->IsRemoteBound()) { + init_data_->text_query = text; side_panel_searchbox_handler_->SetInputText(text); } else { // If the side panel was not bound at the time of request, we store the @@ -61,8 +67,8 @@ const std::string& thumbnail_uri) { if (side_panel_searchbox_handler_ && side_panel_searchbox_handler_->IsRemoteBound()) { + init_data_->thumbnail_uri = thumbnail_uri; side_panel_searchbox_handler_->SetThumbnail(thumbnail_uri); - selected_region_thumbnail_uri_ = thumbnail_uri; } else { // If the side panel was not bound at the time of request, we store the // thumbnail as pending to send it to the searchbox on bind. @@ -72,15 +78,15 @@ void LensSearchboxController::HandleThumbnailCreated( const std::string& thumbnail_bytes) { - selected_region_thumbnail_uri_ = + init_data_->thumbnail_uri = webui::MakeDataURIForImage(base::as_byte_span(thumbnail_bytes), "jpeg"); - SetSearchboxThumbnail(selected_region_thumbnail_uri_); + SetSearchboxThumbnail(init_data_->thumbnail_uri); } void LensSearchboxController::CloseUI() { overlay_searchbox_handler_.reset(); side_panel_searchbox_handler_.reset(); - selected_region_thumbnail_uri_ = ""; + init_data_ = std::make_unique<LensSearchboxInitializationData>(); pending_text_query_ = std::nullopt; pending_thumbnail_uri_ = std::nullopt; } @@ -122,13 +128,13 @@ state == LensOverlayController::State::kOverlay) { return metrics::OmniboxEventProto::CONTEXTUAL_SEARCHBOX; } - return selected_region_thumbnail_uri_.empty() + return init_data_->thumbnail_uri.empty() ? metrics::OmniboxEventProto::SEARCH_SIDE_PANEL_SEARCHBOX : metrics::OmniboxEventProto::LENS_SIDE_PANEL_SEARCHBOX; } std::string& LensSearchboxController::GetThumbnail() { - return selected_region_thumbnail_uri_; + return init_data_->thumbnail_uri; } const lens::proto::LensOverlaySuggestInputs& @@ -216,13 +222,13 @@ /*is_initial_query=*/!IsSidePanelSearchbox()); } -content::WebContents* LensSearchboxController::GetTabWebContents() const { - return lens_search_controller_->GetTabInterface()->GetContents(); -} - void LensSearchboxController::AddSearchboxStateToSearchQuery( lens::SearchQuery& search_query) { - search_query.selected_region_thumbnail_uri_ = selected_region_thumbnail_uri_; + search_query.selected_region_thumbnail_uri_ = init_data_->thumbnail_uri; +} + +content::WebContents* LensSearchboxController::GetTabWebContents() const { + return lens_search_controller_->GetTabInterface()->GetContents(); } } // namespace lens
diff --git a/chrome/browser/ui/lens/lens_searchbox_controller.h b/chrome/browser/ui/lens/lens_searchbox_controller.h index 4fa5cea..9364c87c 100644 --- a/chrome/browser/ui/lens/lens_searchbox_controller.h +++ b/chrome/browser/ui/lens/lens_searchbox_controller.h
@@ -32,6 +32,10 @@ LensSearchController* lens_search_controller); ~LensSearchboxController() override; + // Must be called at the start of a session so the proper state is + // initialized. + void OnSessionStart(); + // This method is used to set up communication between this instance and the // searchbox WebUI. This is called by the WebUIController when the WebUI is // executing javascript and has bound the handler. Takes ownership of @@ -102,6 +106,19 @@ // Adds searchbox related state to the search query. void AddSearchboxStateToSearchQuery(lens::SearchQuery& search_query); + private: + // Data class for storing state for the searchbox. + struct LensSearchboxInitializationData { + public: + LensSearchboxInitializationData() = default; + ~LensSearchboxInitializationData() = default; + // The text query in the searchbox. + std::string text_query = ""; + + // The URI of the thumbnail in the searchbox. + std::string thumbnail_uri = ""; + }; + // Returns the WebContents associated with the tab this instance of Lens is // invoked on. content::WebContents* GetTabWebContents() const; @@ -130,10 +147,8 @@ // currently unused. std::unique_ptr<LensSearchboxHandler> overlay_searchbox_handler_; - // Thumbnail URI referencing the data defined by the user image selection on - // the overlay. If the user hasn't made any selection or has made a text - // selection this will contain an empty string. Returned by GetThumbnail(). - std::string selected_region_thumbnail_uri_; + // The assembly data needed for the side panel entry to be created and shown. + std::unique_ptr<LensSearchboxInitializationData> init_data_; // A pending text query to be loaded in the side panel. Needed when the side // panel is not bound at the time of a text request.
diff --git a/chrome/browser/ui/managed_ui_browsertest.cc b/chrome/browser/ui/managed_ui_browsertest.cc index 2501eb6..0191990 100644 --- a/chrome/browser/ui/managed_ui_browsertest.cc +++ b/chrome/browser/ui/managed_ui_browsertest.cc
@@ -291,7 +291,16 @@ GetManagedUiIcon(profile.get()).name); } -IN_PROC_BROWSER_TEST_F(ManagedUiTest, GetManagedUiMenuLinkUrlEnterprise) { +// TODO(https://crbug.com/410751413): Deleting temporary directories using +// test_file_util is flaky on Windows. +#if BUILDFLAG(IS_WIN) +#define MAYBE_GetManagedUiMenuLinkUrlEnterprise \ + DISABLED_GetManagedUiMenuLinkUrlEnterprise +#else +#define MAYBE_GetManagedUiMenuLinkUrlEnterprise \ + GetManagedUiMenuLinkUrlEnterprise +#endif +IN_PROC_BROWSER_TEST_F(ManagedUiTest, MAYBE_GetManagedUiMenuLinkUrlEnterprise) { // Simulate a managed device. AddEnterpriseManagedPolicies(); policy::ScopedManagementServiceOverrideForTesting browser_management(
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc index 6537b8a..0c184bc 100644 --- a/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc +++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc
@@ -42,38 +42,6 @@ base::RandTimeDelta(kPerformanceControlsPPMSurveyMinDelay.Get(), kPerformanceControlsPPMSurveyMaxDelay.Get())) { CHECK(delay_before_ppm_survey_.is_positive()); - if (base::FeatureList::IsEnabled( - performance_manager::features:: - kPerformanceControlsMemorySaverOptOutSurvey)) { - performance_manager::user_tuning::UserPerformanceTuningManager:: - GetInstance() - ->AddObserver(this); - } - - if (base::FeatureList::IsEnabled( - performance_manager::features:: - kPerformanceControlsBatterySaverOptOutSurvey)) { - performance_manager::user_tuning::BatterySaverModeManager::GetInstance() - ->AddObserver(this); - } -} - -PerformanceControlsHatsService::~PerformanceControlsHatsService() { - // Can't used ScopedObservation because sometimes the - // UserPerformanceTuningManager or BatterySaverModeManager are destroyed - // before this service. - if (performance_manager::user_tuning::UserPerformanceTuningManager:: - HasInstance()) { - performance_manager::user_tuning::UserPerformanceTuningManager:: - GetInstance() - ->RemoveObserver(this); - } - - if (performance_manager::user_tuning::BatterySaverModeManager:: - HasInstance()) { - performance_manager::user_tuning::BatterySaverModeManager::GetInstance() - ->RemoveObserver(this); - } } void PerformanceControlsHatsService::OpenedNewTabPage() { @@ -107,11 +75,6 @@ } }; - // A general performance survey for all users. - launch_survey_if_enabled( - performance_manager::features::kPerformanceControlsPerformanceSurvey, - kHatsSurveyTriggerPerformanceControlsPerformance); - // Survey to correlate UMA metrics with Poor Performance Moments. if (auto ppm_segment_name = GetPPMSurveySegmentName(); !ppm_segment_name.empty() && MayLaunchPPMSurvey()) { @@ -124,57 +87,6 @@ {{kPerformanceSegmentPSDName, ppm_segment_name}, {kChannelPSDName, channel.empty() ? "stable" : channel}}); } - -#if BUILDFLAG(IS_CHROMEOS) - // ChromeOS defaults to the OS battery saver so this survey isn't relevant. -#else - base::Time last_battery_timestamp = - performance_manager::user_tuning::BatterySaverModeManager::GetInstance() - ->GetLastBatteryUsageTimestamp(); - - // A battery performance survey for users with a battery-powered device. - if (base::Time::Now() - last_battery_timestamp <= - performance_manager::features::kPerformanceControlsBatterySurveyLookback - .Get()) { - launch_survey_if_enabled( - performance_manager::features:: - kPerformanceControlsBatteryPerformanceSurvey, - kHatsSurveyTriggerPerformanceControlsBatteryPerformance); - } -#endif -} - -void PerformanceControlsHatsService::OnBatterySaverModeChanged( - bool is_enabled) { - HatsService* hats_service = HatsServiceFactory::GetForProfile(profile_, true); - if (!hats_service) { - return; - } - - auto* manager = - performance_manager::user_tuning::BatterySaverModeManager::GetInstance(); - // A survey for users who have turned off battery saver. - if (!is_enabled && !manager->IsBatterySaverModeManaged()) { - hats_service->LaunchDelayedSurvey( - kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut, 10000); - } -} - -void PerformanceControlsHatsService::OnMemorySaverModeChanged() { - HatsService* hats_service = HatsServiceFactory::GetForProfile(profile_, true); - if (!hats_service) { - return; - } - - auto* manager = performance_manager::user_tuning:: - UserPerformanceTuningManager::GetInstance(); - // A survey for users who have turned off memory saver mode. - if (!manager->IsMemorySaverModeActive() && - !manager->IsMemorySaverModeManaged() && - !manager->IsMemorySaverModeDefault()) { - hats_service->LaunchDelayedSurvey( - kHatsSurveyTriggerPerformanceControlsMemorySaverOptOut, 10000); - } } bool PerformanceControlsHatsService::MayLaunchPPMSurvey() const {
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service.h b/chrome/browser/ui/performance_controls/performance_controls_hats_service.h index c9e8af2f..e8fa587c 100644 --- a/chrome/browser/ui/performance_controls/performance_controls_hats_service.h +++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service.h
@@ -9,17 +9,10 @@ #include <string> #include "base/time/time.h" -#include "chrome/browser/performance_manager/public/user_tuning/battery_saver_mode_manager.h" -#include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h" #include "chrome/browser/profiles/profile.h" #include "components/keyed_service/core/keyed_service.h" -class PerformanceControlsHatsService - : public KeyedService, - public performance_manager::user_tuning::UserPerformanceTuningManager:: - Observer, - public performance_manager::user_tuning::BatterySaverModeManager:: - Observer { +class PerformanceControlsHatsService : public KeyedService { public: // Names of Product Specific Data bit entries. static constexpr char kBatterySaverPSDName[] = "Battery Saver Mode Enabled"; @@ -32,22 +25,11 @@ "Performance Characteristics (OS and Total Memory)"; explicit PerformanceControlsHatsService(Profile* profile); - ~PerformanceControlsHatsService() override; // Called when the user opens an NTP. This allows the service to check if one // of the performance controls surveys should be shown. void OpenedNewTabPage(); - // BatterySaverModeManager::Observer: - // Called in response to a change in the battery saver mode pref to check - // whether a HaTS survey should be shown. - void OnBatterySaverModeChanged(bool is_active) override; - - // performance_manager::user_tuning::UserPerformanceTuningManager::Observer: - // Called in response to a change in the memory saver mode pref to check - // whether a HaTS survey should be shown. - void OnMemorySaverModeChanged() override; - // Returns the delay that must pass after the session starts before showing // the PPM survey. base::TimeDelta delay_before_ppm_survey() const {
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc index 24d4e33..d619b15 100644 --- a/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc +++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc
@@ -43,19 +43,7 @@ // static bool PerformanceControlsHatsServiceFactory::IsAnySurveyFeatureEnabled() { return base::FeatureList::IsEnabled( - performance_manager::features:: - kPerformanceControlsPerformanceSurvey) || - base::FeatureList::IsEnabled( - performance_manager::features::kPerformanceControlsPPMSurvey) || - base::FeatureList::IsEnabled( - performance_manager::features:: - kPerformanceControlsBatteryPerformanceSurvey) || - base::FeatureList::IsEnabled( - performance_manager::features:: - kPerformanceControlsMemorySaverOptOutSurvey) || - base::FeatureList::IsEnabled( - performance_manager::features:: - kPerformanceControlsBatterySaverOptOutSurvey); + performance_manager::features::kPerformanceControlsPPMSurvey); } std::unique_ptr<KeyedService>
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc index 8011bef..1aa16d92 100644 --- a/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc +++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc
@@ -54,6 +54,7 @@ } // namespace +// TODO(agale): Remove base class and consolidate with PPM class. class PerformanceControlsHatsServiceTest : public testing::Test { public: PerformanceControlsHatsServiceTest() = default; @@ -117,10 +118,7 @@ environment_; virtual const std::vector<base::test::FeatureRefAndParams> GetFeatures() { - return { - {performance_manager::features::kPerformanceControlsPerformanceSurvey, - {}}, - }; + return {}; } private: @@ -134,118 +132,6 @@ raw_ptr<MockHatsService> mock_hats_service_; }; -class PerformanceControlsHatsServiceHasBatteryTest - : public PerformanceControlsHatsServiceTest { - public: - void SetUp() override { - PerformanceControlsHatsServiceTest::SetUp(); - - // Set the battery status so DeviceHasBattery() returns true. - environment_.battery_level_provider()->SetBatteryState( - base::test::TestBatteryLevelProvider::CreateBatteryState()); - environment_.sampling_source()->SimulateEvent(); - - // Set a recent value for the last battery usage. - local_state()->SetTime( - performance_manager::user_tuning::prefs::kLastBatteryUseTimestamp, - base::Time::Now()); - } - - protected: - const std::vector<base::test::FeatureRefAndParams> GetFeatures() override { - return { - {performance_manager::features:: - kPerformanceControlsBatteryPerformanceSurvey, - {}}, - }; - } -}; - -class PerformanceControlsHatsServiceMemorySaverOptOutTest - : public PerformanceControlsHatsServiceTest { - protected: - const std::vector<base::test::FeatureRefAndParams> GetFeatures() override { - return { - {performance_manager::features:: - kPerformanceControlsMemorySaverOptOutSurvey, - {}}, - }; - } -}; - -class PerformanceControlsHatsServiceBatterySaverOptOutTest - : public PerformanceControlsHatsServiceTest { - protected: - const std::vector<base::test::FeatureRefAndParams> GetFeatures() override { - return { - {performance_manager::features:: - kPerformanceControlsBatterySaverOptOutSurvey, - {}}, - }; - } -}; - -TEST_F(PerformanceControlsHatsServiceTest, LaunchesPerformanceSurvey) { - SetMemorySaverEnabled(false); - -// Battery Saver is controlled by the OS on ChromeOS -#if BUILDFLAG(IS_CHROMEOS) - const bool cros_battery_saver = ash::features::IsBatterySaverAvailable(); - - // Enable Chrome Battery Saver if CrOS Battery Saver isn't used. - const bool battery_saver_mode = !cros_battery_saver; - if (!cros_battery_saver) { - SetBatterySaverMode(performance_manager::user_tuning::prefs:: - BatterySaverModeState::kEnabledBelowThreshold); - } -#else - SetBatterySaverMode(performance_manager::user_tuning::prefs:: - BatterySaverModeState::kEnabledBelowThreshold); - const bool battery_saver_mode = true; -#endif - - SurveyBitsData expected_bits = {{kMemorySaverPSDName, false}, - {kBatterySaverPSDName, battery_saver_mode}}; - SurveyStringData expected_strings = {}; - EXPECT_CALL(*mock_hats_service(), - LaunchSurvey(kHatsSurveyTriggerPerformanceControlsPerformance, _, - _, expected_bits, expected_strings, _, _)); - performance_controls_hats_service()->OpenedNewTabPage(); -} - -// Battery Saver is controlled by the OS on ChromeOS -#if !BUILDFLAG(IS_CHROMEOS) - -TEST_F(PerformanceControlsHatsServiceHasBatteryTest, - LaunchesBatteryPerformanceSurvey) { - EXPECT_CALL( - *mock_hats_service(), - LaunchSurvey(kHatsSurveyTriggerPerformanceControlsBatteryPerformance, _, - _, _, _, _, _)); - performance_controls_hats_service()->OpenedNewTabPage(); -} - -TEST_F(PerformanceControlsHatsServiceBatterySaverOptOutTest, - LaunchesBatterySaverOptOutSurvey) { - EXPECT_CALL(*mock_hats_service(), - LaunchDelayedSurvey( - kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut, - 10000, _, _)); - SetBatterySaverMode(performance_manager::user_tuning::prefs:: - BatterySaverModeState::kDisabled); -} - -#endif // !BUILDFLAG(IS_CHROMEOS) - -TEST_F(PerformanceControlsHatsServiceMemorySaverOptOutTest, - LaunchesMemorySaverOptOutSurvey) { - EXPECT_CALL( - *mock_hats_service(), - LaunchDelayedSurvey( - kHatsSurveyTriggerPerformanceControlsMemorySaverOptOut, 10000, _, _)); - SetMemorySaverEnabled(false); -} - class PerformanceControlsHatsServicePPMTest : public PerformanceControlsHatsServiceTest { protected: @@ -506,65 +392,3 @@ performance_controls_hats_service()->delay_before_ppm_survey()); performance_controls_hats_service()->OpenedNewTabPage(); } - -class PerformanceControlsHatsServiceDestructorTest : public testing::Test { - public: - PerformanceControlsHatsServiceDestructorTest() = default; - - void SetUp() override { - testing::Test::SetUp(); - - profile_manager_ = std::make_unique<TestingProfileManager>( - TestingBrowserProcess::GetGlobal()); - ASSERT_TRUE(profile_manager_->SetUp()); - TestingProfile* profile = profile_manager_->CreateTestingProfile("Test"); - - performance_manager::user_tuning::prefs::RegisterLocalStatePrefs( - local_state_.registry()); - environment_.SetUp(&local_state_); - - feature_list_.InitWithFeaturesAndParameters( - { - {performance_manager::features:: - kPerformanceControlsBatterySaverOptOutSurvey, - {}}, - }, - {}); - - performance_controls_hats_service_ = - std::make_unique<PerformanceControlsHatsService>(profile); - } - - void TearDown() override { testing::Test::TearDown(); } - - void ResetPerformanceControlsHatsService() { - performance_controls_hats_service_.reset(); - } - - void ResetBatterySaverModeManager() { environment_.TearDown(); } - - protected: - performance_manager::user_tuning::TestUserPerformanceTuningManagerEnvironment - environment_; - - private: - content::BrowserTaskEnvironment task_environment_; - base::test::ScopedFeatureList feature_list_; - TestingPrefServiceSimple local_state_; - std::unique_ptr<TestingProfileManager> profile_manager_; - std::unique_ptr<PerformanceControlsHatsService> - performance_controls_hats_service_; -}; - -TEST_F(PerformanceControlsHatsServiceDestructorTest, - HandlesBatterySaverModeManagerDestruction) { - EXPECT_TRUE( - performance_manager::user_tuning::BatterySaverModeManager::HasInstance()); - ResetBatterySaverModeManager(); - - EXPECT_FALSE( - performance_manager::user_tuning::BatterySaverModeManager::HasInstance()); - // Check that destroying the PerformanceControlsHatsService after the - // BatterySaverModeManager doesn't cause UAF. - ResetPerformanceControlsHatsService(); -}
diff --git a/chrome/browser/ui/safety_hub/revoked_permissions_service_browsertest.cc b/chrome/browser/ui/safety_hub/revoked_permissions_service_browsertest.cc index f48553e8..3288f4d 100644 --- a/chrome/browser/ui/safety_hub/revoked_permissions_service_browsertest.cc +++ b/chrome/browser/ui/safety_hub/revoked_permissions_service_browsertest.cc
@@ -631,6 +631,7 @@ : public RevokedPermissionsServiceBrowserTest { public: DisruptiveNotificationPermissionsRevocationBrowserTest() { +#if BUILDFLAG(IS_ANDROID) feature_list_.InitAndEnableFeatureWithParameters( features::kSafetyHubDisruptiveNotificationRevocation, {{features::kSafetyHubDisruptiveNotificationRevocationShadowRun.name, @@ -639,6 +640,19 @@ kSafetyHubDisruptiveNotificationRevocationWaitingForMetricsDays .name, "7"}}); +#else + feature_list_.InitWithFeaturesAndParameters( + /*enabled_features=*/ + {{features::kSafetyHubDisruptiveNotificationRevocation, + {{features::kSafetyHubDisruptiveNotificationRevocationShadowRun.name, + "false"}, + {features:: + kSafetyHubDisruptiveNotificationRevocationWaitingForMetricsDays + .name, + "7"}}}}, + /*disabled_features=*/{ + safe_browsing::kShowWarningsForSuspiciousNotifications}); +#endif } void SetUpOnMainThread() override {
diff --git a/chrome/browser/ui/startup/infobar_utils.cc b/chrome/browser/ui/startup/infobar_utils.cc index d953dc89..3c804646 100644 --- a/chrome/browser/ui/startup/infobar_utils.cc +++ b/chrome/browser/ui/startup/infobar_utils.cc
@@ -43,6 +43,11 @@ #include "chrome/browser/ui/ui_features.h" #endif +#if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) +#include "chrome/browser/global_features.h" +#include "chrome/browser/win/installer_downloader/installer_downloader_controller.h" +#endif + namespace { bool ShouldShowBadFlagsSecurityWarnings() { #if !BUILDFLAG(IS_CHROMEOS) @@ -175,6 +180,13 @@ } } +#if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) + if (auto* controller = g_browser_process->GetFeatures() + ->installer_downloader_controller()) { + controller->MaybeShowInfoBar(); + } +#endif + #if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID) if (!is_web_app && !startup_command_line.HasSwitch(switches::kNoDefaultBrowserCheck)) {
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc index b15a50ac..ca0af03 100644 --- a/chrome/browser/ui/ui_features.cc +++ b/chrome/browser/ui/ui_features.cc
@@ -320,6 +320,10 @@ "ManagedProfileRequiredInterstitial", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kEnableAppMenuButtonColorsForDefaultAvatarButtonStates, + "EnableAppMenuButtonColorsForDefaultAvatarButtonStates", + base::FEATURE_ENABLED_BY_DEFAULT); + // Enables a web-based tab strip. See https://crbug.com/989131. Note this // feature only works when the ENABLE_WEBUI_TAB_STRIP buildflag is enabled. BASE_FEATURE(kWebUITabStrip,
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index fd90bcf..6480fa3 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -208,6 +208,10 @@ BASE_DECLARE_FEATURE(kEnterpriseUpdatedProfileCreationScreen); BASE_DECLARE_FEATURE(kManagedProfileRequiredInterstitial); +// Enables using the same colors used for the default app menu button for the +// avatar button states using default colors. +BASE_DECLARE_FEATURE(kEnableAppMenuButtonColorsForDefaultAvatarButtonStates); + BASE_DECLARE_FEATURE(kWebUITabStrip); // Controls whether the context menu is shown on a touch press or a touch
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc index 50182f8..dd88f20 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_context_menu_unittest.cc
@@ -217,7 +217,7 @@ EXPECT_TRUE( controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW)); EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_ALL_INCOGNITO)); - EXPECT_FALSE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_SPLIT_VIEW)); + EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_OPEN_SPLIT_VIEW)); EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_REMOVE)); EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_ADD_NEW_BOOKMARK)); EXPECT_TRUE(controller.IsCommandEnabled(IDC_BOOKMARK_BAR_NEW_FOLDER));
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 113a8f4..8babaea9 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -2328,6 +2328,9 @@ ExclusiveAccessBubbleType bubble_type, const int64_t display_id) { if (base::FeatureList::IsEnabled(features::kAsyncFullscreenWindowState)) { + if (IsInSplitView()) { + multi_contents_view_->CloseSplitView(); + } RequestFullscreen(true, display_id); } else { auto* screen = display::Screen::GetScreen(); @@ -2338,6 +2341,9 @@ // Nothing to do. return; } + if (IsInSplitView()) { + multi_contents_view_->CloseSplitView(); + } ProcessFullscreen(true, display_id); } } @@ -2355,6 +2361,18 @@ } ProcessFullscreen(false, display::kInvalidDisplayId); } + + const int active_index = browser_->tab_strip_model()->active_index(); + + // When the browser is closing when exiting fullscreen mode, the active tab + // might no longer exist. + if (browser_->tab_strip_model()->ContainsIndex(active_index)) { + std::optional<split_tabs::SplitTabId> split_tab_id = + browser_->tab_strip_model()->GetTabAtIndex(active_index)->GetSplit(); + if (split_tab_id.has_value()) { + ShowSplitView(GetContentsView()->HasFocus()); + } + } } void BrowserView::UpdateExclusiveAccessBubble(
diff --git a/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc b/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc index dc9885a..ccebbd8 100644 --- a/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/frame/browser_view_interactive_uitest.cc
@@ -5,6 +5,7 @@ #include "build/build_config.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/browser_tabstrip.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_bubble_type.h" #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h" #include "chrome/browser/ui/exclusive_access/fullscreen_controller.h" @@ -46,7 +47,9 @@ class BrowserViewTest : public InProcessBrowserTest { public: - BrowserViewTest() : ax_observer_(views::AXUpdateNotifier::Get()) {} + BrowserViewTest() : ax_observer_(views::AXUpdateNotifier::Get()) { + feature_list_.InitAndEnableFeature(features::kSideBySide); + } ~BrowserViewTest() override = default; BrowserViewTest(const BrowserViewTest&) = delete; BrowserViewTest& operator=(const BrowserViewTest&) = delete; @@ -73,6 +76,7 @@ protected: views::test::AXEventCounter ax_observer_; + base::test::ScopedFeatureList feature_list_; }; } // namespace @@ -223,6 +227,42 @@ EXPECT_TRUE(browser_view->GetTabStripVisible()); } +// Test whether the split view is hidden when a tab is fullscreened. +IN_PROC_BROWSER_TEST_F(BrowserViewTest, TabFullscreenHideSplitView) { + // Add a second tab and create a split + chrome::AddTabAt(browser(), GURL(), -1, true); + browser()->tab_strip_model()->ActivateTabAt(0); + browser()->tab_strip_model()->AddToNewSplit( + {1}, split_tabs::SplitTabLayout::kVertical); + + BrowserView* browser_view = static_cast<BrowserView*>(browser()->window()); + + // Split view should be open + EXPECT_FALSE(browser_view->IsFullscreen()); + EXPECT_TRUE(browser_view->IsInSplitView()); + + // Enter into tab fullscreen mode. + FullscreenController* controller = + browser()->exclusive_access_manager()->fullscreen_controller(); + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + controller->EnterFullscreenModeForTab(web_contents->GetPrimaryMainFrame()); + EXPECT_TRUE(browser_view->IsFullscreen()); + + // The split view should be closed. + EXPECT_FALSE(browser_view->IsInSplitView()); + EXPECT_TRUE(views::test::PropertyWaiter( + base::BindRepeating(&BrowserView::GetTabStripVisible, + base::Unretained(browser_view)), + false) + .Wait()); + + // After exiting the fullscreen mode, the top view should show up again. + controller->ExitFullscreenModeForTab(web_contents); + EXPECT_FALSE(browser_view->IsFullscreen()); + EXPECT_TRUE(browser_view->IsInSplitView()); +} + // Test whether bookmark bar shows up or hides correctly for fullscreen modes. IN_PROC_BROWSER_TEST_F(BrowserViewTest, FullscreenShowBookmarkBar) { BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc index eb085c0..5ec5b26 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button.cc
@@ -266,7 +266,7 @@ } bool AvatarToolbarButton::ShouldBlendHighlightColor() const { - return this->GetWidget() && this->GetWidget()->GetCustomTheme(); + return delegate_->ShouldBlendHighlightColor(); } base::ScopedClosureRunner AvatarToolbarButton::ShowExplicitText(
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc b/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc index a7392a3..3dbc6ab2 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.cc
@@ -1713,6 +1713,11 @@ } case ButtonState::kManagement: { text = enterprise_util::GetEnterpriseLabel(profile_, /*truncated=*/true); + if (base::FeatureList::IsEnabled( + features:: + kEnableAppMenuButtonColorsForDefaultAvatarButtonStates)) { + color = color_provider->GetColor(kColorAvatarButtonHighlightManagement); + } break; } case ButtonState::kNormal: @@ -1798,7 +1803,6 @@ kColorAvatarButtonHighlightSyncErrorForeground); } [[fallthrough]]; - case ButtonState::kManagement: case ButtonState::kSigninPending: case ButtonState::kUpgradeClientError: case ButtonState::kPassphraseError: @@ -1814,6 +1818,14 @@ case ButtonState::kNormal: return color_provider->GetColor( kColorAvatarButtonHighlightNormalForeground); + case ButtonState::kManagement: + return base::FeatureList::IsEnabled( + features:: + kEnableAppMenuButtonColorsForDefaultAvatarButtonStates) + ? color_provider->GetColor( + kColorAvatarButtonHighlightManagementForeground) + : color_provider->GetColor( + kColorAvatarButtonHighlightDefaultForeground); } } @@ -1961,6 +1973,33 @@ } } +bool AvatarToolbarButtonDelegate::ShouldBlendHighlightColor() const { + switch (state_manager_->GetButtonActiveState()) { + case ButtonState::kManagement: + return base::FeatureList::IsEnabled( + features:: + kEnableAppMenuButtonColorsForDefaultAvatarButtonStates) + ? false + : avatar_toolbar_button_->GetWidget() && + avatar_toolbar_button_->GetWidget()->GetCustomTheme(); + case ButtonState::kShowIdentityName: + case ButtonState::kNormal: +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + case ButtonState::kHistorySyncOptin: +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) + case ButtonState::kIncognitoProfile: + case ButtonState::kExplicitTextShowing: + case ButtonState::kSigninPending: + case ButtonState::kUpgradeClientError: + case ButtonState::kPassphraseError: + case ButtonState::kSyncPaused: + case ButtonState::kSyncError: + case ButtonState::kGuestSession: + return avatar_toolbar_button_->GetWidget() && + avatar_toolbar_button_->GetWidget()->GetCustomTheme(); + } +} + void AvatarToolbarButtonDelegate::OnPrimaryAccountChanged( const signin::PrimaryAccountChangeEvent& event_details) { // Try showing the IPH for signin preference remembered.
diff --git a/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.h b/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.h index 907b624e..b403a7f 100644 --- a/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.h +++ b/chrome/browser/ui/views/profiles/avatar_toolbar_button_delegate.h
@@ -74,6 +74,7 @@ SkColor icon_color, const ui::ColorProvider* color_provider) const; bool ShouldPaintBorder() const; + bool ShouldBlendHighlightColor() const; std::optional<base::RepeatingClosure> GetButtonAction(); [[nodiscard]] base::ScopedClosureRunner ShowExplicitText(
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn b/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn index f098134..a7c987e 100644 --- a/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn +++ b/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn
@@ -43,4 +43,7 @@ "//ui/webui", "//url", ] + + allow_circular_includes_from = + [ "//chrome/browser/ash/floating_workspace:floating_workspace" ] }
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.cc b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.cc index 018f1eaa..c31bf08 100644 --- a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.cc +++ b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.cc
@@ -140,8 +140,16 @@ g_dialog->ShowSystemDialog(); } -bool FloatingWorkspaceDialog::IsShown() { - return g_dialog; +std::optional<FloatingWorkspaceDialog::State> +FloatingWorkspaceDialog::IsShown() { + if (!g_dialog) { + return std::nullopt; + } + FloatingWorkspaceDialogHandler* handler = GetHandler(); + if (!handler) { + return std::nullopt; + } + return handler->state(); } } // namespace ash
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.h b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.h index 2dd90d2..44f5991 100644 --- a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.h +++ b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_UI_WEBUI_ASH_FLOATING_WORKSPACE_FLOATING_WORKSPACE_DIALOG_H_ #define CHROME_BROWSER_UI_WEBUI_ASH_FLOATING_WORKSPACE_FLOATING_WORKSPACE_DIALOG_H_ +#include <optional> + #include "chrome/browser/ui/webui/ash/system_web_dialog/system_web_dialog_delegate.h" #include "ui/base/mojom/ui_base_types.mojom-shared.h" @@ -16,6 +18,9 @@ // workspace fetches the state. class FloatingWorkspaceDialog : public SystemWebDialogDelegate { public: + // This dialog can be in only one of three states. + enum class State { kDefault, kNetwork, kError }; + FloatingWorkspaceDialog(const FloatingWorkspaceDialog&) = delete; FloatingWorkspaceDialog& operator=(const FloatingWorkspaceDialog&) = delete; ~FloatingWorkspaceDialog() override; @@ -23,7 +28,9 @@ static void ShowDefaultScreen(); static void ShowNetworkScreen(); static void ShowErrorScreen(); - static bool IsShown(); + // Returns an empty optional if the dialog is not shown, otherwise returns + // it's current state. + static std::optional<State> IsShown(); // Closes the dialog if it's currently opened. static void Close();
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc index 64ad87b..421a619 100644 --- a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc +++ b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc
@@ -61,15 +61,15 @@ void FloatingWorkspaceDialogHandler::Initialize(const base::Value::List& args) { AllowJavascript(); switch (state_) { - case DialogState::kDefault: + case FloatingWorkspaceDialog::State::kDefault: CallJavascriptFunction(std::string(kFloatingWorkspaceDialog) + "showDefaultScreen"); break; - case DialogState::kNetwork: + case FloatingWorkspaceDialog::State::kNetwork: CallJavascriptFunction(std::string(kFloatingWorkspaceDialog) + "showNetworkScreen"); break; - case DialogState::kError: + case FloatingWorkspaceDialog::State::kError: CallJavascriptFunction(std::string(kFloatingWorkspaceDialog) + "showErrorScreen"); break; @@ -77,27 +77,30 @@ } void FloatingWorkspaceDialogHandler::ShowDefaultScreen() { - if (state_ != DialogState::kDefault && IsJavascriptAllowed()) { + if (state_ != FloatingWorkspaceDialog::State::kDefault && + IsJavascriptAllowed()) { CallJavascriptFunction(std::string(kFloatingWorkspaceDialog) + "showDefaultScreen"); } - state_ = DialogState::kDefault; + state_ = FloatingWorkspaceDialog::State::kDefault; } void FloatingWorkspaceDialogHandler::ShowNetworkScreen() { - if (state_ != DialogState::kNetwork && IsJavascriptAllowed()) { + if (state_ != FloatingWorkspaceDialog::State::kNetwork && + IsJavascriptAllowed()) { CallJavascriptFunction(std::string(kFloatingWorkspaceDialog) + "showNetworkScreen"); } - state_ = DialogState::kNetwork; + state_ = FloatingWorkspaceDialog::State::kNetwork; } void FloatingWorkspaceDialogHandler::ShowErrorScreen() { - if (state_ != DialogState::kError && IsJavascriptAllowed()) { + if (state_ != FloatingWorkspaceDialog::State::kError && + IsJavascriptAllowed()) { CallJavascriptFunction(std::string(kFloatingWorkspaceDialog) + "showErrorScreen"); } - state_ = DialogState::kError; + state_ = FloatingWorkspaceDialog::State::kError; } void FloatingWorkspaceDialogHandler::ShowNetworkDetails(
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.h b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.h index b3ed7fd6..8f087d8 100644 --- a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.h +++ b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.h
@@ -7,15 +7,13 @@ #include "base/memory/weak_ptr.h" #include "base/values.h" +#include "chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_dialog.h" #include "content/public/browser/web_ui_message_handler.h" namespace ash { class FloatingWorkspaceDialogHandler : public content::WebUIMessageHandler { public: - // This dialog can be in only one of three states. - enum class DialogState { kDefault, kNetwork, kError }; - FloatingWorkspaceDialogHandler(); ~FloatingWorkspaceDialogHandler() override; @@ -26,6 +24,8 @@ void ShowNetworkScreen(); void ShowErrorScreen(); + FloatingWorkspaceDialog::State state() { return state_; } + private: void Initialize(const base::Value::List& args); void ShowNetworkDetails(const base::Value::List& args); @@ -34,7 +34,8 @@ void GetHostname(const base::Value::List& args); void Respond(const std::string& callback_id, base::ValueView response); - DialogState state_ = DialogState::kDefault; + FloatingWorkspaceDialog::State state_ = + FloatingWorkspaceDialog::State::kDefault; base::WeakPtrFactory<FloatingWorkspaceDialogHandler> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_ui.cc b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_ui.cc index 28a4395..ba62832 100644 --- a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_ui.cc +++ b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_ui.cc
@@ -41,12 +41,6 @@ webui::SetupWebUIDataSource(source, kFloatingWorkspaceResources, IDR_FLOATING_WORKSPACE_FLOATING_WORKSPACE_HTML); - // Since we reuse animation from the OOBE consumer update screen, we - // need to add label for the pause button. - static constexpr webui::LocalizedString kAnimationMessage[] = { - {"pauseAnimationAriaLabel", IDS_OOBE_PAUSE_ANIMATION_MESSAGE}}; - source->AddLocalizedStrings(kAnimationMessage); - static constexpr webui::LocalizedString kLocalizedStrings[] = { {"floatingWorkspaceStartupDialogTitle", IDS_FLOATING_WORKSPACE_STARTUP_DIALOG_TITLE}, @@ -67,6 +61,16 @@ }; source->AddLocalizedStrings(kLocalizedStrings); + // Since we reuse animation from the OOBE consumer update screen, we + // need to add label for the pause/play button. Also reuse a string for the + // "Add WiFi" button on the network screen. + static constexpr webui::LocalizedString kExtraStrings[] = { + {"pauseAnimationAriaLabel", IDS_OOBE_PAUSE_ANIMATION_MESSAGE}, + {"playAnimationAriaLabel", IDS_OOBE_PLAY_ANIMATION_MESSAGE}, + {"addWiFiListItemName", IDS_NETWORK_ADD_WI_FI_LIST_ITEM_NAME}, + }; + source->AddLocalizedStrings(kExtraStrings); + // Add strings for the additional dialogs on the network screen. ui::network_element::AddLocalizedStrings(source); ui::network_element::AddOncLocalizedStrings(source);
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks.mojom b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks.mojom index f2bdfe3..f1d68e2 100644 --- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks.mojom +++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks.mojom
@@ -136,9 +136,6 @@ // native bookmarks context menu. ExecuteDeleteCommand(array<int64> node_ids, ActionSource source); - // Returns whether or not the active tab is part of a split view. - IsActiveTabInSplit() => (bool is_split); - // Opens the bookmark specified by node_id. Passes the parent folder // depth for metrics collection and the action source to identify // from which surface this request is made.
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc index 5d3a276..d8d37ff 100644 --- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc +++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.cc
@@ -522,13 +522,6 @@ } } -void BookmarksPageHandler::IsActiveTabInSplit( - IsActiveTabInSplitCallback callback) { - const bool is_split = - browser_window_interface_->GetTabStripModel()->GetActiveTab()->IsSplit(); - std::move(callback).Run(is_split); -} - void BookmarksPageHandler::OpenBookmark( int64_t node_id, int32_t parent_folder_depth,
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.h b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.h index ec883b4..d42b74f 100644 --- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.h +++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_page_handler.h
@@ -71,7 +71,6 @@ void ExecuteContextMenuCommand(const std::vector<int64_t>& node_ids, side_panel::mojom::ActionSource source, int command_id); - void IsActiveTabInSplit(IsActiveTabInSplitCallback callback) override; void OpenBookmark(int64_t node_id, int32_t parent_folder_depth, ui::mojom::ClickModifiersPtr click_modifiers,
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.cc b/chrome/browser/web_applications/web_app_sync_bridge.cc index 0c5bdf14c..4bd79be 100644 --- a/chrome/browser/web_applications/web_app_sync_bridge.cc +++ b/chrome/browser/web_applications/web_app_sync_bridge.cc
@@ -916,7 +916,7 @@ } std::string WebAppSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { CHECK(entity_data.specifics.has_web_app(), base::NotFatalUntil::M125); base::expected<webapps::ManifestId, StorageKeyParseResult> manifest_id = ParseManifestIdFromSyncEntity(entity_data.specifics.web_app()); @@ -927,7 +927,7 @@ } std::string WebAppSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetClientTag(entity_data); }
diff --git a/chrome/browser/web_applications/web_app_sync_bridge.h b/chrome/browser/web_applications/web_app_sync_bridge.h index 48a2f68..44b2cdd 100644 --- a/chrome/browser/web_applications/web_app_sync_bridge.h +++ b/chrome/browser/web_applications/web_app_sync_bridge.h
@@ -217,8 +217,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override; // Signals that the sync system has received data from the server at some
diff --git a/chrome/browser/win/installer_downloader/BUILD.gn b/chrome/browser/win/installer_downloader/BUILD.gn index 155008d..441d2f0 100644 --- a/chrome/browser/win/installer_downloader/BUILD.gn +++ b/chrome/browser/win/installer_downloader/BUILD.gn
@@ -11,7 +11,7 @@ public = [ "installer_downloader_pref_names.h" ] } -source_set("installer_downloader") { +source_set("controller") { friend = [ ":unit_tests" ] public = [ @@ -22,12 +22,8 @@ sources = [ "installer_downloader_controller.cc", "installer_downloader_feature.cc", - "installer_downloader_infobar_delegate.cc", - "installer_downloader_infobar_delegate.h", - "installer_downloader_model.h", "installer_downloader_model_impl.cc", "installer_downloader_model_impl.h", - "system_info_provider.h", "system_info_provider_impl.cc", "system_info_provider_impl.h", ] @@ -36,18 +32,32 @@ deps = [ ":prefs", + "//chrome/browser:browser_process", + "//chrome/browser/ui/browser_window", + "//chrome/browser/win:cloud_synced_folder_checker", + "//components/download/public/common:public", + "//components/infobars/core", + "//components/prefs", + "//components/tabs:public", + "//content/public/browser", + ] +} + +source_set("infobar") { + public = [ "installer_downloader_infobar_delegate.h" ] + + sources = [ "installer_downloader_infobar_delegate.cc" ] + + deps = [ + "//base", "//chrome/app:branded_strings_grit", "//chrome/app:generated_resources_grit", - "//chrome/browser:browser_process", "//chrome/browser/ui", - "//chrome/browser/win:cloud_synced_folder_checker", "//components/infobars/content", "//components/infobars/core", "//components/omnibox/browser:vector_icons", - "//components/prefs", "//components/vector_icons", "//ui/base", - "//url", ] } @@ -61,7 +71,8 @@ ] deps = [ - ":installer_downloader", + ":controller", + ":infobar", ":prefs", "//base", "//base/test:test_support",
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_controller.cc b/chrome/browser/win/installer_downloader/installer_downloader_controller.cc index 0ed2d72..3684e65 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_controller.cc +++ b/chrome/browser/win/installer_downloader/installer_downloader_controller.cc
@@ -8,26 +8,53 @@ #include <optional> #include <utility> -#include "base/check.h" -#include "base/feature_list.h" +#include "base/check_deref.h" #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/functional/callback.h" -#include "chrome/browser/win/installer_downloader/installer_downloader_feature.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h" #include "chrome/browser/win/installer_downloader/installer_downloader_model.h" #include "chrome/browser/win/installer_downloader/installer_downloader_model_impl.h" #include "chrome/browser/win/installer_downloader/system_info_provider_impl.h" +#include "components/tabs/public/tab_interface.h" +#include "content/public/browser/web_contents.h" namespace installer_downloader { -InstallerDownloaderController::InstallerDownloaderController( - std::unique_ptr<InstallerDownloaderModel> model) - : model_(model ? std::move(model) - : std::make_unique<InstallerDownloaderModelImpl>( - std::make_unique<SystemInfoProviderImpl>())) { - CHECK(base::FeatureList::IsEnabled(kInstallerDownloader)); +namespace { + +content::WebContents* GetActiveWebContents() { + for (BrowserWindowInterface* browser : GetAllBrowserWindowInterfaces()) { + if (!browser->IsActive() || + browser->GetType() != BrowserWindowInterface::Type::TYPE_NORMAL) { + continue; + } + + return CHECK_DEREF(browser->GetActiveTabInterface()).GetContents(); + } + + return nullptr; } +} // namespace + +InstallerDownloaderController::InstallerDownloaderController( + ShowInfobarCallback show_infobar_callback) + : show_infobar_callback_(std::move(show_infobar_callback)), + model_(std::make_unique<InstallerDownloaderModelImpl>( + std::make_unique<SystemInfoProviderImpl>())), + get_active_web_contents_callback_( + base::BindRepeating(&GetActiveWebContents)) {} + +InstallerDownloaderController::InstallerDownloaderController( + ShowInfobarCallback show_infobar_callback, + std::unique_ptr<InstallerDownloaderModel> model) + : show_infobar_callback_(std::move(show_infobar_callback)), + model_(std::move(model)), + get_active_web_contents_callback_( + base::BindRepeating(&GetActiveWebContents)) {} + InstallerDownloaderController::~InstallerDownloaderController() = default; void InstallerDownloaderController::MaybeShowInfoBar() { @@ -48,14 +75,33 @@ void InstallerDownloaderController::OnEligibilityReady( const std::optional<base::FilePath>& destination) { - // At this point, eligibility is the last item to take the decision to show - // the infobar. Trigger infobar display based on `result`. + if (!destination.has_value()) { + return; + } + + // TODO(https://crbug.com/417708652): Ensure that the infobar is visible on + // the last activated windows. + auto* contents = get_active_web_contents_callback_.Run(); + + if (!contents) { + return; + } + + // Installer Downloader is a global feature, therefore it's guaranteed that + // InstallerDownloaderController will be alive at any point during the browser + // runtime. + show_infobar_callback_.Run( + contents, base::BindRepeating( + &InstallerDownloaderController::OnDownloadRequestAccepted, + base::Unretained(this))); } -void InstallerDownloaderController::OnDownloadRequestAccepted( - content::WebContents* /*web_contents*/) { +void InstallerDownloaderController::OnDownloadRequestAccepted() { // User have explicitly gave download consent. Therefore, a background // download should be issued. + // + // TODO(https://crbug.com/417784931): Ensure that profile is not destroyed + // during download. } void InstallerDownloaderController::OnDownloadCompleted() { @@ -63,4 +109,9 @@ // completed. } +void InstallerDownloaderController::SetActiveWebContentsCallbackForTesting( + GetActiveWebContentsCallback callback) { + get_active_web_contents_callback_ = std::move(callback); +} + } // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_controller.h b/chrome/browser/win/installer_downloader/installer_downloader_controller.h index 7ecfb26..1a33721 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_controller.h +++ b/chrome/browser/win/installer_downloader/installer_downloader_controller.h
@@ -8,6 +8,8 @@ #include <memory> #include <optional> +#include "base/functional/callback.h" + namespace base { class FilePath; } @@ -35,8 +37,24 @@ // The controller is instantiated a GlobalFeature. class InstallerDownloaderController { public: + // A callback that will be run to show the installer download infobar in + // `web_contents`. `on_accept` will be run if the user accepts the prompt. + // This will show the infobar on the actual tab. + // + // TODO(https://crbug.com/417709084): Make the infobar global to the browser. + using ShowInfobarCallback = + base::RepeatingCallback<void(content::WebContents* web_contents, + base::RepeatingClosure on_accept)>; + + using GetActiveWebContentsCallback = + base::RepeatingCallback<content::WebContents*()>; + explicit InstallerDownloaderController( - std::unique_ptr<InstallerDownloaderModel> model = nullptr); + ShowInfobarCallback show_infobar_callback); + InstallerDownloaderController( + ShowInfobarCallback show_infobar_callback, + std::unique_ptr<InstallerDownloaderModel> model); + InstallerDownloaderController(const InstallerDownloaderController&) = delete; InstallerDownloaderController& operator=( const InstallerDownloaderController&) = delete; @@ -49,13 +67,18 @@ // Trigger when user give an explicit consent through installer download // infobar. - void OnDownloadRequestAccepted(content::WebContents* web_contents); + void OnDownloadRequestAccepted(); + + void SetActiveWebContentsCallbackForTesting( + GetActiveWebContentsCallback callback); private: void OnEligibilityReady(const std::optional<base::FilePath>& destination); void OnDownloadCompleted(); + ShowInfobarCallback show_infobar_callback_; std::unique_ptr<InstallerDownloaderModel> model_; + GetActiveWebContentsCallback get_active_web_contents_callback_; }; } // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_controller_unittest.cc b/chrome/browser/win/installer_downloader/installer_downloader_controller_unittest.cc index 5601074..09e10a15 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_controller_unittest.cc +++ b/chrome/browser/win/installer_downloader/installer_downloader_controller_unittest.cc
@@ -11,11 +11,14 @@ #include "base/feature_list.h" #include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" +#include "base/test/bind.h" #include "base/test/gmock_callback_support.h" -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/win/installer_downloader/installer_downloader_feature.h" +#include "base/test/mock_callback.h" #include "chrome/browser/win/installer_downloader/installer_downloader_model.h" -#include "content/public/test/web_contents_tester.h" +#include "chrome/test/base/testing_profile.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/test_web_contents_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" @@ -32,7 +35,10 @@ public: MOCK_METHOD(void, StartDownload, - (const GURL&, const base::FilePath&, CompletionCallback), + (const GURL&, + const base::FilePath&, + content::DownloadManager&, + CompletionCallback), (override)); MOCK_METHOD(void, CheckEligibility, @@ -44,19 +50,30 @@ class InstallerDownloaderControllerTest : public testing::Test { protected: InstallerDownloaderControllerTest() { - auto mock_model_ptr = - std::make_unique<StrictMock<MockInstallerDownloaderModel>>(); - // Keep a raw pointer to it for setting expectations and verifications. - mock_model_ = mock_model_ptr.get(); + web_contents_ = web_contents_factory_.CreateWebContents(&profile_); + + auto model = std::make_unique<StrictMock<MockInstallerDownloaderModel>>(); + mock_model_ = model.get(); controller_ = std::make_unique<InstallerDownloaderController>( - std::move(mock_model_ptr)); + show_infobar_callback_.Get(), std::move(model)); + + controller_->SetActiveWebContentsCallbackForTesting( + base::BindLambdaForTesting( + [&]() -> content::WebContents* { return web_contents_; })); } - base::test::ScopedFeatureList feature_list_{kInstallerDownloader}; + content::BrowserTaskEnvironment task_environment_; + TestingProfile profile_; + StrictMock< + base::MockCallback<InstallerDownloaderController::ShowInfobarCallback>> + show_infobar_callback_; + content::TestWebContentsFactory web_contents_factory_; + // Owned by `web_contents_factory_`. + raw_ptr<content::WebContents> web_contents_; std::unique_ptr<InstallerDownloaderController> controller_; - raw_ptr<StrictMock<MockInstallerDownloaderModel>> mock_model_; + raw_ptr<MockInstallerDownloaderModel> mock_model_; }; TEST_F(InstallerDownloaderControllerTest, BailsWhenShowCountExceeded) { @@ -74,5 +91,39 @@ controller_->MaybeShowInfoBar(); } +// All conditions satisfied → coordinator::Show should run exactly once. +TEST_F(InstallerDownloaderControllerTest, ShowsInfobarWhenEligible) { + EXPECT_CALL(*mock_model_, IsMaxShowCountReached()).WillOnce(Return(false)); + EXPECT_CALL(*mock_model_, CheckEligibility(_)) + .WillOnce(base::test::RunOnceCallback<0>( + std::optional<base::FilePath>(base::FilePath(L"C:\\foo")))); + EXPECT_CALL(show_infobar_callback_, Run(_, _)).Times(1); + + controller_->MaybeShowInfoBar(); +} + +// If there is no active WebContents, Show() must *not* be called. +TEST_F(InstallerDownloaderControllerTest, SkipsWhenNoActiveContents) { + controller_->SetActiveWebContentsCallbackForTesting( + base::BindLambdaForTesting( + [&]() -> content::WebContents* { return nullptr; })); + + EXPECT_CALL(*mock_model_, IsMaxShowCountReached()).WillOnce(Return(false)); + EXPECT_CALL(*mock_model_, CheckEligibility(_)) + .WillOnce(base::test::RunOnceCallback<0>( + std::optional<base::FilePath>(base::FilePath(L"C:\\foo")))); + + controller_->MaybeShowInfoBar(); +} + +// If the eligibility callback returns `std::nullopt`, no infobar is shown. +TEST_F(InstallerDownloaderControllerTest, SkipsWhenNotEligible) { + EXPECT_CALL(*mock_model_, IsMaxShowCountReached()).WillOnce(Return(false)); + EXPECT_CALL(*mock_model_, CheckEligibility(_)) + .WillOnce(base::test::RunOnceCallback<0>(std::nullopt)); + + controller_->MaybeShowInfoBar(); +} + } // namespace } // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_model.h b/chrome/browser/win/installer_downloader/installer_downloader_model.h index a8773b7..17d0733d 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_model.h +++ b/chrome/browser/win/installer_downloader/installer_downloader_model.h
@@ -15,9 +15,13 @@ class FilePath; } +namespace content { +class DownloadManager; +} + namespace installer_downloader { -using CompletionCallback = base::OnceCallback<void()>; +using CompletionCallback = base::OnceCallback<void(bool succeeded)>; class InstallerDownloaderModel { public: @@ -36,6 +40,7 @@ // TODO(crbug.com/412976021): Download payload. virtual void StartDownload(const GURL& url, const base::FilePath& destination, + content::DownloadManager& download_manager, CompletionCallback completion_callback) = 0; // Returns true if the infobar has been displayed the maximum number of times,
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_model_impl.cc b/chrome/browser/win/installer_downloader/installer_downloader_model_impl.cc index 4a362bd..2eaa8b1 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_model_impl.cc +++ b/chrome/browser/win/installer_downloader/installer_downloader_model_impl.cc
@@ -4,10 +4,14 @@ #include "chrome/browser/win/installer_downloader/installer_downloader_model_impl.h" +#include <memory> #include <utility> +#include "base/check.h" #include "base/files/file_path.h" +#include "base/functional/bind.h" #include "base/functional/callback.h" +#include "base/scoped_observation.h" #include "base/task/sequenced_task_runner.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -16,11 +20,62 @@ #include "chrome/browser/win/installer_downloader/installer_downloader_pref_names.h" #include "chrome/browser/win/installer_downloader/system_info_provider.h" #include "chrome/browser/win/installer_downloader/system_info_provider_impl.h" +#include "components/download/public/common/download_item.h" +#include "components/download/public/common/download_url_parameters.h" #include "components/prefs/pref_service.h" +#include "content/public/browser/download_manager.h" +#include "net/traffic_annotation/network_traffic_annotation.h" #include "url/gurl.h" namespace installer_downloader { +class InstallerDownloaderObserver final + : public download::DownloadItem::Observer { + public: + InstallerDownloaderObserver(download::DownloadItem* item, + CompletionCallback completion_callback) + : completion_callback_(std::move(completion_callback)) { + observation_.Observe(item); + } + + InstallerDownloaderObserver(const InstallerDownloaderObserver&) = delete; + InstallerDownloaderObserver& operator=(const InstallerDownloaderObserver&) = + delete; + + private: + void OnDownloadUpdated(download::DownloadItem* item) override { + CHECK_EQ(observation_.GetSource(), item); + + switch (item->GetState()) { + case download::DownloadItem::COMPLETE: + // `this` is deleted by `completion_callback_`, so nothing below this + // point may access it. + std::move(completion_callback_).Run(/*succeeded=*/true); + break; + case download::DownloadItem::IN_PROGRESS: + break; + case download::DownloadItem::INTERRUPTED: + case download::DownloadItem::CANCELLED: + // `this` is deleted by `completion_callback_`, so nothing below this + // point may access it. + std::move(completion_callback_).Run(/*succeeded=*/false); + break; + case download::DownloadItem::MAX_DOWNLOAD_STATE: + NOTREACHED(); + } + } + + void OnDownloadDestroyed(download::DownloadItem* item) override { + CHECK_EQ(observation_.GetSource(), item); + std::move(completion_callback_).Run(/*succeeded=*/false); + } + + base::ScopedObservation<download::DownloadItem, + download::DownloadItem::Observer> + observation_{this}; + CompletionCallback completion_callback_; +}; + InstallerDownloaderModelImpl::InstallerDownloaderModelImpl( std::unique_ptr<SystemInfoProvider> system_info_provider) : system_info_provider_(std::move(system_info_provider)) {} @@ -48,14 +103,84 @@ void InstallerDownloaderModelImpl::StartDownload( const GURL& url, - const base::FilePath& dest, - CompletionCallback completion_callback) {} + const base::FilePath& destination, + content::DownloadManager& download_manager, + CompletionCallback completion_callback) { + CHECK(url.is_valid()); + + static constexpr net::NetworkTrafficAnnotationTag kTrafficAnnotation = + net::DefineNetworkTrafficAnnotation("windows_installer_downloader", + R"(semantics { + sender: "Windows Installer Downloader" + description: + "Download Chrome installer to the user OneDrive folder on " + "their consent." + trigger: "Once, when the user accept the download request." + data: "None." + destination: GOOGLE_OWNED_SERVICE + internal { + contacts { + owners: "//chrome/browser/win/installer_downloader/OWNERS" + } + } + last_reviewed: "2025-05-01 + } + policy { + cookies_allowed: NO + setting: + "Users can controller this feature by closing the Installer" + "Downloader Infobar." + })"); + + auto params = std::make_unique<download::DownloadUrlParameters>( + url, kTrafficAnnotation); + params->set_file_path(destination); + params->set_transient(true); + params->set_download_source(download::DownloadSource::INTERNAL_API); + + // The InstallerDownloaderController that hold this model is a browser global + // feature. Therefore, it is safe to use base::Unretained here. + params->set_callback( + base::BindOnce(&InstallerDownloaderModelImpl::OnInstallerDownloadCreated, + base::Unretained(this), std::move(completion_callback))); + + download_manager.DownloadUrl(std::move(params)); +} bool InstallerDownloaderModelImpl::IsMaxShowCountReached() const { return g_browser_process->local_state()->GetInteger( prefs::kInstallerDownloaderInfobarShowCount) >= kMaxShowCount; } +void InstallerDownloaderModelImpl::OnInstallerDownloadCreated( + CompletionCallback completion_callback, + download::DownloadItem* item, + download::DownloadInterruptReason reason) { + CHECK(!installer_downloader_observer_); + + // If `reason` is anything other than NONE (or we never got a DownloadItem) + // will be treated as a failure. + if (reason != download::DOWNLOAD_INTERRUPT_REASON_NONE || !item) { + std::move(completion_callback).Run(/*succeeded=*/false); + return; + } + + // The InstallerDownloaderController that hold this model is a browser global + // feature. Therefore, it is safe to use base::Unretained here. + installer_downloader_observer_ = + std::make_unique<InstallerDownloaderObserver>( + item, base::BindOnce( + &InstallerDownloaderModelImpl::OnInstallerDownloadFinished, + base::Unretained(this), std::move(completion_callback))); +} + +void InstallerDownloaderModelImpl::OnInstallerDownloadFinished( + CompletionCallback completion_callback, + bool succeeded) { + installer_downloader_observer_.reset(); + std::move(completion_callback).Run(succeeded); +} + std::optional<base::FilePath> InstallerDownloaderModelImpl::GetInstallerDestination() const { // 1) If this machine already meets the Win‑11 hardware requirements, an
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_model_impl.h b/chrome/browser/win/installer_downloader/installer_downloader_model_impl.h index 5836d1c8..ca2c902 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_model_impl.h +++ b/chrome/browser/win/installer_downloader/installer_downloader_model_impl.h
@@ -10,6 +10,7 @@ #include "base/functional/callback_forward.h" #include "chrome/browser/win/installer_downloader/installer_downloader_model.h" +#include "components/download/public/common/download_interrupt_reasons.h" class GURL; @@ -17,9 +18,18 @@ class FilePath; } +namespace content { +class DownloadManager; +} + +namespace download { +class DownloadItem; +} + namespace installer_downloader { class SystemInfoProvider; +class InstallerDownloaderObserver; // Non-UI service that: // • Checks whether the current machine is a Win 10 device **not** @@ -51,13 +61,27 @@ override; void StartDownload(const GURL& url, const base::FilePath& destination, + content::DownloadManager& download_manager, CompletionCallback completion_callback) override; bool IsMaxShowCountReached() const override; private: std::optional<base::FilePath> GetInstallerDestination() const; - std::unique_ptr<SystemInfoProvider> system_info_provider_; + // Invoked when the installer download started. + void OnInstallerDownloadCreated(CompletionCallback completion_callback, + download::DownloadItem* item, + download::DownloadInterruptReason reason); + + void OnInstallerDownloadFinished(CompletionCallback completion_callback, + bool succeeded); + + const std::unique_ptr<SystemInfoProvider> system_info_provider_; + + // This is instantiated when a download start and is reset when the + // download is finished or stopped. It should be null at any point when no + // download is in progress. + std::unique_ptr<InstallerDownloaderObserver> installer_downloader_observer_; }; } // namespace installer_downloader
diff --git a/chrome/browser/win/installer_downloader/installer_downloader_model_impl_unittest.cc b/chrome/browser/win/installer_downloader/installer_downloader_model_impl_unittest.cc index 13b818d..8be9bdae 100644 --- a/chrome/browser/win/installer_downloader/installer_downloader_model_impl_unittest.cc +++ b/chrome/browser/win/installer_downloader/installer_downloader_model_impl_unittest.cc
@@ -8,18 +8,28 @@ #include <utility> #include "base/files/file_path.h" +#include "base/memory/raw_ptr.h" #include "base/run_loop.h" #include "base/test/bind.h" -#include "base/test/task_environment.h" #include "chrome/browser/win/cloud_synced_folder_checker.h" #include "chrome/browser/win/installer_downloader/installer_downloader_pref_names.h" #include "chrome/browser/win/installer_downloader/system_info_provider.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" +#include "components/download/public/common/download_interrupt_reasons.h" +#include "components/download/public/common/download_url_parameters.h" #include "components/prefs/testing_pref_service.h" +#include "content/public/test/browser_task_environment.h" +#include "content/public/test/fake_download_item.h" +#include "content/public/test/mock_download_manager.h" +#include "content/public/test/test_web_contents_factory.h" +#include "content/public/test/web_contents_tester.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" +using ::download::DownloadInterruptReason; +using ::testing::_; using ::testing::Return; using ::testing::StrictMock; @@ -49,10 +59,11 @@ TestingPrefServiceSimple& GetLocalState() { return *local_state_.Get(); } - base::test::TaskEnvironment task_environment_; + content::BrowserTaskEnvironment task_environment_; ScopedTestingLocalState local_state_{TestingBrowserProcess::GetGlobal()}; std::unique_ptr<InstallerDownloaderModelImpl> model_; raw_ptr<MockSystemInfoProvider> mock_system_info_provider_; + content::MockDownloadManager mock_download_manager_; }; TEST_F(InstallerDownloaderModelTest, MaxShowCountNotExceeded) { @@ -178,5 +189,87 @@ run_loop.Run(); } +TEST_F(InstallerDownloaderModelTest, StartDownloadFailureInvokesCallback) { + const base::FilePath destination( + FILE_PATH_LITERAL("C:\\temp\\installer.exe")); + const GURL url("https://example.com/installer.exe"); + + base::RunLoop run_loop; + EXPECT_CALL(mock_download_manager_, DownloadUrlMock(_)) + .WillOnce([&](download::DownloadUrlParameters* params) { + std::move(params->callback()) + .Run(nullptr, DownloadInterruptReason:: + DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED); + }); + + model_->StartDownload(url, destination, mock_download_manager_, + base::BindLambdaForTesting([&](bool succeeded) { + EXPECT_FALSE(succeeded); + run_loop.Quit(); + })); + + run_loop.Run(); +} + +TEST_F(InstallerDownloaderModelTest, CompleteDownloadSuccessInvokesCallback) { + const base::FilePath destination( + FILE_PATH_LITERAL("C:\\temp\\installer.exe")); + const GURL url("https://example.com/installer.exe"); + + content::FakeDownloadItem fake_download_item; + fake_download_item.SetDummyFilePath(destination); + + base::RunLoop run_loop; + + EXPECT_CALL(mock_download_manager_, DownloadUrlMock(_)) + .WillOnce([&](download::DownloadUrlParameters* params) { + std::move(params->callback()) + .Run(&fake_download_item, + DownloadInterruptReason::DOWNLOAD_INTERRUPT_REASON_NONE); + }); + + model_->StartDownload(url, destination, mock_download_manager_, + base::BindLambdaForTesting([&](bool succeeded) { + EXPECT_TRUE(succeeded); + run_loop.Quit(); + })); + + fake_download_item.SetIsDone(true); + fake_download_item.SetState(download::DownloadItem::COMPLETE); + fake_download_item.NotifyDownloadUpdated(); + + run_loop.Run(); +} + +TEST_F(InstallerDownloaderModelTest, CompleteDownloadFailureInvokesCallback) { + const base::FilePath destination( + FILE_PATH_LITERAL("C:\\temp\\installer.exe")); + const GURL url("https://example.com/installer.exe"); + + content::FakeDownloadItem fake_download_item; + fake_download_item.SetDummyFilePath(destination); + + base::RunLoop run_loop; + + EXPECT_CALL(mock_download_manager_, DownloadUrlMock(_)) + .WillOnce([&](download::DownloadUrlParameters* params) { + std::move(params->callback()) + .Run(&fake_download_item, + DownloadInterruptReason::DOWNLOAD_INTERRUPT_REASON_NONE); + }); + + model_->StartDownload(url, destination, mock_download_manager_, + base::BindLambdaForTesting([&](bool succeeded) { + EXPECT_FALSE(succeeded); + run_loop.Quit(); + })); + + fake_download_item.SetIsDone(true); + fake_download_item.SetState(download::DownloadItem::CANCELLED); + fake_download_item.NotifyDownloadUpdated(); + + run_loop.Run(); +} + } // namespace } // namespace installer_downloader
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 1b4fa3c..6a10c77a 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1747395494-552e02eaf830d54528bbc68457f1ea7098912b09-f13def107dfb3c4288c3742462185baa074974a7.profdata +chrome-mac-arm-main-1747411180-bdfefe8c346b769fe4c632b05da62f655ee2fd6c-d8b694c96aa0b7ce95b182a6be3ea3062130379a.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 73897bd..ef7873b9 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1747374511-b6546ad800c613c85a6a0a70a484fa330b9c5866-660faa3b0ebb9895db20bec2f6180ea9c5263dae.profdata +chrome-mac-main-1747395494-0ff60fdea6f8f9521ba123aa5616f2e88d55427e-f13def107dfb3c4288c3742462185baa074974a7.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 043e117..9127ad9 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1747374511-2756bfa447f8dec71f5336fe766971fe45421f7c-660faa3b0ebb9895db20bec2f6180ea9c5263dae.profdata +chrome-win-arm64-main-1747395494-0b3052d9e847695639749655015c66b2810d46e6-f13def107dfb3c4288c3742462185baa074974a7.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index c4d577b..14e10ec 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1747374511-8283b18afa569b7f0b3b7efeaefa44d619123d14-660faa3b0ebb9895db20bec2f6180ea9c5263dae.profdata +chrome-win32-main-1747385949-87274b1f7d82cec42f9904742f175d1b3247567c-79d352c979822b31997515f0bf6b09b324d61f1c.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index ae66afa..71b5847 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1747374511-184adc18e14986a360b5c5215a2f049a74fffdd0-660faa3b0ebb9895db20bec2f6180ea9c5263dae.profdata +chrome-win64-main-1747385949-d4d51bc27a12a818b9dc43f79c437d1c9af05cdb-79d352c979822b31997515f0bf6b09b324d61f1c.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 88cbf93..4c412c59 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -3628,6 +3628,7 @@ "//chrome/browser/glic:browser_tests", "//chrome/browser/glic:glic", "//chrome/browser/glic:impl", + "//chrome/browser/glic/fre", "//chrome/browser/glic/test_support", "//chrome/renderer/actor:browser_tests", ]
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/browser/perf/OWNERS b/chrome/test/android/javatests/src/org/chromium/chrome/browser/perf/OWNERS index 828b487..39f58e9 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/browser/perf/OWNERS +++ b/chrome/test/android/javatests/src/org/chromium/chrome/browser/perf/OWNERS
@@ -1,2 +1 @@ -mheikal@chromium.org agrieve@chromium.org
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/TabListEditorAppMenu.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/TabListEditorAppMenu.java index 831e276b50..cce8312 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/TabListEditorAppMenu.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/TabListEditorAppMenu.java
@@ -68,19 +68,28 @@ groupTabsViewSpec = itemViewSpec(withText(String.format("Add %s to new group", tabOrTabs))); groupTabsDataMatcher = itemDataMatcher(R.id.tab_list_editor_add_tab_to_group_menu_item); + if (mListEditor.isAnyGroupSelected()) { + throw new UnsupportedOperationException( + "Bottom sheet tab group merging not supported yet"); + } else { + mGroupWithDialogMenuItem = + items.declareItem( + groupTabsViewSpec, groupTabsDataMatcher, this::doGroupTabs); + } } else { groupTabsViewSpec = itemViewSpec(withText("Group " + tabOrTabs)); groupTabsDataMatcher = itemDataMatcher(R.id.tab_list_editor_group_menu_item); - } - if (mListEditor.isAnyGroupSelected()) { - mGroupWithoutDialogMenuItem = - items.declareItem( - groupTabsViewSpec, - groupTabsDataMatcher, - this::doGroupTabsWithoutDialog); - } else { - mGroupWithDialogMenuItem = - items.declareItem(groupTabsViewSpec, groupTabsDataMatcher, this::doGroupTabs); + if (mListEditor.isAnyGroupSelected()) { + mGroupWithoutDialogMenuItem = + items.declareItem( + groupTabsViewSpec, + groupTabsDataMatcher, + this::doGroupTabsWithoutDialog); + } else { + mGroupWithDialogMenuItem = + items.declareItem( + groupTabsViewSpec, groupTabsDataMatcher, this::doGroupTabs); + } } items.declareStubItem(
diff --git a/chrome/test/data/webui/settings/privacy_page_test.ts b/chrome/test/data/webui/settings/privacy_page_test.ts index 5c887e54..43f8d2e 100644 --- a/chrome/test/data/webui/settings/privacy_page_test.ts +++ b/chrome/test/data/webui/settings/privacy_page_test.ts
@@ -149,51 +149,6 @@ assertFalse(!!page.shadowRoot!.querySelector('settings-security-page')); }); - test('cookiesLinkRowSublabel', function() { - page.set( - 'prefs.profile.cookie_controls_mode.value', CookieControlsMode.OFF); - const thirdPartyCookiesLinkRow = - page.shadowRoot!.querySelector<CrLinkRowElement>( - '#thirdPartyCookiesLinkRow'); - assertTrue(!!thirdPartyCookiesLinkRow); - assertEquals( - page.i18n('thirdPartyCookiesLinkRowSublabelEnabled'), - thirdPartyCookiesLinkRow.subLabel); - - page.set( - 'prefs.profile.cookie_controls_mode.value', - CookieControlsMode.INCOGNITO_ONLY); - assertEquals( - page.i18n('thirdPartyCookiesLinkRowSublabelDisabledIncognito'), - thirdPartyCookiesLinkRow.subLabel); - - page.set( - 'prefs.profile.cookie_controls_mode.value', - CookieControlsMode.BLOCK_THIRD_PARTY); - assertEquals( - page.i18n('thirdPartyCookiesLinkRowSublabelDisabled'), - thirdPartyCookiesLinkRow.subLabel); - }); - - test('cookiesLinkRowSublabelAlwaysBlock3pcsIncognito', async function() { - loadTimeData.overrideValues({ - isAlwaysBlock3pcsIncognitoEnabled: true, - }); - resetRouterForTesting(); - await createPage(); - - page.set( - 'prefs.profile.cookie_controls_mode.value', - CookieControlsMode.INCOGNITO_ONLY); - const thirdPartyCookiesLinkRow = - page.shadowRoot!.querySelector<CrLinkRowElement>( - '#thirdPartyCookiesLinkRow'); - assertTrue(!!thirdPartyCookiesLinkRow); - assertEquals( - page.i18n('thirdPartyCookiesLinkRowSublabelEnabled'), - thirdPartyCookiesLinkRow.subLabel); - }); - test('NotificationPage', async function() { await createPage(); @@ -492,8 +447,84 @@ thirdPartyCookiesLinkRow.click(); // Check that the correct page was navigated to. await flushTasks(); + assertEquals(routes.COOKIES, Router.getInstance().getCurrentRoute()); + }); +}); + +suite('CookiesSubpageRedesignDisabled', function() { + let page: SettingsPrivacyPageElement; + let settingsPrefs: SettingsPrefsElement; + + suiteSetup(function() { + settingsPrefs = document.createElement('settings-prefs'); + return CrSettingsPrefs.initialized; + }); + + function createPage() { + document.body.innerHTML = window.trustedTypes!.emptyHTML; + page = document.createElement('settings-privacy-page'); + page.prefs = settingsPrefs.prefs!; + document.body.appendChild(page); + + return flushTasks(); + } + + test( + 'cookiesLinkRowSublabelAlwaysBlock3pcsIncognitoDisabled', + async function() { + loadTimeData.overrideValues({ + is3pcdCookieSettingsRedesignEnabled: false, + isAlwaysBlock3pcsIncognitoEnabled: false, + }); + resetRouterForTesting(); + + await createPage(); + + page.set( + 'prefs.profile.cookie_controls_mode.value', CookieControlsMode.OFF); + const thirdPartyCookiesLinkRow = + page.shadowRoot!.querySelector<CrLinkRowElement>( + '#thirdPartyCookiesLinkRow'); + assertTrue(!!thirdPartyCookiesLinkRow); + assertEquals( + page.i18n('thirdPartyCookiesLinkRowSublabelEnabled'), + thirdPartyCookiesLinkRow.subLabel); + + page.set( + 'prefs.profile.cookie_controls_mode.value', + CookieControlsMode.INCOGNITO_ONLY); + assertEquals( + page.i18n('thirdPartyCookiesLinkRowSublabelDisabledIncognito'), + thirdPartyCookiesLinkRow.subLabel, + ); + + page.set( + 'prefs.profile.cookie_controls_mode.value', + CookieControlsMode.BLOCK_THIRD_PARTY); + assertEquals( + page.i18n('thirdPartyCookiesLinkRowSublabelDisabled'), + thirdPartyCookiesLinkRow.subLabel); + }); + + test('cookiesLinkRowSublabel', async function() { + loadTimeData.overrideValues({ + is3pcdCookieSettingsRedesignEnabled: false, + isAlwaysBlock3pcsIncognitoEnabled: true, + }); + resetRouterForTesting(); + + await createPage(); + + page.set( + 'prefs.profile.cookie_controls_mode.value', + CookieControlsMode.INCOGNITO_ONLY); + const thirdPartyCookiesLinkRow = + page.shadowRoot!.querySelector<CrLinkRowElement>( + '#thirdPartyCookiesLinkRow'); + assertTrue(!!thirdPartyCookiesLinkRow); assertEquals( - routes.COOKIES, Router.getInstance().getCurrentRoute()); + page.i18n('thirdPartyCookiesLinkRowSublabelEnabled'), + thirdPartyCookiesLinkRow.subLabel); }); });
diff --git a/chrome/test/data/webui/settings/settings_browsertest.cc b/chrome/test/data/webui/settings/settings_browsertest.cc index e7797373..3a3dfe0 100644 --- a/chrome/test/data/webui/settings/settings_browsertest.cc +++ b/chrome/test/data/webui/settings/settings_browsertest.cc
@@ -1157,28 +1157,6 @@ base::test::ScopedFeatureList scoped_feature_list2_; }; -// TODO(crbug.com/40285326): This fails with the field trial testing config. -class SettingsPrivacyPageTestNoTestingConfig : public SettingsPrivacyPageTest { - public: - void SetUpCommandLine(base::CommandLine* command_line) override { - SettingsPrivacyPageTest::SetUpCommandLine(command_line); - command_line->AppendSwitch("disable-field-trial-config"); - } - - protected: - SettingsPrivacyPageTestNoTestingConfig() { - scoped_feature_list_.InitWithFeatures( - { - features::kAutomaticFullscreenContentSetting, - permissions::features::kPermissionSiteSettingsRadioButton, - }, - {}); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - // Tests that the content settings page for Web Printing is not shown by // default. class SettingsPrivacyPageTestWithoutWebPrinting : public SettingsBrowserTest {}; @@ -1189,7 +1167,7 @@ "runMochaSuite('WebPrintingNotShown')"); } -IN_PROC_BROWSER_TEST_F(SettingsPrivacyPageTestNoTestingConfig, PrivacyPage) { +IN_PROC_BROWSER_TEST_F(SettingsPrivacyPageTest, PrivacyPage) { RunTest("settings/privacy_page_test.js", "runMochaSuite('PrivacyPage')"); } @@ -1209,6 +1187,12 @@ } #endif // BUILDFLAG(USE_NSS_CERTS) +IN_PROC_BROWSER_TEST_F(SettingsPrivacyPageTest, + CookiesSubpageRedesignDisabled) { + RunTest("settings/privacy_page_test.js", + "runMochaSuite('CookiesSubpageRedesignDisabled')"); +} + IN_PROC_BROWSER_TEST_F(SettingsPrivacyPageTest, CookiesSubpage) { RunTest("settings/privacy_page_test.js", "runMochaSuite('CookiesSubpage')"); }
diff --git a/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_context_menu_test.ts b/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_context_menu_test.ts index 9cc56ed6..a360b58 100644 --- a/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_context_menu_test.ts +++ b/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_context_menu_test.ts
@@ -122,7 +122,7 @@ test('ShowsMenuItemsForSingleSelectUrl', async () => { const selection = [service.findBookmarkWithId('3')!]; powerBookmarksContextMenu.showAtPosition( - new MouseEvent('click'), selection, false, false, false); + new MouseEvent('click'), selection, false, false); await waitAfterNextRender(powerBookmarksContextMenu); @@ -161,7 +161,7 @@ test('ShowsMenuItemsForSingleSelectFolder', async () => { const selection = [service.findBookmarkWithId('5')!]; powerBookmarksContextMenu.showAtPosition( - new MouseEvent('click'), selection, false, false, false); + new MouseEvent('click'), selection, false, false); await waitAfterNextRender(powerBookmarksContextMenu); @@ -202,7 +202,7 @@ const selection = [service.findBookmarkWithId('3')!, service.findBookmarkWithId('4')!]; powerBookmarksContextMenu.showAtPosition( - new MouseEvent('click'), selection, false, false, false); + new MouseEvent('click'), selection, false, false); await waitAfterNextRender(powerBookmarksContextMenu); @@ -238,7 +238,7 @@ test('ShowsMenuItemsForPriceTracking', async () => { const selection = [service.findBookmarkWithId('4')!]; powerBookmarksContextMenu.showAtPosition( - new MouseEvent('click'), selection, true, true, false); + new MouseEvent('click'), selection, true, true); await waitAfterNextRender(powerBookmarksContextMenu); @@ -285,7 +285,7 @@ const selection = [service.findBookmarkWithId('5')!]; powerBookmarksContextMenu.showAtPosition( - new MouseEvent('click'), selection, false, false, false); + new MouseEvent('click'), selection, false, false); await waitAfterNextRender(powerBookmarksContextMenu); @@ -326,7 +326,7 @@ const selection = [service.findBookmarkWithId('3')!]; powerBookmarksContextMenu.showAtPosition( - new MouseEvent('click'), selection, false, false, false); + new MouseEvent('click'), selection, false, false); await waitAfterNextRender(powerBookmarksContextMenu);
diff --git a/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_list_test.ts b/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_list_test.ts index cf047bd..2ca7602e 100644 --- a/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_list_test.ts +++ b/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_list_test.ts
@@ -766,7 +766,7 @@ // Open the context menu. contextMenu.showAtPosition( - new MouseEvent('click'), [bookmark], false, false, false); + new MouseEvent('click'), [bookmark], false, false); await waitAfterNextRender(contextMenu); // Get the edit option in the menu. @@ -801,7 +801,7 @@ // Open the context menu. contextMenu.showAtPosition( - new MouseEvent('click'), bookmarks, false, false, false); + new MouseEvent('click'), bookmarks, false, false); await waitAfterNextRender(contextMenu); // Get the move option in the menu.
diff --git a/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_list_transport_mode_test.ts b/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_list_transport_mode_test.ts index c96476f6..3561ac7 100644 --- a/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_list_transport_mode_test.ts +++ b/chrome/test/data/webui/side_panel/bookmarks/power_bookmarks_list_transport_mode_test.ts
@@ -79,8 +79,7 @@ // Open the context menu. contextMenu.showAtPosition( new MouseEvent('click'), - [getBookmarkWithId(powerBookmarksList, bookmarkId)!], false, false, - false); + [getBookmarkWithId(powerBookmarksList, bookmarkId)!], false, false); await waitAfterNextRender(contextMenu); // Get the edit option in the menu. @@ -116,7 +115,7 @@ // Open the context menu. contextMenu.showAtPosition( - new MouseEvent('click'), bookmarks, false, false, false); + new MouseEvent('click'), bookmarks, false, false); await waitAfterNextRender(contextMenu); // Get the move option in the menu.
diff --git a/chrome/test/data/webui/side_panel/bookmarks/test_bookmarks_api_proxy.ts b/chrome/test/data/webui/side_panel/bookmarks/test_bookmarks_api_proxy.ts index 4c27902..1f3867e 100644 --- a/chrome/test/data/webui/side_panel/bookmarks/test_bookmarks_api_proxy.ts +++ b/chrome/test/data/webui/side_panel/bookmarks/test_bookmarks_api_proxy.ts
@@ -23,7 +23,6 @@ constructor() { super([ 'getActiveUrl', - 'isActiveTabInSplit', 'bookmarkCurrentTabInFolder', 'openBookmark', 'contextMenuOpenBookmarkInNewTab', @@ -64,11 +63,6 @@ return Promise.resolve('http://www.test.com'); } - isActiveTabInSplit() { - this.methodCalled('isActiveTabInSplit'); - return Promise.resolve({isSplit: false}); - } - bookmarkCurrentTabInFolder() { this.methodCalled('bookmarkCurrentTabInFolder'); }
diff --git a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc index d22eb50..c86b454e 100644 --- a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc +++ b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc
@@ -286,12 +286,12 @@ } std::string WifiConfigurationBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string WifiConfigurationBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return NetworkIdentifier::FromProto( entity_data.specifics.wifi_configuration()) .SerializeToString();
diff --git a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.h b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.h index e2ef0a6..d47e1b9 100644 --- a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.h +++ b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.h
@@ -81,8 +81,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/clank b/clank index 968450a..8940c82 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit 968450ab8d1bcffb25acc11625dc295076a5c2d1 +Subproject commit 8940c82382a30562518d86b3476b1d5c668d1d0a
diff --git a/components/autofill/core/browser/data_model/addresses/contact_info.cc b/components/autofill/core/browser/data_model/addresses/contact_info.cc index 0638499..98fe1076 100644 --- a/components/autofill/core/browser/data_model/addresses/contact_info.cc +++ b/components/autofill/core/browser/data_model/addresses/contact_info.cc
@@ -225,8 +225,9 @@ } std::u16string EmailInfo::GetRawInfo(FieldType type) const { - if (type == EMAIL_ADDRESS) + if (type == EMAIL_ADDRESS || type == EMAIL_OR_LOYALTY_MEMBERSHIP_ID) { return email_; + } return std::u16string(); }
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc index 66355504..a2b51e0 100644 --- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
@@ -3127,6 +3127,17 @@ suggestions = GetProfileSuggestions( form, *form_structure, field, *autofill_field, trigger_source, std::move(plus_address_email_override)); + if (base::FeatureList::IsEnabled( + features::kAutofillEnableEmailOrLoyaltyCardsFilling) && + autofill_field->Type().GetStorableType() == + EMAIL_OR_LOYALTY_MEMBERSHIP_ID) { + if (ValuablesDataManager* valuables_manager = + client().GetValuablesDataManager()) { + ExtendEmailSuggestionsWithLoyaltyCardSuggestions( + suggestions, *valuables_manager, + client().GetLastCommittedPrimaryMainFrameURL()); + } + } break; case FillingProduct::kCreditCard: suggestions = GetCreditCardSuggestions(form, *form_structure, field,
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc index 85b0df92..b55570fe 100644 --- a/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/foundations/browser_autofill_manager_unittest.cc
@@ -2102,6 +2102,93 @@ SuggestionType::kManageLoyaltyCard)}); } +// Tests that when both email and loyalty card suggestions are available, they +// are shown in the correct order. +TEST_F(BrowserAutofillManagerTestValuables, + GetSuggestions_EmailAndLoyaltyCards) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures( + {features::kAutofillEnableLoyaltyCardsFilling, + features::kAutofillEnableEmailOrLoyaltyCardsFilling}, + {}); + + SetLoyaltyCards({test::CreateLoyaltyCard()}); + + FormData form_data = + test::GetFormData({.fields = {{.role = EMAIL_OR_LOYALTY_MEMBERSHIP_ID}, + {.role = PASSWORD}}}); + auto form_structure = std::make_unique<FormStructure>(form_data); + form_structure->DetermineHeuristicTypes(GeoIpCountryCode(""), nullptr); + + test_api(*form_structure) + .SetFieldTypes({EMAIL_OR_LOYALTY_MEMBERSHIP_ID, PASSWORD}, + {EMAIL_OR_LOYALTY_MEMBERSHIP_ID, PASSWORD}); + manager().AddSeenFormStructure(std::move(form_structure)); + + FormsSeen({form_data}); + OnAskForValuesToFill(form_data, form_data.fields()[0]); + + Suggestion loyalty_cards_submenu = Suggestion( + l10n_util::GetStringUTF8(IDS_AUTOFILL_LOYALTY_CARDS_SUBMENU_TITLE), "", + Suggestion::Icon::kNoIcon, SuggestionType::kLoyaltyCardEntry); + loyalty_cards_submenu.acceptability = + Suggestion::Acceptability::kUnacceptable; + loyalty_cards_submenu.children = { + Suggestion("1234", "Deutsche Bahn", Suggestion::Icon::kNoIcon, + SuggestionType::kLoyaltyCardEntry), + CreateSeparator(), + Suggestion(l10n_util::GetStringUTF8(IDS_AUTOFILL_MANAGE_LOYALTY_CARDS), + "", Suggestion::Icon::kSettings, + SuggestionType::kManageLoyaltyCard), + }; + + external_delegate()->CheckSuggestions( + form_data.fields()[0].global_id(), + {Suggestion("buddy@gmail.com", "", Suggestion::Icon::kEmail, + SuggestionType::kAddressEntry), + Suggestion("theking@gmail.com", "", Suggestion::Icon::kEmail, + SuggestionType::kAddressEntry), + CreateSeparator(), loyalty_cards_submenu, CreateSeparator(), + CreateManageAddressesSuggestion()}); +} + +// Tests that when only loyalty card suggestions are available, they are shown +// without a submenu. +TEST_F(BrowserAutofillManagerTestValuables, + GetSuggestions_EmailAndLoyaltyCards_NoEmails) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures( + {features::kAutofillEnableLoyaltyCardsFilling, + features::kAutofillEnableEmailOrLoyaltyCardsFilling}, + {}); + + SetLoyaltyCards({test::CreateLoyaltyCard()}); + personal_data().test_address_data_manager().ClearProfiles(); + + FormData form_data = + test::GetFormData({.fields = {{.role = EMAIL_OR_LOYALTY_MEMBERSHIP_ID}, + {.role = PASSWORD}}}); + auto form_structure = std::make_unique<FormStructure>(form_data); + form_structure->DetermineHeuristicTypes(GeoIpCountryCode(""), nullptr); + + test_api(*form_structure) + .SetFieldTypes({EMAIL_OR_LOYALTY_MEMBERSHIP_ID, PASSWORD}, + {EMAIL_OR_LOYALTY_MEMBERSHIP_ID, PASSWORD}); + manager().AddSeenFormStructure(std::move(form_structure)); + + FormsSeen({form_data}); + OnAskForValuesToFill(form_data, form_data.fields()[0]); + + external_delegate()->CheckSuggestions( + form_data.fields()[0].global_id(), + {Suggestion("1234", "Deutsche Bahn", Suggestion::Icon::kNoIcon, + SuggestionType::kLoyaltyCardEntry), + CreateSeparator(), + Suggestion(l10n_util::GetStringUTF8(IDS_AUTOFILL_MANAGE_LOYALTY_CARDS), + "", Suggestion::Icon::kSettings, + SuggestionType::kManageLoyaltyCard)}); +} + class BrowserAutofillManagerTestForMetadataCardSuggestions : public BrowserAutofillManagerTest, public testing::WithParamInterface<bool> {
diff --git a/components/autofill/core/browser/suggestions/addresses/address_suggestion_generator.cc b/components/autofill/core/browser/suggestions/addresses/address_suggestion_generator.cc index dc03d61e..1d05317 100644 --- a/components/autofill/core/browser/suggestions/addresses/address_suggestion_generator.cc +++ b/components/autofill/core/browser/suggestions/addresses/address_suggestion_generator.cc
@@ -655,23 +655,23 @@ // Field types we are interested in showing suggestions for. // TODO(crbug.com/381994105): Add a finch parameter to easily experiment with // adding and removing field types. - static constexpr FieldTypeSet kTypes = { - NAME_FULL, - NAME_LAST, - NAME_LAST_SECOND, - COMPANY_NAME, - ADDRESS_HOME_LINE1, - ADDRESS_HOME_LINE2, - ADDRESS_HOME_LINE3, - ADDRESS_HOME_STREET_ADDRESS, - ADDRESS_HOME_CITY, - ADDRESS_HOME_STATE, - ADDRESS_HOME_COUNTRY, - ADDRESS_HOME_STREET_NAME, - EMAIL_ADDRESS, - PHONE_HOME_CITY_AND_NUMBER, - PHONE_HOME_WHOLE_NUMBER, - ADDRESS_HOME_ZIP}; + static constexpr FieldTypeSet kTypes = {NAME_FULL, + NAME_LAST, + NAME_LAST_SECOND, + COMPANY_NAME, + ADDRESS_HOME_LINE1, + ADDRESS_HOME_LINE2, + ADDRESS_HOME_LINE3, + ADDRESS_HOME_STREET_ADDRESS, + ADDRESS_HOME_CITY, + ADDRESS_HOME_STATE, + ADDRESS_HOME_COUNTRY, + ADDRESS_HOME_STREET_NAME, + EMAIL_ADDRESS, + EMAIL_OR_LOYALTY_MEMBERSHIP_ID, + PHONE_HOME_CITY_AND_NUMBER, + PHONE_HOME_WHOLE_NUMBER, + ADDRESS_HOME_ZIP}; // Some field types require only `kMinNumberCharactersToMatch - 1` matching // characters for a suggestion to be shown. The assumption is that these field // types do not need the same matching prefix length to produce less false
diff --git a/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator.cc b/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator.cc index 1d407d7..9f35d1b 100644 --- a/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator.cc +++ b/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator.cc
@@ -140,6 +140,13 @@ if (loyalty_card_suggestions.empty()) { return; } + if (email_suggestions.empty()) { + email_suggestions.insert( + email_suggestions.end(), + std::make_move_iterator(loyalty_card_suggestions.begin()), + std::make_move_iterator(loyalty_card_suggestions.end())); + return; + } Suggestion submenu_suggestion = Suggestion( l10n_util::GetStringUTF16(IDS_AUTOFILL_LOYALTY_CARDS_SUBMENU_TITLE),
diff --git a/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator_unittest.cc b/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator_unittest.cc index 1103f0c..93b07380 100644 --- a/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator_unittest.cc +++ b/components/autofill/core/browser/suggestions/valuables/valuable_suggestion_generator_unittest.cc
@@ -264,6 +264,43 @@ } TEST_F(ValuableSuggestionGeneratorTest, + ExtendEmailSuggestionsWithLoyaltyCardSuggestions_NoEmails) { + const std::vector<LoyaltyCard> loyalty_cards = {LoyaltyCard( + /*loyalty_card_id=*/ValuableId("loyalty_card_id_1"), + /*merchant_name=*/"CVS Pharmacy", + /*program_name=*/"CVS Extra", + /*program_logo=*/GURL("https://empty.url.com"), + /*loyalty_card_number=*/"987654321987654321", + {GURL("https://domain1.example"), + GURL("https://common-domain.example")})}; + + test_api(valuables_data_manager()).SetLoyaltyCards(loyalty_cards); + + std::vector<Suggestion> email_suggestions; + + ExtendEmailSuggestionsWithLoyaltyCardSuggestions( + email_suggestions, valuables_data_manager(), + GURL("https://common-domain.example/test")); + + EXPECT_THAT(email_suggestions, + testing::ElementsAre( + EqualsSuggestion( + SuggestionType::kLoyaltyCardEntry, u"987654321987654321", + /*is_main_text_primary=*/true, Suggestion::Icon::kNoIcon, + {{Suggestion::Text(u"CVS Pharmacy")}}, + Suggestion::Guid("loyalty_card_id_1")), + EqualsSuggestion(SuggestionType::kSeparator), + EqualsSuggestion(SuggestionType::kManageLoyaltyCard, + l10n_util::GetStringUTF16( + IDS_AUTOFILL_MANAGE_LOYALTY_CARDS), + Suggestion::Icon::kSettings))); +#if BUILDFLAG(GOOGLE_CHROME_BRANDING) + EXPECT_THAT(email_suggestions.back(), + HasTrailingIcon(Suggestion::Icon::kGoogleWallet)); +#endif +} + +TEST_F(ValuableSuggestionGeneratorTest, ExtendEmailSuggestionsWithLoyaltyCardSuggestions_NoLoyaltyCards) { test_api(valuables_data_manager()).SetLoyaltyCards({});
diff --git a/components/autofill/core/browser/test_utils/autofill_form_test_utils.cc b/components/autofill/core/browser/test_utils/autofill_form_test_utils.cc index 0916a6b..a5da5cb 100644 --- a/components/autofill/core/browser/test_utils/autofill_form_test_utils.cc +++ b/components/autofill/core/browser/test_utils/autofill_form_test_utils.cc
@@ -86,6 +86,10 @@ field.set_label(u"Frequent Flyer Number"); field.set_name(u"frequentflyer"); break; + case FieldType::EMAIL_OR_LOYALTY_MEMBERSHIP_ID: + field.set_label(u"Email or Frequent Flyer Number"); + field.set_name(u"email_or_frequentflyer"); + break; case FieldType::EMPTY_TYPE: break; default:
diff --git a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc index 0d3a363..538b139 100644 --- a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.cc
@@ -303,7 +303,7 @@ } std::string AutofillProfileSyncBridge::GetClientTag( - const EntityData& entity_data) { + const EntityData& entity_data) const { DCHECK(entity_data.specifics.has_autofill_profile()); // Must equal to guid of the entry. This is to maintain compatibility with the // previous sync integration (Directory and SyncableService). @@ -311,7 +311,7 @@ } std::string AutofillProfileSyncBridge::GetStorageKey( - const EntityData& entity_data) { + const EntityData& entity_data) const { DCHECK(entity_data.specifics.has_autofill_profile()); return GetStorageKeyFromAutofillProfileSpecifics( entity_data.specifics.autofill_profile());
diff --git a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.h b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.h index 56e0a1c..e6c9e1e 100644 --- a/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.h +++ b/components/autofill/core/browser/webdata/addresses/autofill_profile_sync_bridge.h
@@ -81,8 +81,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; // AutofillWebDataServiceObserverOnDBSequence implementation. void AutofillProfileChanged(const AutofillProfileChange& change) override;
diff --git a/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.cc b/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.cc index eba61f4..061f2ce 100644 --- a/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.cc
@@ -184,12 +184,12 @@ } std::string ContactInfoSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string ContactInfoSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(IsEntityDataValid(entity_data)); return entity_data.specifics.contact_info().guid(); }
diff --git a/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.h b/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.h index a25ba7d..4f83e5d 100644 --- a/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.h +++ b/components/autofill/core/browser/webdata/addresses/contact_info_sync_bridge.h
@@ -65,8 +65,10 @@ StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override; sync_pb::EntitySpecifics TrimAllSupportedFieldsFromRemoteSpecifics(
diff --git a/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.cc b/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.cc index e728090..f327b89 100644 --- a/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.cc
@@ -521,7 +521,7 @@ } std::string AutocompleteSyncBridge::GetClientTag( - const EntityData& entity_data) { + const EntityData& entity_data) const { DCHECK(entity_data.specifics.has_autofill()); // Must have the format "autofill_entry|$name|$value" where $name and $value // are URL escaped. This is to maintain compatibility with the previous sync @@ -531,7 +531,7 @@ } std::string AutocompleteSyncBridge::GetStorageKey( - const EntityData& entity_data) { + const EntityData& entity_data) const { DCHECK(entity_data.specifics.has_autofill()); // Marginally more space efficient than GetClientTag() by omitting the // kAutocompleteEntryNamespaceTag prefix and using protobuf serialization
diff --git a/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.h b/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.h index 8f1c6579..a53f8c5 100644 --- a/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.h +++ b/components/autofill/core/browser/webdata/autocomplete/autocomplete_sync_bridge.h
@@ -61,8 +61,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; // AutofillWebDataServiceObserverOnDBSequence implementation. void AutocompleteEntriesChanged(
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.cc b/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.cc index 613130a..3c66c30d 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.cc
@@ -190,7 +190,7 @@ } std::string AutofillWalletCredentialSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { CHECK(IsEntityDataValid(entity_data)); const sync_pb::AutofillWalletCredentialSpecifics& autofill_wallet_credential_data = @@ -200,7 +200,7 @@ } std::string AutofillWalletCredentialSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { // Storage key and client tag are equivalent for this DataType. return GetClientTag(entity_data); }
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.h b/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.h index c23ff9f..96939cd 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.h +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_credential_sync_bridge.h
@@ -68,8 +68,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override;
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.cc b/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.cc index 027e144..8b813d8b 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.cc
@@ -390,7 +390,7 @@ } std::string AutofillWalletMetadataSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); const WalletMetadataSpecifics& remote_metadata = entity_data.specifics.wallet_metadata(); @@ -399,7 +399,7 @@ } std::string AutofillWalletMetadataSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return GetStorageKeyForWalletMetadataTypeAndSpecificsId( entity_data.specifics.wallet_metadata().type(),
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.h b/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.h index c28b655..fd186bf 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.h +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_metadata_sync_bridge.h
@@ -77,8 +77,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.cc b/components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.cc index 8061f03..7be66e3 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.cc
@@ -120,14 +120,14 @@ } std::string AutofillWalletOfferSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(entity_data.specifics.has_autofill_offer()); return GetClientTagFromSpecifics(entity_data.specifics.autofill_offer()); } std::string AutofillWalletOfferSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(entity_data.specifics.has_autofill_offer()); return GetStorageKeyFromSpecifics(entity_data.specifics.autofill_offer());
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.h b/components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.h index 931cff67c..7179e73 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.h +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_offer_sync_bridge.h
@@ -59,8 +59,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; bool SupportsIncrementalUpdates() const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.cc b/components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.cc index deb8dc82..bb05cb4 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.cc
@@ -295,7 +295,7 @@ } std::string AutofillWalletSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_autofill_wallet()); return syncer::GetUnhashedClientTagFromAutofillWalletSpecifics( @@ -303,7 +303,7 @@ } std::string AutofillWalletSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_autofill_wallet()); return GetStorageKeyForWalletDataClientTag( syncer::GetUnhashedClientTagFromAutofillWalletSpecifics(
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.h b/components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.h index 8672db7..9e1e76e 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.h +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_sync_bridge.h
@@ -67,8 +67,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; bool SupportsIncrementalUpdates() const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_usage_data_sync_bridge.cc b/components/autofill/core/browser/webdata/payments/autofill_wallet_usage_data_sync_bridge.cc index 2866fec0..5feb9fa5 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_usage_data_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_usage_data_sync_bridge.cc
@@ -171,13 +171,13 @@ } std::string AutofillWalletUsageDataSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_autofill_wallet_usage()); return entity_data.specifics.autofill_wallet_usage().guid(); } std::string AutofillWalletUsageDataSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_autofill_wallet_usage()); // Use client tag as the storage key.
diff --git a/components/autofill/core/browser/webdata/payments/autofill_wallet_usage_data_sync_bridge.h b/components/autofill/core/browser/webdata/payments/autofill_wallet_usage_data_sync_bridge.h index 9fbc0cbc..f6b9f1b 100644 --- a/components/autofill/core/browser/webdata/payments/autofill_wallet_usage_data_sync_bridge.h +++ b/components/autofill/core/browser/webdata/payments/autofill_wallet_usage_data_sync_bridge.h
@@ -61,8 +61,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override;
diff --git a/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.cc b/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.cc index 35cd039..715acb8 100644 --- a/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.cc
@@ -154,12 +154,12 @@ } std::string ValuableSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string ValuableSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(IsEntityDataValid(entity_data)); return entity_data.specifics.autofill_valuable().id(); }
diff --git a/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.h b/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.h index f5ea8c6..ac5f500 100644 --- a/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.h +++ b/components/autofill/core/browser/webdata/valuables/valuable_sync_bridge.h
@@ -63,8 +63,10 @@ StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override; sync_pb::EntitySpecifics TrimAllSupportedFieldsFromRemoteSpecifics(
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/AsyncNotificationManagerProxyImpl.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/AsyncNotificationManagerProxyImpl.java index 11465898..7e5ca29 100644 --- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/AsyncNotificationManagerProxyImpl.java +++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/AsyncNotificationManagerProxyImpl.java
@@ -31,18 +31,28 @@ @NullMarked /* package */ class AsyncNotificationManagerProxyImpl implements BaseNotificationManagerProxy { private static final String TAG = "AsyncNotifManager"; - private final NotificationManagerCompat mNotificationManager; - private static @Nullable BaseNotificationManagerProxy sInstance; - public static BaseNotificationManagerProxy getInstance() { + // This object is initialized and used on a background thread, and it should always be non + // null when used. + @SuppressWarnings("NullAway.Init") + private NotificationManagerCompat mNotificationManager; + + private static @Nullable AsyncNotificationManagerProxyImpl sInstance; + + public static AsyncNotificationManagerProxyImpl getInstance() { if (sInstance == null) { - sInstance = new NotificationManagerProxyImpl(); + sInstance = new AsyncNotificationManagerProxyImpl(); } return sInstance; } private AsyncNotificationManagerProxyImpl() { - mNotificationManager = NotificationManagerCompat.from(ContextUtils.getApplicationContext()); + runAsync( + "AsyncNotificationManagerProxyImpl()", + () -> { + mNotificationManager = + NotificationManagerCompat.from(ContextUtils.getApplicationContext()); + }); } @Override
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl.java index 3dc7e0354..e4eccc1 100644 --- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl.java +++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/NotificationManagerProxyImpl.java
@@ -36,14 +36,18 @@ @NullMarked public class NotificationManagerProxyImpl implements NotificationManagerProxy { private static final String TAG = "NotifManagerProxy"; - private final NotificationManagerCompat mNotificationManager; + + @SuppressWarnings("NullAway.Init") + private NotificationManagerCompat mNotificationManager; private static @Nullable NotificationManagerProxy sInstance; public static NotificationManagerProxy getInstance() { // No need to cache the real instance, it makes testing more difficult as tests that shadow // the NotificationManager would have to clear this. - if (sInstance == null) return new NotificationManagerProxyImpl(); + if (sInstance == null) { + sInstance = new NotificationManagerProxyImpl(); + } return sInstance; } @@ -55,7 +59,12 @@ } public NotificationManagerProxyImpl() { - mNotificationManager = NotificationManagerCompat.from(ContextUtils.getApplicationContext()); + runRunnable( + TraceEvent.scoped("NotificationManagerProxyImpl()"), + () -> { + mNotificationManager = + NotificationManagerCompat.from(ContextUtils.getApplicationContext()); + }); } @Override
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb index e8fb8f8..290ec5a0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -533,7 +533,7 @@ <translation id="7759147511335618829">Управление/программирование MIDI</translation> <translation id="7781829728241885113">Вчера</translation> <translation id="7791543448312431591">Добавить</translation> -<translation id="7801888679188438140">{TILE_COUNT,plural, =1{Продолжить просмотр}one{Продолжить просмотр}few{Продолжить просмотр}many{Продолжить просмотр}other{Продолжить просмотр}}</translation> +<translation id="7801888679188438140">{TILE_COUNT,plural, =1{Снова открыть эту вкладку}one{Снова открыть эти вкладки}few{Снова открыть эти вкладки}many{Снова открыть эти вкладки}other{Снова открыть эти вкладки}}</translation> <translation id="780301667611848630">Нет, спасибо</translation> <translation id="7804248752222191302">Сайт использует вашу камеру</translation> <translation id="7807060072011926525">Данные от Google</translation> @@ -550,7 +550,7 @@ <translation id="7986741934819883144">Выберите контакт</translation> <translation id="7990211076305263060">Когда этот параметр включен, сайты могут запрашивать разрешение на использование микрофона. Когда параметр отключен, им запрещено использовать ваш микрофон.</translation> <translation id="8007176423574883786">Отключено для этого устройства</translation> -<translation id="8010630645305864042">{TILE_COUNT,plural, =1{Скрыть карточку "Продолжить просмотр этой вкладки"}one{Скрыть карточку "Продолжить просмотр этих вкладок"}few{Скрыть карточку "Продолжить просмотр этих вкладок"}many{Скрыть карточку "Продолжить просмотр этих вкладок"}other{Скрыть карточку "Продолжить просмотр этих вкладок"}}</translation> +<translation id="8010630645305864042">{TILE_COUNT,plural, =1{Скрыть "Снова открыть эту вкладку"}one{Скрыть "Снова открыть эти вкладки"}few{Скрыть "Снова открыть эти вкладки"}many{Скрыть "Снова открыть эти вкладки"}other{Скрыть "Снова открыть эти вкладки"}}</translation> <translation id="802154636333426148">Ошибка скачивания</translation> <translation id="8042586301629853791">Упорядочить:</translation> <translation id="8051193500142930381">Функции, которые используют камеру, не будут работать</translation>
diff --git a/components/cast_streaming/browser/BUILD.gn b/components/cast_streaming/browser/BUILD.gn index 5ccec31..eb578b8 100644 --- a/components/cast_streaming/browser/BUILD.gn +++ b/components/cast_streaming/browser/BUILD.gn
@@ -26,6 +26,7 @@ "cast_message_port_converter.h", "cast_streaming_session.cc", "cast_streaming_session.h", + "cast_streaming_switches.h", "receiver_config_conversions.cc", "receiver_config_conversions.h", "receiver_session_impl.cc",
diff --git a/components/cast_streaming/browser/cast_streaming_session.cc b/components/cast_streaming/browser/cast_streaming_session.cc index fc0020d..c5838e8 100644 --- a/components/cast_streaming/browser/cast_streaming_session.cc +++ b/components/cast_streaming/browser/cast_streaming_session.cc
@@ -10,6 +10,7 @@ #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "components/cast_streaming/browser/cast_message_port_converter.h" +#include "components/cast_streaming/browser/cast_streaming_switches.h" #include "components/cast_streaming/browser/common/decoder_buffer_factory.h" #include "components/cast_streaming/browser/control/remoting/remoting_decoder_buffer_factory.h" #include "components/cast_streaming/browser/frame/mirroring_decoder_buffer_factory.h" @@ -29,6 +30,23 @@ // Timeout to stop the Session when no data is received. constexpr base::TimeDelta kNoDataTimeout = base::Seconds(15); +// Get the receiver streaming endpoint settings. +const openscreen::IPEndpoint GetReceiverStreamingEndpoint() { + const std::string port = + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + switches::kCastStreamingReceiverPort); + if (!port.empty()) { + const auto ipv4_ep = openscreen::IPEndpoint::Parse("0.0.0.0:" + port); + if (ipv4_ep.is_value()) { + LOG(INFO) << "Using UDP port " << port << " for Cast streaming."; + return ipv4_ep.value(); + } + LOG(ERROR) << "Can not parse value(" << port << ") from --" + << switches::kCastStreamingReceiverPort; + } + return openscreen::IPEndpoint::kAnyV4(); +} + bool CreateDataPipeForStreamType(media::DemuxerStream::Type type, mojo::ScopedDataPipeProducerHandle* producer, mojo::ScopedDataPipeConsumerHandle* consumer) { @@ -74,7 +92,9 @@ ReceiverSession::MessagePortProvider message_port_provider, scoped_refptr<base::SequencedTaskRunner> task_runner) : task_runner_(task_runner), - environment_(&openscreen::Clock::now, task_runner_), + environment_(&openscreen::Clock::now, + task_runner_, + GetReceiverStreamingEndpoint()), cast_message_port_converter_(CastMessagePortConverter::Create( std::move(message_port_provider), base::BindOnce(
diff --git a/components/cast_streaming/browser/cast_streaming_switches.h b/components/cast_streaming/browser/cast_streaming_switches.h new file mode 100644 index 0000000..b38e0b45 --- /dev/null +++ b/components/cast_streaming/browser/cast_streaming_switches.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 COMPONENTS_CAST_STREAMING_BROWSER_CAST_STREAMING_SWITCHES_H_ +#define COMPONENTS_CAST_STREAMING_BROWSER_CAST_STREAMING_SWITCHES_H_ + +namespace switches { + +// If set, allows to use a specific UDP port for Cast Streaming sessions on the +// receiver side. Otherwise the Cast Streaming receiver is using a random +// system port. +inline constexpr char kCastStreamingReceiverPort[] = + "cast-streaming-receiver-port"; + +} // namespace switches + +#endif // COMPONENTS_CAST_STREAMING_BROWSER_CAST_STREAMING_SWITCHES_H_
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 39f0af6..16d8e95 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "54.1", - "log_list_timestamp": "2025-05-14T12:54:55Z", + "version": "54.4", + "log_list_timestamp": "2025-05-16T12:54:03Z", "operators": [ { "name": "Google",
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 25afe4d8..6bd0405 100644 --- a/components/commerce/core/product_specifications/product_specifications_sync_bridge.cc +++ b/components/commerce/core/product_specifications/product_specifications_sync_bridge.cc
@@ -148,12 +148,12 @@ } std::string ProductSpecificationsSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return entity_data.specifics.product_comparison().uuid(); } std::string ProductSpecificationsSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); }
diff --git a/components/commerce/core/product_specifications/product_specifications_sync_bridge.h b/components/commerce/core/product_specifications/product_specifications_sync_bridge.h index 6be90171..76b04bb 100644 --- a/components/commerce/core/product_specifications/product_specifications_sync_bridge.h +++ b/components/commerce/core/product_specifications/product_specifications_sync_bridge.h
@@ -76,8 +76,10 @@ std::optional<syncer::ModelError> ApplyIncrementalSyncChanges( std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override;
diff --git a/components/consent_auditor/consent_sync_bridge_impl.cc b/components/consent_auditor/consent_sync_bridge_impl.cc index 5b92c49..c172a91 100644 --- a/components/consent_auditor/consent_sync_bridge_impl.cc +++ b/components/consent_auditor/consent_sync_bridge_impl.cc
@@ -143,12 +143,13 @@ return batch; } -std::string ConsentSyncBridgeImpl::GetClientTag(const EntityData& entity_data) { +std::string ConsentSyncBridgeImpl::GetClientTag( + const EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string ConsentSyncBridgeImpl::GetStorageKey( - const EntityData& entity_data) { + const EntityData& entity_data) const { return GetStorageKeyFromSpecifics(entity_data.specifics.user_consent()); }
diff --git a/components/consent_auditor/consent_sync_bridge_impl.h b/components/consent_auditor/consent_sync_bridge_impl.h index 087b422..515a8be 100644 --- a/components/consent_auditor/consent_sync_bridge_impl.h +++ b/components/consent_auditor/consent_sync_bridge_impl.h
@@ -43,8 +43,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/components/data_sharing/internal/collaboration_group_sync_bridge.cc b/components/data_sharing/internal/collaboration_group_sync_bridge.cc index 70ecedd..cd8dc25 100644 --- a/components/data_sharing/internal/collaboration_group_sync_bridge.cc +++ b/components/data_sharing/internal/collaboration_group_sync_bridge.cc
@@ -157,13 +157,13 @@ } std::string CollaborationGroupSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return GetStorageKey(entity_data); } std::string CollaborationGroupSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); CHECK(entity_data.specifics.has_collaboration_group()); return entity_data.specifics.collaboration_group().collaboration_id();
diff --git a/components/data_sharing/internal/collaboration_group_sync_bridge.h b/components/data_sharing/internal/collaboration_group_sync_bridge.h index b7eded2..be4b5edc 100644 --- a/components/data_sharing/internal/collaboration_group_sync_bridge.h +++ b/components/data_sharing/internal/collaboration_group_sync_bridge.h
@@ -68,8 +68,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override;
diff --git a/components/desks_storage/core/desk_sync_bridge.cc b/components/desks_storage/core/desk_sync_bridge.cc index 1123653..5c7a449 100644 --- a/components/desks_storage/core/desk_sync_bridge.cc +++ b/components/desks_storage/core/desk_sync_bridge.cc
@@ -265,12 +265,12 @@ } std::string DeskSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string DeskSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return entity_data.specifics.workspace_desk().uuid(); }
diff --git a/components/desks_storage/core/desk_sync_bridge.h b/components/desks_storage/core/desk_sync_bridge.h index 52bff9dc..19044ba 100644 --- a/components/desks_storage/core/desk_sync_bridge.h +++ b/components/desks_storage/core/desk_sync_bridge.h
@@ -58,8 +58,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; // DeskModel overrides. DeskModel::GetAllEntriesResult GetAllEntries() override;
diff --git a/components/external_intents/android/external_intents_features.cc b/components/external_intents/android/external_intents_features.cc index 0fd49eca..ecbdc2c 100644 --- a/components/external_intents/android/external_intents_features.cc +++ b/components/external_intents/android/external_intents_features.cc
@@ -25,8 +25,8 @@ // Array of features exposed through the Java ExternalIntentsFeatures API. const base::Feature* const kFeaturesExposedToJava[] = { - &kExternalNavigationDebugLogs, &kBlockFrameRenavigations, - &kBlockIntentsToSelf, &kNavigationCaptureRefactorAndroid}; + &kExternalNavigationDebugLogs, &kBlockIntentsToSelf, + &kNavigationCaptureRefactorAndroid}; } // namespace @@ -36,10 +36,6 @@ "ExternalNavigationDebugLogs", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kBlockFrameRenavigations, - "BlockFrameRenavigations3", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kBlockIntentsToSelf, "BlockIntentsToSelf", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java index c3f5b39..54789ed 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
@@ -13,15 +13,13 @@ /** * Java accessor for base/feature_list.h state. * - * This class provides methods to access values of feature flags registered in + * <p>This class provides methods to access values of feature flags registered in * |kFeaturesExposedToJava| in components/external_intents/android/external_intents_features.cc. - * */ @JNINamespace("external_intents") @NullMarked public class ExternalIntentsFeatures extends Features { public static final String EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME = "ExternalNavigationDebugLogs"; - public static final String BLOCK_FRAME_RENAVIGATIONS_NAME = "BlockFrameRenavigations3"; public static final String BLOCK_INTENTS_TO_SELF_NAME = "BlockIntentsToSelf"; public static final String NAVIGATION_CAPTURE_REFACTOR_ANDROID_NAME = "NavigationCaptureRefactorAndroid"; @@ -29,14 +27,11 @@ public static final ExternalIntentsFeatures EXTERNAL_NAVIGATION_DEBUG_LOGS = new ExternalIntentsFeatures(0, EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME); - public static final ExternalIntentsFeatures BLOCK_FRAME_RENAVIGATIONS = - new ExternalIntentsFeatures(1, BLOCK_FRAME_RENAVIGATIONS_NAME); - public static final ExternalIntentsFeatures BLOCK_INTENTS_TO_SELF = - new ExternalIntentsFeatures(2, BLOCK_INTENTS_TO_SELF_NAME); + new ExternalIntentsFeatures(1, BLOCK_INTENTS_TO_SELF_NAME); public static final ExternalIntentsFeatures NAVIGATION_CAPTURE_REFACTOR_ANDROID = - new ExternalIntentsFeatures(3, NAVIGATION_CAPTURE_REFACTOR_ANDROID_NAME); + new ExternalIntentsFeatures(2, NAVIGATION_CAPTURE_REFACTOR_ANDROID_NAME); private final int mOrdinal;
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java index 464a4b79..fab8aa3c 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
@@ -1321,8 +1321,6 @@ * performing a navigation when it's actually a background tab doing the navigation. */ private boolean isHiddenCrossFrameRenavigation(ExternalNavigationParams params) { - if (!ExternalIntentsFeatures.BLOCK_FRAME_RENAVIGATIONS.isEnabled()) return false; - if (params.getRedirectHandler().navigationChainPerformedHiddenCrossFrameNavigation()) { if (debug()) Log.i(TAG, "Navigation chain used cross-frame re-navigation."); return true;
diff --git a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java index 8d0ed56..24f3866 100644 --- a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java +++ b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java
@@ -73,10 +73,7 @@ @RunWith(BaseJUnit4ClassRunner.class) @Batch(Batch.UNIT_TESTS) @Features.DisableFeatures(ExternalIntentsFeatures.EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME) -@Features.EnableFeatures({ - ExternalIntentsFeatures.BLOCK_FRAME_RENAVIGATIONS_NAME, - ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME -}) +@Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME}) public class ExternalNavigationHandlerTest { // Expectations private static final int IGNORE = 0x0;
diff --git a/components/headless/screen_info/README.md b/components/headless/screen_info/README.md new file mode 100644 index 0000000..a9aa21b --- /dev/null +++ b/components/headless/screen_info/README.md
@@ -0,0 +1,77 @@ +# Headless `--screen-info` switch + +Headless Chrome and Chrome Headless Shell support headless screen configuration using `--screen-info` switch. + +The following example starts Chrome in headless mode with a virtual screen that has two displays: a primary one with resolution 1600x1200 pixels, and a secondary one also with resolution 1600x1200 with portrait orientation located to the right of the primary one and scale factor of 2.0 + + +``` +./chrome --headless --screen-info={1600x1200}{1200x1600 devicePixelRatio=2.0} +``` + + +## `--screen-info` switch parameters + +Screen is defined by a set of space separated parameters enclosed in curly brackets `{}`. There can be more than one screen defined resulting in multiscreen configuration in which the first defined screen is the primary screen. + +All screen parameters are optional and assume the default values if omitted. For example, `{}` specifies the default 800x600 primary screen with scale factor 1.0, 24 bit color depth and work area occupying the entire screen. + + +## Screen origin and size + +The first two parameters are positional and specify screen origin and size in the format `X,Y` `WxH`, for example: `{0,0 1024x768}`. Screen origin is defined as the distance from the primary screen top left corner to the top left of the screen. Consequently, the primary screen origin is always at 0,0. + +If screen size is omitted the default size is 800x600. If screen origin is omitted, the default origin is 0,0 for the primary screen and adjacent origin to the right of the previous screen for the secondary screens. For example, `{}{}` defines a two screen configuration equivalent to `{0,0 800x600}{800,0 800x600}`. + +Screen origin and size are exposed by [ScreenDetailed: left](https://developer.mozilla.org/en-US/docs/Web/API/ScreenDetailed/left), [ScreenDetailed: top](https://developer.mozilla.org/en-US/docs/Web/API/ScreenDetailed/top), [Screen: width](https://developer.mozilla.org/en-US/docs/Web/API/Screen/width) and [Screen: height](https://developer.mozilla.org/en-US/docs/Web/API/Screen/height) properties respectively. + + +## Screen orientation + +[Screen orientation](https://w3c.github.io/screen-orientation/#dom-screen-orientation) is defined by the screen size parameter: if screen width is greater or equal to its height, the orientation is landscape, otherwise it is portrait. + +Screen orientation is exposed by the [Screen: orientation](https://developer.mozilla.org/en-US/docs/Web/API/Screen/orientation) property. + + +## Work area + +Screen work area is defined by `workAreaLeft`, `workAreaRight`, `workAreaTop` and `workAreaBottom` parameters. The default value for each of these parameters is 0. The value cannot be negative. + +These screen parameters are exposed by the [ScreenDetailed: availLeft](https://developer.mozilla.org/en-US/docs/Web/API/ScreenDetailed/availLeft), [ScreenDetailed: availTop](https://developer.mozilla.org/en-US/docs/Web/API/ScreenDetailed/availTop), [Screen: availWidth](https://developer.mozilla.org/en-US/docs/Web/API/Screen/availWidth) and [Screen: availHeight](https://developer.mozilla.org/en-US/docs/Web/API/Screen/availHeight) properties respectively. + + +## Color depth + +Screen color depth is specified by the `colorDepth` parameter. The default value is 24. The minimal value is 1. + +This screen parameter is exposed by the [ScreenDetailed colorDepth](https://developer.mozilla.org/en-US/docs/Web/API/Screen/colorDepth) property or its alias [Screen: pixelDepth](https://developer.mozilla.org/en-US/docs/Web/API/Screen/pixelDepth). + + +## Device pixel ratio + +Device pixel ratio defines the ratio between physical and logical pixels and is specified by the `devicePixelRatio` parameter. The default value is 1.0. The minimal value is 0.5. + +This screen parameter is exposed by the [ScreenDetailed devicePixelRatio](https://developer.mozilla.org/en-US/docs/Web/API/ScreenDetailed/devicePixelRatio) property. For example, specifying `{1600x1200 devicePixelRatio=2}` will result in `ScreenDetailed` with the following properties: `width:800 height:600 devicePixelRatio:2`. + + +## Internal screen + +The `isInternal` parameter indicates whether the screen is internal to the device (typically a notebook, tablet or phone screen) or external, connected to the device (typically a wired monitor). The allowed values are `0`, `1`, `false` and `true`. Default is `true`. + +This screen parameter is exposed by the [ScreenDetailed: isInternal](https://developer.mozilla.org/en-US/docs/Web/API/ScreenDetailed/isInternal) property. + + +## Screen label + +A user-friendly label for the screen is specified by the `label` parameter. The default value is no label. Should be enclosed in single quotes if it contains spaces. + +Example: `{label='Monitor #1'}{label='Monitor #2'}`. + +This screen parameter is exposed by the [ScreenDetailed: label](https://developer.mozilla.org/en-US/docs/Web/API/ScreenDetailed/label) property. + + +## Screen rotation + +Screen rotation angle is specified by the `rotation` parameter. The valid values are `0`, `90`, `180` and `270`. + +This screen parameter is exposed as [ScreenOrientation: angle](https://developer.mozilla.org/en-US/docs/Web/API/ScreenOrientation/angle) property.
diff --git a/components/history/core/browser/sync/history_sync_bridge.cc b/components/history/core/browser/sync/history_sync_bridge.cc index a3480eb..9a6e315 100644 --- a/components/history/core/browser/sync/history_sync_bridge.cc +++ b/components/history/core/browser/sync/history_sync_bridge.cc
@@ -741,7 +741,7 @@ } std::string HistorySyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(entity_data.specifics.has_history()) << "EntityData does not have history specifics."; @@ -751,7 +751,7 @@ } std::string HistorySyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(entity_data.specifics.has_history()) << "EntityData does not have history specifics.";
diff --git a/components/history/core/browser/sync/history_sync_bridge.h b/components/history/core/browser/sync/history_sync_bridge.h index 741fc514..8a2730c 100644 --- a/components/history/core/browser/sync/history_sync_bridge.h +++ b/components/history/core/browser/sync/history_sync_bridge.h
@@ -57,8 +57,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; syncer::ConflictResolution ResolveConflict( const std::string& storage_key, const syncer::EntityData& remote_data) const override;
diff --git a/components/input/android_input_helper.cc b/components/input/android_input_helper.cc index 13666d6..f048b09 100644 --- a/components/input/android_input_helper.cc +++ b/components/input/android_input_helper.cc
@@ -56,6 +56,27 @@ view_->GetViewRenderInputRouter()->delegate()->GetInputEventRouter(); } +void AndroidInputHelper::ResetGestureDetection() { + ui::FilteredGestureProvider& gesture_provider = + delegate_->GetGestureProvider(); + + const ui::MotionEvent* current_down_event = + gesture_provider.GetCurrentDownEvent(); + if (!current_down_event) { + // A hard reset ensures prevention of any timer-based events that might fire + // after a touch sequence has ended. + gesture_provider.ResetDetection(); + return; + } + + std::unique_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel(); + if (gesture_provider.OnTouchEvent(*cancel_event).succeeded) { + blink::WebTouchEvent web_event = ui::CreateWebTouchEventFromMotionEvent( + *cancel_event, false /* may_cause_scrolling */, false /* hovering */); + RouteOrForwardTouchEvent(web_event); + } +} + bool AndroidInputHelper::RequiresDoubleTapGestureEvents() const { return true; }
diff --git a/components/input/android_input_helper.h b/components/input/android_input_helper.h index 1029aec..aca4671 100644 --- a/components/input/android_input_helper.h +++ b/components/input/android_input_helper.h
@@ -35,6 +35,8 @@ bool ShouldRouteEvents() const; + void ResetGestureDetection(); + void OnGestureEvent(const ui::GestureEventData& gesture); bool RequiresDoubleTapGestureEvents() const;
diff --git a/components/input/render_input_router.mojom b/components/input/render_input_router.mojom index 68d34e5..78d66c5 100644 --- a/components/input/render_input_router.mojom +++ b/components/input/render_input_router.mojom
@@ -82,6 +82,10 @@ // Notifies RenderInputRouter on the VizCompositor thread (corresponding to // |frame_sink_id|) of any visibility changes to its corresponding page. NotifyVisibilityChanged(viz.mojom.FrameSinkId frame_sink_id, bool is_hidden); + + // Generates a synthetic touch cancel, which results in touch events being + // dropped if there was an active touch sequence on Viz. + ResetGestureDetection(viz.mojom.FrameSinkId root_widget_frame_sink_id); }; // Implemented by the browser, this interface defines methods that will be
diff --git a/components/ip_protection/common/ip_protection_probabilistic_reveal_token_crypter_fuzztests.cc b/components/ip_protection/common/ip_protection_probabilistic_reveal_token_crypter_fuzztests.cc index c042d1ad..c5de19c 100644 --- a/components/ip_protection/common/ip_protection_probabilistic_reveal_token_crypter_fuzztests.cc +++ b/components/ip_protection/common/ip_protection_probabilistic_reveal_token_crypter_fuzztests.cc
@@ -18,9 +18,6 @@ #include "third_party/fuzztest/src/fuzztest/domain_core.h" #include "third_party/fuzztest/src/fuzztest/fuzztest.h" -namespace { -constexpr size_t kPlaintextSize = 29; -} // namespace // Fuzz test for creating probabilistic reveal token crypter. Creating crypter // de-serializes an Elgamal encryption public key and ciphertext (elliptic curve @@ -51,11 +48,12 @@ auto issuer = std::move(maybe_issuer).value(); base::expected<ip_protection::GetProbabilisticRevealTokenResponse, absl::Status> - maybe_response = issuer->Issue({plaintext}, - /*expiration=*/base::Time::Now(), - /*next_epoch_start=*/base::Time::Now(), - /*num_tokens_with_signal=*/0, - /*epoch_id=*/"epoch-id"); + maybe_response = + issuer->IssueByHashingToPoint({plaintext}, + /*expiration=*/base::Time::Now(), + /*next_epoch_start=*/base::Time::Now(), + /*num_tokens_with_signal=*/0, + /*epoch_id=*/"epoch-id"); ASSERT_TRUE(maybe_response.has_value()) << "creating tokens failed with error: " << maybe_response.error(); ASSERT_THAT(issuer->Tokens(), testing::SizeIs(1)); @@ -79,5 +77,4 @@ CreateDoesNotCrash); FUZZ_TEST(IpProtectionProbabilisticRevealTokenCrypterFuzzTests, - RandomizeDoesNotCrash) - .WithDomains(fuzztest::String().WithSize(kPlaintextSize)); + RandomizeDoesNotCrash);
diff --git a/components/ip_protection/common/probabilistic_reveal_token_test_issuer.cc b/components/ip_protection/common/probabilistic_reveal_token_test_issuer.cc index 5a18d47..afeaa08 100644 --- a/components/ip_protection/common/probabilistic_reveal_token_test_issuer.cc +++ b/components/ip_protection/common/probabilistic_reveal_token_test_issuer.cc
@@ -96,12 +96,55 @@ int32_t num_tokens_with_signal, std::string epoch_id) { tokens_.clear(); - GetProbabilisticRevealTokenResponse response_proto; + std::vector<ECPoint> plaintext_points; + plaintext_points.reserve(plaintexts.size()); for (const auto& pi : plaintexts) { + base::expected<ECPoint, absl::Status> maybe_plaintext_point = + GetPointByPadding(pi); + if (!maybe_plaintext_point.has_value()) { + return base::unexpected(maybe_plaintext_point.error()); + } + plaintext_points.push_back(std::move(maybe_plaintext_point).value()); + } + return IssueFromPoints(std::move(plaintext_points), expiration, + next_epoch_start, num_tokens_with_signal, epoch_id); +} + +base::expected<GetProbabilisticRevealTokenResponse, absl::Status> +ProbabilisticRevealTokenTestIssuer::IssueByHashingToPoint( + std::vector<std::string> plaintexts, + base::Time expiration, + base::Time next_epoch_start, + int32_t num_tokens_with_signal, + std::string epoch_id) { + tokens_.clear(); + std::vector<ECPoint> plaintext_points; + plaintext_points.reserve(plaintexts.size()); + for (const auto& pi : plaintexts) { + base::expected<ECPoint, absl::Status> maybe_plaintext_point = + GetPointByHashing(pi); + if (!maybe_plaintext_point.has_value()) { + return base::unexpected(maybe_plaintext_point.error()); + } + plaintext_points.push_back(std::move(maybe_plaintext_point).value()); + } + return IssueFromPoints(std::move(plaintext_points), expiration, + next_epoch_start, num_tokens_with_signal, epoch_id); +} + +base::expected<GetProbabilisticRevealTokenResponse, absl::Status> +ProbabilisticRevealTokenTestIssuer::IssueFromPoints( + std::vector<private_join_and_compute::ECPoint> plaintext_points, + base::Time expiration, + base::Time next_epoch_start, + int32_t num_tokens_with_signal, + std::string epoch_id) { + GetProbabilisticRevealTokenResponse response_proto; + for (const auto& pi : plaintext_points) { GetProbabilisticRevealTokenResponse_ProbabilisticRevealToken* token = response_proto.add_tokens(); base::expected<ProbabilisticRevealToken, absl::Status> maybe_token = - IssueInternal(pi); + Encrypt(pi); if (!maybe_token.has_value()) { return base::unexpected(maybe_token.error()); } @@ -137,22 +180,10 @@ } base::expected<ProbabilisticRevealToken, absl::Status> -ProbabilisticRevealTokenTestIssuer::IssueInternal( - const std::string& plaintext) const { - if (plaintext.size() != kPlaintextSize) { - return base::unexpected( - absl::InvalidArgumentError("plaintext size must be kPlaintextSize")); - } - absl::StatusOr<ECPoint> maybe_plaintext_point = group_->GetPointByPaddingX( - context_->CreateBigNum(plaintext), - /*padding_bit_count=*/kPaddingSize * kBitsPerByte); - if (!maybe_plaintext_point.ok()) { - return base::unexpected(maybe_plaintext_point.status()); - } - absl::StatusOr<Ciphertext> maybe_ciphertext = - encrypter_->Encrypt(maybe_plaintext_point.value()); +ProbabilisticRevealTokenTestIssuer::Encrypt(const ECPoint& point) const { + absl::StatusOr<Ciphertext> maybe_ciphertext = encrypter_->Encrypt(point); if (!maybe_ciphertext.ok()) { - return base::unexpected(maybe_plaintext_point.status()); + return base::unexpected(maybe_ciphertext.status()); } const auto& ciphertext = maybe_ciphertext.value(); @@ -172,6 +203,33 @@ std::move(maybe_e_compressed).value()); } +base::expected<ECPoint, absl::Status> +ProbabilisticRevealTokenTestIssuer::GetPointByPadding( + std::string plaintext) const { + if (plaintext.size() != kPlaintextSize) { + return base::unexpected( + absl::InvalidArgumentError("plaintext size must be kPlaintextSize")); + } + absl::StatusOr<ECPoint> maybe_plaintext_point = group_->GetPointByPaddingX( + context_->CreateBigNum(plaintext), + /*padding_bit_count=*/kPaddingSize * kBitsPerByte); + if (!maybe_plaintext_point.ok()) { + return base::unexpected(maybe_plaintext_point.status()); + } + return std::move(maybe_plaintext_point).value(); +} + +base::expected<ECPoint, absl::Status> +ProbabilisticRevealTokenTestIssuer::GetPointByHashing( + std::string message) const { + absl::StatusOr<ECPoint> maybe_plaintext_point = + group_->GetPointByHashingToCurveSha256(message); + if (!maybe_plaintext_point.ok()) { + return base::unexpected(maybe_plaintext_point.status()); + } + return std::move(maybe_plaintext_point).value(); +} + base::expected<std::string, absl::Status> ProbabilisticRevealTokenTestIssuer::DecryptSerializeEncode( const ProbabilisticRevealToken& token) {
diff --git a/components/ip_protection/common/probabilistic_reveal_token_test_issuer.h b/components/ip_protection/common/probabilistic_reveal_token_test_issuer.h index b0534e3..1f85967 100644 --- a/components/ip_protection/common/probabilistic_reveal_token_test_issuer.h +++ b/components/ip_protection/common/probabilistic_reveal_token_test_issuer.h
@@ -48,14 +48,25 @@ int32_t num_tokens_with_signal, std::string epoch_id); + // Create a response proto type for a given set of arguments. Tokens in + // response will contain ECPoints obtained by hashing `plaintexts` to group. + // Updates `tokens_` to new ones. `tokens_` is set to empty in case of + // failure, already existing ones (if any) are cleared. + base::expected<GetProbabilisticRevealTokenResponse, absl::Status> + IssueByHashingToPoint(std::vector<std::string> plaintexts, + base::Time expiration, + base::Time next_epoch_start, + int32_t num_tokens_with_signal, + std::string epoch_id); + // Decrypt a given `token` and return resulting string. `RevealToken()` will // return `plaintexts[i]` corresponding to the given `token`. See `Issue()`. base::expected<std::string, absl::Status> RevealToken( const ProbabilisticRevealToken& token) const; - // PRTs produced by the `Issue()` call. These are encrypted - // `ECGroup::GetPointByPaddingX(plaintexts[i])`. `RevealToken(Tokens()[i])` - // should yield `plaintexts[i]`. + // PRTs produced by the `Issue()` call are encrypted plaintexts mapped to + // points using `ECGroup::GetPointByPaddingX(plaintexts[i])`. + // `RevealToken(Tokens()[i])` should yield `plaintexts[i]`. const std::vector<ProbabilisticRevealToken>& Tokens() const { return tokens_; } @@ -77,8 +88,20 @@ std::unique_ptr<private_join_and_compute::ElGamalDecrypter> decrypter, std::string serialized_public_key); - base::expected<ProbabilisticRevealToken, absl::Status> IssueInternal( - const std::string& plaintext) const; + base::expected<GetProbabilisticRevealTokenResponse, absl::Status> + IssueFromPoints( + std::vector<private_join_and_compute::ECPoint> plaintext_points, + base::Time expiration, + base::Time next_epoch_start, + int32_t num_tokens_with_signal, + std::string epoch_id); + + base::expected<private_join_and_compute::ECPoint, absl::Status> + GetPointByPadding(std::string plaintext) const; + base::expected<private_join_and_compute::ECPoint, absl::Status> + GetPointByHashing(std::string message) const; + base::expected<ProbabilisticRevealToken, absl::Status> Encrypt( + const private_join_and_compute::ECPoint& point) const; base::expected<private_join_and_compute::ECPoint, absl::Status> Decrypt( const ProbabilisticRevealToken& token) const;
diff --git a/components/ip_protection/common/probabilistic_reveal_token_test_issuer_unittest.cc b/components/ip_protection/common/probabilistic_reveal_token_test_issuer_unittest.cc index a704dddb..c5e74288 100644 --- a/components/ip_protection/common/probabilistic_reveal_token_test_issuer_unittest.cc +++ b/components/ip_protection/common/probabilistic_reveal_token_test_issuer_unittest.cc
@@ -95,6 +95,48 @@ EXPECT_EQ(response.epoch_id(), epoch_id); } +TEST(ProbabilisticRevealTokenTestIssuerTest, IssueByHashingSuccess) { + base::expected<std::unique_ptr<ProbabilisticRevealTokenTestIssuer>, + absl::Status> + maybe_issuer = + ProbabilisticRevealTokenTestIssuer::Create(/*private_key=*/34); + ASSERT_TRUE(maybe_issuer.has_value()); + auto issuer = std::move(maybe_issuer.value()); + EXPECT_THAT(issuer->Tokens(), testing::SizeIs(0)); + std::vector<std::string> plaintexts = { + "arbitrary-string-with-arbitrary-size---", + "", + "a-bit-longer-for-testing-----------------------------------------------" + "-long-long-long--------", + }; + std::string another_str; + base::Base64Decode("/////52dlv///38HB5YAAAAAAAJ/EJaWlpaWlpY=", &another_str); + plaintexts.push_back(another_str); + const auto expiration_time = base::Time::Now() + base::Hours(10); + const auto next_epoch_start_time = base::Time::Now() + base::Hours(12); + const int32_t num_tokens_with_signal = 2; + const std::string epoch_id = "epoch-id"; + base::expected<GetProbabilisticRevealTokenResponse, absl::Status> + maybe_response = issuer->IssueByHashingToPoint( + plaintexts, expiration_time, next_epoch_start_time, + num_tokens_with_signal, epoch_id); + ASSERT_TRUE(maybe_response.has_value()) + << "Issue() returned error " << maybe_response.error(); + auto const& response = maybe_response.value(); + ASSERT_THAT(response.tokens(), testing::SizeIs(plaintexts.size())); + ASSERT_THAT(issuer->Tokens(), testing::SizeIs(plaintexts.size())); + + EXPECT_EQ(response.public_key().y(), issuer->GetSerializedPublicKey()); + int64_t expiration_time_seconds = expiration_time.InSecondsFSinceUnixEpoch(); + EXPECT_EQ(response.expiration_time().seconds(), expiration_time_seconds); + int64_t next_epoch_start_time_seconds = + next_epoch_start_time.InSecondsFSinceUnixEpoch(); + EXPECT_EQ(response.next_epoch_start_time().seconds(), + next_epoch_start_time_seconds); + EXPECT_EQ(response.num_tokens_with_signal(), num_tokens_with_signal); + EXPECT_EQ(response.epoch_id(), epoch_id); +} + } // namespace } // namespace ip_protection
diff --git a/components/omnibox/browser/android/OWNERS b/components/omnibox/browser/android/OWNERS index 51663fd..8124b0b 100644 --- a/components/omnibox/browser/android/OWNERS +++ b/components/omnibox/browser/android/OWNERS
@@ -1,4 +1,3 @@ ender@google.com -gangwu@chromium.org pnoland@chromium.org tedchoc@chromium.org
diff --git a/components/omnibox/browser/base_search_provider_unittest.cc b/components/omnibox/browser/base_search_provider_unittest.cc index a0168ca..e84a57d 100644 --- a/components/omnibox/browser/base_search_provider_unittest.cc +++ b/components/omnibox/browser/base_search_provider_unittest.cc
@@ -782,3 +782,50 @@ EXPECT_TRUE(found_matching_param_sequence); } } + +TEST_F(BaseSearchProviderTest, SuggestTemplateInfoPopulatesMatch) { + TemplateURLData data; + data.SetURL("http://foo.com/url?bar={searchTerms}"); + auto template_url = std::make_unique<TemplateURL>(data); + + TestBaseSearchProvider::MatchMap map; + std::u16string query = u"Washington Wizards"; + + // TODO(crbug.com/417745802): Update to check if actions get populated + // correctly. + omnibox::SuggestTemplateInfo suggest_template_info; + suggest_template_info.set_style(omnibox::SuggestTemplateInfo::DEFAULT); + suggest_template_info.set_type_icon( + omnibox::SuggestTemplateInfo_IconType_SEARCH_LOOP_WITH_SPARKLE); + suggest_template_info.mutable_primary_text()->set_text("Washington Wizards"); + suggest_template_info.mutable_secondary_text()->set_text("MIA"); + omnibox::SuggestTemplateInfo::Image* image = + suggest_template_info.mutable_image(); + image->set_url("http://example.com/a.png"); + image->set_dominant_color("#233875"); + image->set_type(omnibox::SuggestTemplateInfo::Image::TYPE_LARGE); + (*suggest_template_info.mutable_default_search_parameters())["gs_ssp"] = + "abc"; + + SearchSuggestionParser::SuggestResult result( + query, AutocompleteMatchType::SEARCH_SUGGEST, omnibox::TYPE_NATIVE_CHROME, + /*subtypes=*/{}, /*from_keyword=*/false, + /*navigational_intent=*/omnibox::NAV_INTENT_NONE, + /*relevance=*/1300, /*relevance_from_server=*/true, + /*input_text=*/query); + result.SetSuggestTemplateInfo(suggest_template_info); + provider_->AddMatchToMap( + result, AutocompleteInput(), template_url.get(), + client_->GetTemplateURLService()->search_terms_data(), + TemplateURLRef::NO_SUGGESTION_CHOSEN, false, false, &map); + + // Match should be populated using the SuggestTemplateInfo instead of the + // empty EntityInfo proto. Match fields like contents (primary text) and + // description (secondary text) are updated in `SearchSuggestionParser` so + // will not be shown as updated here. + ASSERT_EQ(1U, map.size()); + AutocompleteMatch match = map.begin()->second; + EXPECT_EQ(suggest_template_info.image().dominant_color(), + match.image_dominant_color); + EXPECT_EQ("gs_ssp=abc", match.search_terms_args->additional_query_params); +}
diff --git a/components/omnibox/browser/search_suggestion_parser_unittest.cc b/components/omnibox/browser/search_suggestion_parser_unittest.cc index c3b9ab4..20a13db 100644 --- a/components/omnibox/browser/search_suggestion_parser_unittest.cc +++ b/components/omnibox/browser/search_suggestion_parser_unittest.cc
@@ -10,6 +10,7 @@ #include "base/base64.h" #include "base/feature_list.h" #include "base/json/json_reader.h" +#include "base/strings/strcat.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "base/values.h" @@ -27,28 +28,15 @@ #include "third_party/omnibox_proto/navigational_intent.pb.h" #include "third_party/omnibox_proto/rich_answer_template.pb.h" #include "third_party/omnibox_proto/rich_suggest_template.pb.h" +#include "third_party/omnibox_proto/suggest_template_info.pb.h" namespace { -std::string SerializeAndEncodeEntityInfo( - const omnibox::EntityInfo& entity_info) { - std::string serialized_entity_info; - entity_info.SerializeToString(&serialized_entity_info); - return base::Base64Encode(serialized_entity_info); -} - -std::string SerializeAndEncodeGroupsInfo( - const omnibox::GroupsInfo& groups_info) { - std::string serialized_groups_info; - groups_info.SerializeToString(&serialized_groups_info); - return base::Base64Encode(serialized_groups_info); -} - -std::string SerializeAndEncodeRichSuggestTemplate( - const omnibox::RichSuggestTemplate& suggest_template) { - std::string serialized_suggest_template; - suggest_template.SerializeToString(&serialized_suggest_template); - return base::Base64Encode(serialized_suggest_template); +std::string SerializeAndEncodeProto( + const google::protobuf::MessageLite& proto) { + std::string serialized_proto_info; + proto.SerializeToString(&serialized_proto_info); + return base::Base64Encode(serialized_proto_info); } std::string NavigationalIntentsToJSON( @@ -188,7 +176,7 @@ "google:fieldtrialtriggered": true, "google:suggestdetail": [{}, { "google:entityinfo": ")" + - SerializeAndEncodeEntityInfo(entity_info) + + SerializeAndEncodeProto(entity_info) + R"(" }, {}], "google:suggestnavintents": )" + @@ -449,7 +437,7 @@ "tlw": false }, "google:groupsinfo": ")" + - SerializeAndEncodeGroupsInfo(groups_info) + R"(", + SerializeAndEncodeProto(groups_info) + R"(", "google:suggestdetail":[ { }, @@ -542,7 +530,7 @@ "tlw": false }, "google:groupsinfo": ")" + - SerializeAndEncodeGroupsInfo(groups_info) + R"(", + SerializeAndEncodeProto(groups_info) + R"(", "google:suggestdetail":[ { }, @@ -664,12 +652,12 @@ {}, { "google:entityinfo": ")" + - SerializeAndEncodeEntityInfo(first_entity_info) + + SerializeAndEncodeProto(first_entity_info) + R"(" }, { "google:entityinfo": ")" + - SerializeAndEncodeEntityInfo(second_entity_info) + + SerializeAndEncodeProto(second_entity_info) + R"(" } ], @@ -817,7 +805,7 @@ }, "ansb": "8", "google:templateinfo": ")" + - SerializeAndEncodeRichSuggestTemplate(suggest_template) + + SerializeAndEncodeProto(suggest_template) + R"(" }, {}, @@ -1029,7 +1017,7 @@ { "ansb": "8", "google:templateinfo": ")" + - SerializeAndEncodeRichSuggestTemplate(suggest_template) + + SerializeAndEncodeProto(suggest_template) + R"(" }, {}, @@ -1100,7 +1088,7 @@ }, "ansb": "20", "google:templateinfo": ")" + - SerializeAndEncodeRichSuggestTemplate(suggest_template) + + SerializeAndEncodeProto(suggest_template) + R"(" }, {}, @@ -1190,7 +1178,7 @@ }, "ansb": "8", "google:templateinfo": ")" + - SerializeAndEncodeRichSuggestTemplate(suggest_template) + + SerializeAndEncodeProto(suggest_template) + R"(" }, {}, @@ -1591,7 +1579,7 @@ {}, { "google:entityinfo": ")" + - SerializeAndEncodeEntityInfo(entity_info) + + SerializeAndEncodeProto(entity_info) + R"(" } ], @@ -1717,3 +1705,147 @@ ASSERT_EQ(u"in california", results.suggest_results[0].match_contents()); ASSERT_EQ(u"… ", results.suggest_results[0].match_contents_prefix()); } + +TEST(SearchSuggestionParserTest, ParseSuggestTemplateFromSuggestResults) { + TestSchemeClassifier scheme_classifier; + AutocompleteInput input( + u"", + metrics::OmniboxEventProto::INSTANT_NTP_WITH_OMNIBOX_AS_STARTING_FOCUS, + scheme_classifier); + + // Parse SuggestTemplateInfo data from properly encoded (base64) proto field. + { + omnibox::SuggestTemplateInfo suggest_template_info; + suggest_template_info.set_style(omnibox::SuggestTemplateInfo::DEFAULT); + suggest_template_info.set_type_icon( + omnibox::SuggestTemplateInfo_IconType_SEARCH_LOOP_WITH_SPARKLE); + suggest_template_info.mutable_primary_text()->set_text( + "Washington Wizards"); + suggest_template_info.mutable_secondary_text()->set_text("MIA"); + omnibox::SuggestTemplateInfo::Image* image = + suggest_template_info.mutable_image(); + image->set_url("http://example.com/a.png"); + image->set_dominant_color("#233875"); + image->set_type(omnibox::SuggestTemplateInfo::Image::TYPE_LARGE); + (*suggest_template_info.mutable_default_search_parameters())["gs_ssp"] = + "abc"; + omnibox::SuggestTemplateInfo::TemplateAction* template_action = + suggest_template_info.add_action_suggestions(); + template_action->set_action_uri("chrome://newtab/"); + template_action->set_action_type( + omnibox::SuggestTemplateInfo_TemplateAction_ActionType_DIRECTIONS); + template_action->set_display_text("New Tab"); + (*template_action->mutable_search_parameters())["action_param1"] = + "action_value1"; + + std::string json_data = base::StrCat({ + R"([ + "", + ["the menu", "washington wizards", "the midnight club"], + ["", "", ""], + [], + { + "google:clientdata": { + "bpc": false, + "tlw": false + }, + "google:suggestdetail": [ + {}, + { + "google:suggesttemplate": ")", + SerializeAndEncodeProto(suggest_template_info), + R"(" + }, + {} + ], + "google:suggestrelevance": [701, 700, 553], + "google:suggestsubtypes": [ + [512, 433, 131, 355], + [131, 433, 512], + [512, 433] + ], + "google:suggesttype": ["QUERY", "ENTITY", "QUERY"], + "google:verbatimrelevance": 851 + }])"}); + std::optional<base::Value> root_val = base::JSONReader::Read(json_data); + ASSERT_TRUE(root_val); + ASSERT_TRUE(root_val.value().is_list()); + + SearchSuggestionParser::Results results; + ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults( + root_val->GetList(), input, scheme_classifier, + /*default_result_relevance=*/400, + /*is_keyword_result=*/false, &results)); + + ASSERT_EQ(3U, results.suggest_results.size()); + + // For each suggestion, verify that the JSON fields were correctly parsed. + // The first suggestion suggest template should not be populated. + ASSERT_EQ(u"the menu", results.suggest_results[0].suggestion()); + ASSERT_EQ(u"", results.suggest_results[0].annotation()); + ASSERT_FALSE( + results.suggest_results[0].suggest_template_info().has_value()); + + ASSERT_EQ(u"washington wizards", results.suggest_results[1].suggestion()); + ASSERT_TRUE(ProtosAreEqual( + results.suggest_results[1].suggest_template_info().value(), + suggest_template_info)); + // SuggestResult contents and annotation should be updated to reflect that + // of the SuggestTemplateInfo. + ASSERT_EQ(u"Washington Wizards", + results.suggest_results[1].match_contents()); + ASSERT_EQ(u"MIA", results.suggest_results[1].annotation()); + } + // Parse EntityInfo data from garbled proto field. + { + std::string json_data = R"([ + "", + ["the menu", "the menu", "the midnight club"], + ["", "", ""], + [], + { + "google:clientdata": { + "bpc": false, + "tlw": false + }, + "google:suggestdetail": [ + {}, + { + "google:suggesttemplate": "<< invalid format >>" + }, + {} + ], + "google:suggestrelevance": [701, 700, 553], + "google:suggestsubtypes": [ + [512, 433, 131, 355], + [131, 433, 512], + [512, 433] + ], + "google:suggesttype": ["QUERY", "ENTITY", "QUERY"], + "google:verbatimrelevance": 851 + }])"; + + std::optional<base::Value> root_val = base::JSONReader::Read(json_data); + ASSERT_TRUE(root_val); + ASSERT_TRUE(root_val.value().is_list()); + + SearchSuggestionParser::Results results; + ASSERT_TRUE(SearchSuggestionParser::ParseSuggestResults( + root_val->GetList(), input, scheme_classifier, + /*default_result_relevance=*/400, + /*is_keyword_result=*/false, &results)); + + ASSERT_EQ(3U, results.suggest_results.size()); + + // For each suggestion, verify that the JSON fields were correctly parsed. + ASSERT_EQ(u"the menu", results.suggest_results[0].suggestion()); + ASSERT_FALSE( + results.suggest_results[0].suggest_template_info().has_value()); + + // SuggestTemplateInfo should not be populated if it was not parsed + // correctly. + ASSERT_EQ(u"the menu", results.suggest_results[1].suggestion()); + ASSERT_FALSE( + results.suggest_results[0].suggest_template_info().has_value()); + } +}
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn index 3e61523..9a95a5c 100644 --- a/components/optimization_guide/core/BUILD.gn +++ b/components/optimization_guide/core/BUILD.gn
@@ -286,8 +286,8 @@ "model_execution/repetition_checker.h", "model_execution/response_parser.cc", "model_execution/response_parser.h", - "model_execution/response_parser_registry.cc", - "model_execution/response_parser_registry.h", + "model_execution/response_parser_factory.cc", + "model_execution/response_parser_factory.h", "model_execution/safety_checker.cc", "model_execution/safety_checker.h", "model_execution/safety_client.cc", @@ -573,6 +573,7 @@ "model_execution/optimization_guide_model_execution_error_unittest.cc", "model_execution/redactor_unittest.cc", "model_execution/repetition_checker_unittest.cc", + "model_execution/response_parser_factory_unittest.cc", "model_execution/safety_checker_unittest.cc", "model_execution/simple_response_parser_unittest.cc", "model_execution/substitution_unittest.cc",
diff --git a/components/optimization_guide/core/model_execution/aqa_response_parser.cc b/components/optimization_guide/core/model_execution/aqa_response_parser.cc index 98c3862..3256efb 100644 --- a/components/optimization_guide/core/model_execution/aqa_response_parser.cc +++ b/components/optimization_guide/core/model_execution/aqa_response_parser.cc
@@ -103,11 +103,6 @@ namespace optimization_guide { -AqaResponseParser::AqaResponseParser( - const proto::OnDeviceModelExecutionOutputConfig& config) - : config_(config) {} -AqaResponseParser::~AqaResponseParser() = default; - // static bool AqaResponseParser::CanParse(std::string_view proto_type) { return proto_type == "optimization_guide.proto.HistoryAnswerResponse";
diff --git a/components/optimization_guide/core/model_execution/aqa_response_parser.h b/components/optimization_guide/core/model_execution/aqa_response_parser.h index 6052f13..9e93d97 100644 --- a/components/optimization_guide/core/model_execution/aqa_response_parser.h +++ b/components/optimization_guide/core/model_execution/aqa_response_parser.h
@@ -7,17 +7,11 @@ #include <string_view> -#include "base/functional/callback_forward.h" #include "components/optimization_guide/core/model_execution/response_parser.h" -#include "components/optimization_guide/proto/on_device_model_execution_config.pb.h" namespace optimization_guide { class AqaResponseParser final : public ResponseParser { public: - explicit AqaResponseParser( - const proto::OnDeviceModelExecutionOutputConfig& config); - ~AqaResponseParser() override; - static bool CanParse(std::string_view proto_type); // Parse redacted model output, returns parsed data via result_callback. @@ -25,9 +19,6 @@ ResultCallback result_callback) const override; bool SuppressParsingIncompleteResponse() const override; - - private: - proto::OnDeviceModelExecutionOutputConfig config_; }; } // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/aqa_response_parser_unittest.cc b/components/optimization_guide/core/model_execution/aqa_response_parser_unittest.cc index 7db5fff..ade768f 100644 --- a/components/optimization_guide/core/model_execution/aqa_response_parser_unittest.cc +++ b/components/optimization_guide/core/model_execution/aqa_response_parser_unittest.cc
@@ -18,11 +18,8 @@ base::test::TestFuture<base::expected<proto::Any, ResponseParsingError>>; TEST(AqaResponseParserTest, Valid) { - proto::OnDeviceModelExecutionOutputConfig cfg; - cfg.set_proto_type("optimization_guide.proto.HistoryAnswerResponse"); - ParseResponseFuture response_future; - AqaResponseParser(cfg).ParseAsync( + AqaResponseParser().ParseAsync( "0001,0003 has the answer. The answer is The fox jumps over the dog", response_future.GetCallback()); auto maybe_response = response_future.Get(); @@ -36,12 +33,9 @@ } TEST(AqaResponseParserTest, Unanswerable) { - proto::OnDeviceModelExecutionOutputConfig cfg; - cfg.set_proto_type("optimization_guide.proto.HistoryAnswerResponse"); - ParseResponseFuture response_future; - AqaResponseParser(cfg).ParseAsync("unanswerable.", - response_future.GetCallback()); + AqaResponseParser().ParseAsync("unanswerable.", + response_future.GetCallback()); auto maybe_response = response_future.Get(); ASSERT_TRUE(maybe_response.has_value()); @@ -51,11 +45,8 @@ } TEST(AqaResponseParserTest, RecursiveAnswer) { - proto::OnDeviceModelExecutionOutputConfig cfg; - cfg.set_proto_type("optimization_guide.proto.HistoryAnswerResponse"); - ParseResponseFuture response_future; - AqaResponseParser(cfg).ParseAsync( + AqaResponseParser().ParseAsync( "0001,0003 has the answer. The answer is ID:0002 has the answer. The " "answer is the fox jumps over the dog.", response_future.GetCallback()); @@ -66,11 +57,8 @@ } TEST(AqaResponseParserTest, RecursiveUnanswerable) { - proto::OnDeviceModelExecutionOutputConfig cfg; - cfg.set_proto_type("optimization_guide.proto.HistoryAnswerResponse"); - ParseResponseFuture response_future; - AqaResponseParser(cfg).ParseAsync( + AqaResponseParser().ParseAsync( "0001,0003 has the answer. The answer is unanswerable.", response_future.GetCallback()); auto maybe_response = response_future.Get(); @@ -82,11 +70,7 @@ } TEST(AqaResponseParserTest, SuppressParsingIncompleteResponseAlwaysTrue) { - proto::OnDeviceModelExecutionOutputConfig cfg; - cfg.set_proto_type("optimization_guide.proto.HistoryAnswerResponse"); - cfg.set_suppress_parsing_incomplete_output(false); - - EXPECT_TRUE(AqaResponseParser(cfg).SuppressParsingIncompleteResponse()); + EXPECT_TRUE(AqaResponseParser().SuppressParsingIncompleteResponse()); } } // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/json_response_parser.cc b/components/optimization_guide/core/model_execution/json_response_parser.cc index 8cb6a71..91797d0 100644 --- a/components/optimization_guide/core/model_execution/json_response_parser.cc +++ b/components/optimization_guide/core/model_execution/json_response_parser.cc
@@ -33,10 +33,8 @@ } // namespace -JsonResponseParser::JsonResponseParser( - const proto::OnDeviceModelExecutionOutputConfig& config) - : proto_type_(config.proto_type()), config_(config) {} -JsonResponseParser::~JsonResponseParser() = default; +JsonResponseParser::JsonResponseParser(std::string_view proto_type) + : proto_type_(proto_type) {} void JsonResponseParser::ParseAsync(const std::string& redacted_output, ResultCallback callback) const {
diff --git a/components/optimization_guide/core/model_execution/json_response_parser.h b/components/optimization_guide/core/model_execution/json_response_parser.h index bce94c70..1999be1 100644 --- a/components/optimization_guide/core/model_execution/json_response_parser.h +++ b/components/optimization_guide/core/model_execution/json_response_parser.h
@@ -5,22 +5,17 @@ #ifndef COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_JSON_RESPONSE_PARSER_H_ #define COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_JSON_RESPONSE_PARSER_H_ -#include <optional> #include <string> +#include <string_view> -#include "base/functional/callback_forward.h" #include "components/optimization_guide/core/model_execution/response_parser.h" -#include "components/optimization_guide/proto/common_types.pb.h" -#include "components/optimization_guide/proto/on_device_model_execution_config.pb.h" namespace optimization_guide { // A ResponseParser that just puts all of the output in a single field. class JsonResponseParser final : public ResponseParser { public: - explicit JsonResponseParser( - const proto::OnDeviceModelExecutionOutputConfig& config); - ~JsonResponseParser() override; + explicit JsonResponseParser(std::string_view proto_type); // Parses redacted model output. void ParseAsync(const std::string& redacted_output, @@ -29,8 +24,7 @@ bool SuppressParsingIncompleteResponse() const override; private: - std::string proto_type_; - proto::OnDeviceModelExecutionOutputConfig config_; + const std::string proto_type_; }; } // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/json_response_parser_unittest.cc b/components/optimization_guide/core/model_execution/json_response_parser_unittest.cc index 7fc8916..566932c 100644 --- a/components/optimization_guide/core/model_execution/json_response_parser_unittest.cc +++ b/components/optimization_guide/core/model_execution/json_response_parser_unittest.cc
@@ -28,9 +28,11 @@ TEST_F(JsonResponseParserTest, Parse) { base::test::TestFuture<ResponseParser::Result> response_future; proto::OnDeviceModelExecutionOutputConfig config; - config.set_proto_type("optimization_guide.proto.TabOrganizationResponse"); - JsonResponseParser(config).ParseAsync( - R"({ + constexpr char proto_type[] = + "optimization_guide.proto.TabOrganizationResponse"; + JsonResponseParser(proto_type) + .ParseAsync( + R"({ "tabGroups": [ { "label": "mylabel", @@ -47,7 +49,7 @@ } ] })", - response_future.GetCallback()); + response_future.GetCallback()); auto response = response_future.Get(); EXPECT_TRUE(response.has_value()); EXPECT_EQ(
diff --git a/components/optimization_guide/core/model_execution/on_device_model_feature_adapter.cc b/components/optimization_guide/core/model_execution/on_device_model_feature_adapter.cc index da52da7..338b934 100644 --- a/components/optimization_guide/core/model_execution/on_device_model_feature_adapter.cc +++ b/components/optimization_guide/core/model_execution/on_device_model_feature_adapter.cc
@@ -16,7 +16,7 @@ #include "components/optimization_guide/core/model_execution/on_device_model_execution_proto_value_utils.h" #include "components/optimization_guide/core/model_execution/redactor.h" #include "components/optimization_guide/core/model_execution/response_parser.h" -#include "components/optimization_guide/core/model_execution/response_parser_registry.h" +#include "components/optimization_guide/core/model_execution/response_parser_factory.h" #include "components/optimization_guide/core/model_execution/simple_response_parser.h" #include "components/optimization_guide/core/optimization_guide_constants.h" #include "components/optimization_guide/core/optimization_guide_features.h" @@ -26,11 +26,13 @@ namespace optimization_guide { OnDeviceModelFeatureAdapter::OnDeviceModelFeatureAdapter( - proto::OnDeviceModelExecutionFeatureConfig config) + proto::OnDeviceModelExecutionFeatureConfig config, + ResponseParserFactory response_parser_factory) : config_(std::move(config)), redactor_(Redactor::FromProto(config_.output_config().redact_rules())), - parser_( - ResponseParserRegistry::Get().CreateParser(config_.output_config())) { + parser_(response_parser_factory + ? response_parser_factory.Run(config_.output_config()) + : CreateResponseParser(config_.output_config())) { // Set limits values in `token_limits_`. auto& input_config = config_.input_config(); auto& output_config = config_.output_config();
diff --git a/components/optimization_guide/core/model_execution/on_device_model_feature_adapter.h b/components/optimization_guide/core/model_execution/on_device_model_feature_adapter.h index d9f9f74..e579124 100644 --- a/components/optimization_guide/core/model_execution/on_device_model_feature_adapter.h +++ b/components/optimization_guide/core/model_execution/on_device_model_feature_adapter.h
@@ -10,6 +10,7 @@ #include "base/containers/flat_map.h" #include "base/files/file_path.h" +#include "base/functional/callback.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" @@ -29,15 +30,22 @@ namespace optimization_guide { class Redactor; +class ResponseParser; // Adapts the on-device model to be used for a particular feature, based on // a configuration proto. class OnDeviceModelFeatureAdapter final : public base::RefCounted<OnDeviceModelFeatureAdapter> { public: + using ResponseParserFactory = + base::RepeatingCallback<std::unique_ptr<ResponseParser>( + const proto::OnDeviceModelExecutionOutputConfig&)>; + // Constructs an adapter from a configuration proto. explicit OnDeviceModelFeatureAdapter( - proto::OnDeviceModelExecutionFeatureConfig config); + proto::OnDeviceModelExecutionFeatureConfig config, + // Allows dependency injection for use in tests. + ResponseParserFactory response_parser_factory = ResponseParserFactory()); // Constructs the model input from `request`. std::optional<SubstitutionResult> ConstructInputString(
diff --git a/components/optimization_guide/core/model_execution/on_device_model_feature_adapter_unittest.cc b/components/optimization_guide/core/model_execution/on_device_model_feature_adapter_unittest.cc index 317b102..34115ea 100644 --- a/components/optimization_guide/core/model_execution/on_device_model_feature_adapter_unittest.cc +++ b/components/optimization_guide/core/model_execution/on_device_model_feature_adapter_unittest.cc
@@ -4,10 +4,15 @@ #include "components/optimization_guide/core/model_execution/on_device_model_feature_adapter.h" +#include <memory> + +#include "base/functional/bind.h" +#include "base/functional/callback.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/multimodal_message.h" +#include "components/optimization_guide/core/model_execution/response_parser.h" #include "components/optimization_guide/core/optimization_guide_enums.h" #include "components/optimization_guide/core/optimization_guide_util.h" #include "components/optimization_guide/proto/features/compose.pb.h" @@ -18,9 +23,39 @@ namespace optimization_guide { +namespace { + using ParseResponseFuture = base::test::TestFuture<base::expected<proto::Any, ResponseParsingError>>; +class MockResponseParser : public ResponseParser { + public: + MOCK_METHOD(void, + ParseAsync, + (const std::string& redacted_output, + ResultCallback result_callback), + (const override)); + MOCK_METHOD(bool, SuppressParsingIncompleteResponse, (), (const override)); +}; + +OnDeviceModelFeatureAdapter::ResponseParserFactory +CreateMockResponseParserFactory( + base::RepeatingCallback<void(MockResponseParser&)> apply_expectations) { + const auto factory_function = + [](base::RepeatingCallback<void(MockResponseParser&)> apply_expectations, + const proto::OnDeviceModelExecutionOutputConfig& config) + -> std::unique_ptr<ResponseParser> { + auto parser = std::make_unique<MockResponseParser>(); + apply_expectations.Run(*parser); + return parser; + }; + return base::BindRepeating(factory_function, apply_expectations); +} + +using testing::Return; + +} // namespace + TEST(OnDeviceModelFeatureAdapterTest, ConstructTextSafetyRequestNoSafetyFallbackConfig) { proto::OnDeviceModelExecutionFeatureConfig config; @@ -156,83 +191,69 @@ EXPECT_EQ(result->ToString(), "hello this is execution"); } -TEST(OnDeviceModelFeatureAdapterTest, ConstructOutputMetadata_NoOutputConfig) { - proto::OnDeviceModelExecutionFeatureConfig config; - - auto adapter = - base::MakeRefCounted<OnDeviceModelFeatureAdapter>(std::move(config)); +TEST(OnDeviceModelFeatureAdapterTest, ParseResponse) { + auto adapter = base::MakeRefCounted<OnDeviceModelFeatureAdapter>( + proto::OnDeviceModelExecutionFeatureConfig(), + CreateMockResponseParserFactory( + base::BindRepeating([](MockResponseParser& parser) { + EXPECT_CALL(parser, ParseAsync) + .WillOnce([](const std::string& redacted_output, + ResponseParser::ResultCallback result_callback) { + proto::Any any; + any.set_value(redacted_output + " response"); + std::move(result_callback).Run(any); + }); + }))); ParseResponseFuture response_future; MultimodalMessage request((base::test::TestMessage())); adapter->ParseResponse(request, "output", 0u, response_future.GetCallback()); - auto maybe_metadata = response_future.Get(); + base::expected<proto::Any, ResponseParsingError> maybe_any = + response_future.Get(); - EXPECT_FALSE(maybe_metadata.has_value()); - EXPECT_EQ(maybe_metadata.error(), ResponseParsingError::kFailed); + ASSERT_TRUE(maybe_any.has_value()); + EXPECT_EQ("output response", maybe_any.value().value()); } -TEST(OnDeviceModelFeatureAdapterTest, ConstructOutputMetadata_DefaultSimple) { - proto::OnDeviceModelExecutionFeatureConfig config; - auto* oc = config.mutable_output_config(); - oc->set_proto_type("optimization_guide.proto.ComposeResponse"); - oc->mutable_proto_field()->add_proto_descriptors()->set_tag_number(1); - auto adapter = - base::MakeRefCounted<OnDeviceModelFeatureAdapter>(std::move(config)); - - // For `STREAMING_MODE_CHUNK_BY_CHUNK`, the response will start after the - // `previous_response_pos`. - ParseResponseFuture response_future; - MultimodalMessage request((base::test::TestMessage())); - adapter->ParseResponse(request, "output", - /*previous_response_pos=*/3u, - response_future.GetCallback()); - auto maybe_metadata = response_future.Get(); - - ASSERT_TRUE(maybe_metadata.has_value()); - EXPECT_EQ( - "put", - ParsedAnyMetadata<proto::ComposeResponse>(*maybe_metadata)->output()); -} - -TEST(OnDeviceModelFeatureAdapterTest, ConstructOutputMetadata_JSON) { - base::test::TaskEnvironment task_environment; - data_decoder::test::InProcessDataDecoder in_process_data_decoder_; - proto::OnDeviceModelExecutionFeatureConfig config; - auto* oc = config.mutable_output_config(); - oc->set_parser_kind(proto::PARSER_KIND_JSON); - oc->set_proto_type("optimization_guide.proto.ComposeResponse"); - auto adapter = - base::MakeRefCounted<OnDeviceModelFeatureAdapter>(std::move(config)); +TEST(OnDeviceModelFeatureAdapterTest, ParseResponse_NullParser) { + auto adapter = base::MakeRefCounted<OnDeviceModelFeatureAdapter>( + proto::OnDeviceModelExecutionFeatureConfig(), + base::BindRepeating( + [](const proto::OnDeviceModelExecutionOutputConfig& config) { + return std::unique_ptr<ResponseParser>(); + })); ParseResponseFuture response_future; MultimodalMessage request((base::test::TestMessage())); - adapter->ParseResponse(request, "{\"output\": \"abc\"}", 0u, - response_future.GetCallback()); - auto maybe_metadata = response_future.Get(); + adapter->ParseResponse(request, "output", 0u, response_future.GetCallback()); + base::expected<proto::Any, ResponseParsingError> maybe_any = + response_future.Get(); - ASSERT_TRUE(maybe_metadata.has_value()); - EXPECT_EQ( - "abc", - ParsedAnyMetadata<proto::ComposeResponse>(*maybe_metadata)->output()); + ASSERT_FALSE(maybe_any.has_value()); + EXPECT_EQ(ResponseParsingError::kFailed, maybe_any.error()); } TEST(OnDeviceModelFeatureAdapterTest, ShouldParseResponseCompleteOnly) { - proto::OnDeviceModelExecutionFeatureConfig config; - config.mutable_output_config()->set_parser_kind(proto::PARSER_KIND_SIMPLE); - config.mutable_output_config()->set_suppress_parsing_incomplete_output(true); - auto adapter = - base::MakeRefCounted<OnDeviceModelFeatureAdapter>(std::move(config)); + auto adapter = base::MakeRefCounted<OnDeviceModelFeatureAdapter>( + proto::OnDeviceModelExecutionFeatureConfig(), + CreateMockResponseParserFactory( + base::BindRepeating([](MockResponseParser& parser) { + EXPECT_CALL(parser, SuppressParsingIncompleteResponse) + .WillRepeatedly(Return(true)); + }))); EXPECT_FALSE(adapter->ShouldParseResponse(ResponseCompleteness::kPartial)); EXPECT_TRUE(adapter->ShouldParseResponse(ResponseCompleteness::kComplete)); } TEST(OnDeviceModelFeatureAdapterTest, ShouldParseResponseAlways) { - proto::OnDeviceModelExecutionFeatureConfig config; - config.mutable_output_config()->set_parser_kind(proto::PARSER_KIND_SIMPLE); - config.mutable_output_config()->set_suppress_parsing_incomplete_output(false); - auto adapter = - base::MakeRefCounted<OnDeviceModelFeatureAdapter>(std::move(config)); + auto adapter = base::MakeRefCounted<OnDeviceModelFeatureAdapter>( + proto::OnDeviceModelExecutionFeatureConfig(), + CreateMockResponseParserFactory( + base::BindRepeating([](MockResponseParser& parser) { + EXPECT_CALL(parser, SuppressParsingIncompleteResponse) + .WillRepeatedly(Return(false)); + }))); EXPECT_TRUE(adapter->ShouldParseResponse(ResponseCompleteness::kPartial)); EXPECT_TRUE(adapter->ShouldParseResponse(ResponseCompleteness::kComplete));
diff --git a/components/optimization_guide/core/model_execution/response_parser.h b/components/optimization_guide/core/model_execution/response_parser.h index aa0a406..f29d051 100644 --- a/components/optimization_guide/core/model_execution/response_parser.h +++ b/components/optimization_guide/core/model_execution/response_parser.h
@@ -27,7 +27,7 @@ class ResponseParser { public: ResponseParser(); - virtual ~ResponseParser() = 0; + virtual ~ResponseParser(); ResponseParser(const ResponseParser&) = delete; ResponseParser& operator=(const ResponseParser&) = delete;
diff --git a/components/optimization_guide/core/model_execution/response_parser_factory.cc b/components/optimization_guide/core/model_execution/response_parser_factory.cc new file mode 100644 index 0000000..7e143b7 --- /dev/null +++ b/components/optimization_guide/core/model_execution/response_parser_factory.cc
@@ -0,0 +1,37 @@ +// 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/optimization_guide/core/model_execution/response_parser_factory.h" + +#include "components/optimization_guide/core/model_execution/aqa_response_parser.h" +#include "components/optimization_guide/core/model_execution/json_response_parser.h" +#include "components/optimization_guide/core/model_execution/simple_response_parser.h" +#include "components/optimization_guide/proto/parser_kind.pb.h" + +namespace optimization_guide { + +std::unique_ptr<ResponseParser> CreateResponseParser( + const proto::OnDeviceModelExecutionOutputConfig& output_config) { + switch (output_config.parser_kind()) { + case proto::PARSER_KIND_UNSPECIFIED: + case proto::PARSER_KIND_SIMPLE: + return std::make_unique<SimpleResponseParser>( + output_config.proto_type(), output_config.proto_field(), + output_config.suppress_parsing_incomplete_output()); + + case proto::PARSER_KIND_JSON: + return std::make_unique<JsonResponseParser>(output_config.proto_type()); + + case proto::PARSER_KIND_AQA: + if (!AqaResponseParser::CanParse(output_config.proto_type())) { + return nullptr; + } + return std::make_unique<AqaResponseParser>(); + + default: + return nullptr; + } +} + +} // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/response_parser_factory.h b/components/optimization_guide/core/model_execution/response_parser_factory.h new file mode 100644 index 0000000..bb257d85 --- /dev/null +++ b/components/optimization_guide/core/model_execution/response_parser_factory.h
@@ -0,0 +1,20 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_RESPONSE_PARSER_FACTORY_H_ +#define COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_RESPONSE_PARSER_FACTORY_H_ + +#include <memory> + +#include "components/optimization_guide/core/model_execution/response_parser.h" +#include "components/optimization_guide/proto/on_device_model_execution_config.pb.h" + +namespace optimization_guide { + +std::unique_ptr<ResponseParser> CreateResponseParser( + const proto::OnDeviceModelExecutionOutputConfig& output_config); + +} // namespace optimization_guide + +#endif // COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_RESPONSE_PARSER_FACTORY_H_
diff --git a/components/optimization_guide/core/model_execution/response_parser_factory_unittest.cc b/components/optimization_guide/core/model_execution/response_parser_factory_unittest.cc new file mode 100644 index 0000000..c8d50ade --- /dev/null +++ b/components/optimization_guide/core/model_execution/response_parser_factory_unittest.cc
@@ -0,0 +1,95 @@ +// 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/optimization_guide/core/model_execution/response_parser_factory.h" + +#include "base/test/gmock_expected_support.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/multimodal_message.h" +#include "components/optimization_guide/core/optimization_guide_enums.h" +#include "components/optimization_guide/core/optimization_guide_util.h" +#include "components/optimization_guide/proto/features/compose.pb.h" +#include "components/optimization_guide/proto/features/history_answer.pb.h" +#include "components/optimization_guide/proto/parser_kind.pb.h" +#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace optimization_guide { + +namespace { + +// base::expected GMock matcher. +using base::test::HasValue; +using base::test::ValueIs; + +using ParseResponseFuture = + base::test::TestFuture<base::expected<proto::Any, ResponseParsingError>>; + +// Check that the simple parser is appropriately selected. +TEST(CreateResponseParserTest, SimpleResponseParser) { + proto::OnDeviceModelExecutionOutputConfig config; + config.set_parser_kind(proto::PARSER_KIND_SIMPLE); + config.set_proto_type("optimization_guide.proto.ComposeResponse"); + config.mutable_proto_field()->add_proto_descriptors()->set_tag_number(1); + std::unique_ptr<ResponseParser> parser = CreateResponseParser(config); + + ParseResponseFuture response_future; + parser->ParseAsync("output", response_future.GetCallback()); + base::expected<proto::Any, ResponseParsingError> maybe_metadata = + response_future.Get(); + + ASSERT_THAT(maybe_metadata, HasValue()); + EXPECT_EQ( + "output", + ParsedAnyMetadata<proto::ComposeResponse>(*maybe_metadata)->output()); +} + +// Check that the JSON parser is appropriately selected. +TEST(CreateResponseParserTest, JsonResponseParser) { + base::test::TaskEnvironment task_environment; + data_decoder::test::InProcessDataDecoder in_process_data_decoder_; + + proto::OnDeviceModelExecutionOutputConfig config; + config.set_parser_kind(proto::PARSER_KIND_JSON); + config.set_proto_type("optimization_guide.proto.ComposeResponse"); + std::unique_ptr<ResponseParser> parser = CreateResponseParser(config); + + ParseResponseFuture response_future; + parser->ParseAsync("{\"output\": \"abc\"}", response_future.GetCallback()); + base::expected<proto::Any, ResponseParsingError> maybe_metadata = + response_future.Get(); + + ASSERT_THAT(maybe_metadata, HasValue()); + EXPECT_THAT( + "abc", + ParsedAnyMetadata<proto::ComposeResponse>(*maybe_metadata)->output()); +} + +TEST(CreateResponseParserTest, AqaResponseParser) { + proto::OnDeviceModelExecutionOutputConfig config; + config.set_parser_kind(proto::PARSER_KIND_AQA); + config.set_proto_type("optimization_guide.proto.HistoryAnswerResponse"); + std::unique_ptr<ResponseParser> parser = CreateResponseParser(config); + + ParseResponseFuture response_future; + parser->ParseAsync( + "0001,0003 has the answer. The answer is The fox jumps over the dog", + response_future.GetCallback()); + base::expected<proto::Any, ResponseParsingError> maybe_metadata = + response_future.Get(); + + ASSERT_THAT(maybe_metadata, HasValue()); + auto response = + ParsedAnyMetadata<proto::HistoryAnswerResponse>(*maybe_metadata); + EXPECT_EQ("The fox jumps over the dog", response->answer().text()); + EXPECT_EQ("0001", response->answer().citations()[0].passage_id()); + EXPECT_EQ("0003", response->answer().citations()[1].passage_id()); +} + +} // namespace + +} // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/response_parser_registry.cc b/components/optimization_guide/core/model_execution/response_parser_registry.cc deleted file mode 100644 index 28622834..0000000 --- a/components/optimization_guide/core/model_execution/response_parser_registry.cc +++ /dev/null
@@ -1,64 +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/response_parser_registry.h" - -#include <memory> - -#include "base/functional/callback.h" -#include "base/no_destructor.h" -#include "components/optimization_guide/core/model_execution/aqa_response_parser.h" -#include "components/optimization_guide/core/model_execution/json_response_parser.h" -#include "components/optimization_guide/core/model_execution/simple_response_parser.h" - -namespace optimization_guide { - -ResponseParserRegistry::ResponseParserRegistry() { - const auto simple_response_parser_factory = base::BindRepeating( - [](const proto::OnDeviceModelExecutionOutputConfig& config) - -> std::unique_ptr<ResponseParser> { - return std::make_unique<SimpleResponseParser>(config); - }); - - factories_.emplace(proto::PARSER_KIND_UNSPECIFIED, - simple_response_parser_factory); - factories_.emplace(proto::PARSER_KIND_SIMPLE, simple_response_parser_factory); - - factories_.emplace( - proto::PARSER_KIND_JSON, - base::BindRepeating( - [](const proto::OnDeviceModelExecutionOutputConfig& config) - -> std::unique_ptr<ResponseParser> { - return std::make_unique<JsonResponseParser>(config); - })); - - factories_.emplace( - proto::PARSER_KIND_AQA, - base::BindRepeating( - [](const proto::OnDeviceModelExecutionOutputConfig& config) - -> std::unique_ptr<ResponseParser> { - if (!AqaResponseParser::CanParse(config.proto_type())) { - return nullptr; - } - return std::make_unique<AqaResponseParser>(config); - })); -} - -ResponseParserRegistry::~ResponseParserRegistry() = default; - -const ResponseParserRegistry& ResponseParserRegistry::Get() { - static const base::NoDestructor<ResponseParserRegistry> instance; - return *instance; -} - -std::unique_ptr<ResponseParser> ResponseParserRegistry::CreateParser( - const proto::OnDeviceModelExecutionOutputConfig& config) const { - auto it = factories_.find(config.parser_kind()); - if (it == factories_.end()) { - return nullptr; - } - return it->second.Run(config); -} - -} // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/response_parser_registry.h b/components/optimization_guide/core/model_execution/response_parser_registry.h deleted file mode 100644 index 5e32b41..0000000 --- a/components/optimization_guide/core/model_execution/response_parser_registry.h +++ /dev/null
@@ -1,44 +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_RESPONSE_PARSER_REGISTRY_H_ -#define COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_RESPONSE_PARSER_REGISTRY_H_ - -#include <map> -#include <memory> -#include <optional> -#include <string> - -#include "base/functional/callback_forward.h" -#include "components/optimization_guide/core/model_execution/response_parser.h" -#include "components/optimization_guide/proto/common_types.pb.h" -#include "components/optimization_guide/proto/on_device_model_execution_config.pb.h" -#include "components/optimization_guide/proto/parser_kind.pb.h" - -namespace optimization_guide { - -// Constructs response parsers for a registered type. -class ResponseParserRegistry { - public: - ResponseParserRegistry(); - ~ResponseParserRegistry(); - - // Get the singleton instance. - static const ResponseParserRegistry& Get(); - - // Constructs a parser for the given config. - std::unique_ptr<ResponseParser> CreateParser( - const proto::OnDeviceModelExecutionOutputConfig& config) const; - - private: - using ResponseParserFactory = - base::RepeatingCallback<std::unique_ptr<ResponseParser>( - const proto::OnDeviceModelExecutionOutputConfig&)>; - - std::map<proto::ParserKind, ResponseParserFactory> factories_; -}; - -} // namespace optimization_guide - -#endif // COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_RESPONSE_PARSER_REGISTRY_H_
diff --git a/components/optimization_guide/core/model_execution/simple_response_parser.cc b/components/optimization_guide/core/model_execution/simple_response_parser.cc index d75001e..d670128 100644 --- a/components/optimization_guide/core/model_execution/simple_response_parser.cc +++ b/components/optimization_guide/core/model_execution/simple_response_parser.cc
@@ -14,14 +14,17 @@ namespace optimization_guide { SimpleResponseParser::SimpleResponseParser( - const proto::OnDeviceModelExecutionOutputConfig& config) - : config_(config) {} -SimpleResponseParser::~SimpleResponseParser() = default; + std::string_view proto_type, + const proto::ProtoField& proto_field, + bool suppress_parsing_incomplete_response) + : proto_type_(proto_type), + proto_field_(proto_field), + suppress_parsing_incomplete_response_( + suppress_parsing_incomplete_response) {} void SimpleResponseParser::ParseAsync(const std::string& redacted_output, ResultCallback result_callback) const { - auto result = SetProtoValue(config_.proto_type(), config_.proto_field(), - redacted_output); + auto result = SetProtoValue(proto_type_, proto_field_, redacted_output); if (!result) { std::move(result_callback) .Run(base::unexpected(ResponseParsingError::kFailed)); @@ -31,7 +34,7 @@ } bool SimpleResponseParser::SuppressParsingIncompleteResponse() const { - return config_.suppress_parsing_incomplete_output(); + return suppress_parsing_incomplete_response_; } } // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/simple_response_parser.h b/components/optimization_guide/core/model_execution/simple_response_parser.h index dc96478..186e76aa 100644 --- a/components/optimization_guide/core/model_execution/simple_response_parser.h +++ b/components/optimization_guide/core/model_execution/simple_response_parser.h
@@ -5,22 +5,20 @@ #ifndef COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_SIMPLE_RESPONSE_PARSER_H_ #define COMPONENTS_OPTIMIZATION_GUIDE_CORE_MODEL_EXECUTION_SIMPLE_RESPONSE_PARSER_H_ -#include <optional> #include <string> +#include <string_view> -#include "base/functional/callback_forward.h" #include "components/optimization_guide/core/model_execution/response_parser.h" -#include "components/optimization_guide/proto/common_types.pb.h" -#include "components/optimization_guide/proto/on_device_model_execution_config.pb.h" +#include "components/optimization_guide/proto/descriptors.pb.h" namespace optimization_guide { // A ResponseParser that just puts all of the output in a single field. class SimpleResponseParser final : public ResponseParser { public: - explicit SimpleResponseParser( - const proto::OnDeviceModelExecutionOutputConfig& config); - ~SimpleResponseParser() override; + SimpleResponseParser(std::string_view proto_type, + const proto::ProtoField& proto_field, + bool suppress_parsing_incomplete_response); // Parses redacted model output, returns parsed data via result_callback. void ParseAsync(const std::string& redacted_output, @@ -29,7 +27,9 @@ bool SuppressParsingIncompleteResponse() const override; private: - proto::OnDeviceModelExecutionOutputConfig config_; + const std::string proto_type_; + const proto::ProtoField proto_field_; + const bool suppress_parsing_incomplete_response_; }; } // namespace optimization_guide
diff --git a/components/optimization_guide/core/model_execution/simple_response_parser_unittest.cc b/components/optimization_guide/core/model_execution/simple_response_parser_unittest.cc index 14c2cc9e..88ef7ee 100644 --- a/components/optimization_guide/core/model_execution/simple_response_parser_unittest.cc +++ b/components/optimization_guide/core/model_execution/simple_response_parser_unittest.cc
@@ -13,16 +13,26 @@ namespace optimization_guide { +namespace { + using ParseResponseFuture = base::test::TestFuture<base::expected<proto::Any, ResponseParsingError>>; -TEST(SimpleResponseParserTest, Valid) { - proto::OnDeviceModelExecutionOutputConfig cfg; - cfg.set_proto_type("optimization_guide.proto.ComposeResponse"); - cfg.mutable_proto_field()->add_proto_descriptors()->set_tag_number(1); +proto::ProtoField CreateProtoField(int single_descriptor_tag_number) { + proto::ProtoField proto_field; + proto_field.add_proto_descriptors()->set_tag_number( + single_descriptor_tag_number); + return proto_field; +} +} // namespace + +TEST(SimpleResponseParserTest, Valid) { + SimpleResponseParser parser("optimization_guide.proto.ComposeResponse", + CreateProtoField(1), + /*suppress_parsing_incomplete_response=*/true); ParseResponseFuture response_future; - SimpleResponseParser(cfg).ParseAsync("output", response_future.GetCallback()); + parser.ParseAsync("output", response_future.GetCallback()); auto maybe_metadata = response_future.Get(); ASSERT_TRUE(maybe_metadata.has_value()); @@ -31,13 +41,23 @@ ParsedAnyMetadata<proto::ComposeResponse>(*maybe_metadata)->output()); } -TEST(SimpleResponseParserTest, BadProtoType) { - proto::OnDeviceModelExecutionOutputConfig cfg; - cfg.set_proto_type("garbage type"); - cfg.mutable_proto_field()->add_proto_descriptors()->set_tag_number(1); - +TEST(SimpleResponseParserTest, EmptyProtoField) { + SimpleResponseParser parser("optimization_guide.proto.ComposeResponse", + proto::ProtoField(), + /*suppress_parsing_incomplete_response=*/true); ParseResponseFuture response_future; - SimpleResponseParser(cfg).ParseAsync("output", response_future.GetCallback()); + parser.ParseAsync("output", response_future.GetCallback()); + auto maybe_metadata = response_future.Get(); + + EXPECT_FALSE(maybe_metadata.has_value()); + EXPECT_EQ(maybe_metadata.error(), ResponseParsingError::kFailed); +} + +TEST(SimpleResponseParserTest, BadProtoType) { + SimpleResponseParser parser("garbage type", CreateProtoField(1), + /*suppress_parsing_incomplete_response=*/true); + ParseResponseFuture response_future; + parser.ParseAsync("output", response_future.GetCallback()); auto maybe_metadata = response_future.Get(); EXPECT_FALSE(maybe_metadata.has_value()); @@ -45,17 +65,25 @@ } TEST(SimpleResponseParserTest, NotStringField) { - proto::OnDeviceModelExecutionFeatureConfig config; - proto::OnDeviceModelExecutionOutputConfig cfg; - cfg.set_proto_type("optimization_guide.proto.ComposeResponse"); - cfg.mutable_proto_field()->add_proto_descriptors()->set_tag_number(7); - + SimpleResponseParser parser("optimization_guide.proto.ComposeResponse", + CreateProtoField(7), + /*suppress_parsing_incomplete_response=*/true); ParseResponseFuture response_future; - SimpleResponseParser(cfg).ParseAsync("output", response_future.GetCallback()); + parser.ParseAsync("output", response_future.GetCallback()); auto maybe_metadata = response_future.Get(); EXPECT_FALSE(maybe_metadata.has_value()); EXPECT_EQ(maybe_metadata.error(), ResponseParsingError::kFailed); } +TEST(SimpleResponseParserTest, SuppressParsingIncompleteResponse) { + for (const bool suppress_parsing_incomplete_response : {false, true}) { + SimpleResponseParser parser("optimization_guide.proto.ComposeResponse", + CreateProtoField(7), + suppress_parsing_incomplete_response); + EXPECT_EQ(parser.SuppressParsingIncompleteResponse(), + suppress_parsing_incomplete_response); + } +} + } // namespace optimization_guide
diff --git a/components/optimization_guide/proto/BUILD.gn b/components/optimization_guide/proto/BUILD.gn index af0c4aa..8c63fd5 100644 --- a/components/optimization_guide/proto/BUILD.gn +++ b/components/optimization_guide/proto/BUILD.gn
@@ -46,6 +46,7 @@ "features/wallpaper_search.proto", "features/writing_assistance_api.proto", "features/zero_state_suggestions.proto", + "fieldwise_parser_config.proto", "glic_page_context_eligibility_metadata.proto", "hint_cache.proto", "hints.proto",
diff --git a/components/optimization_guide/proto/fieldwise_parser_config.proto b/components/optimization_guide/proto/fieldwise_parser_config.proto new file mode 100644 index 0000000..24f6ef5 --- /dev/null +++ b/components/optimization_guide/proto/fieldwise_parser_config.proto
@@ -0,0 +1,49 @@ +// 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. + +syntax = "proto2"; +option optimize_for = LITE_RUNTIME; +option java_package = "org.chromium.components.optimization_guide.proto"; +option java_outer_classname = "ModelExecutionProto"; + +package optimization_guide.proto; + +import "components/optimization_guide/proto/descriptors.proto"; + +// FieldExtractor defines a method for extracting information from model output +// and storing it in a proto field of bool, numeric, enum, or string type. The +// following algorithm is applied to extract to the field: +// 1. capturing_regex is executed against the model output to produce a +// string value. If the regex fails to match, the field is not written and +// no error is generated. +// 2. The string value is replaced by the result of looking up the string +// value in the translation_map, if the value exists in the map. +// 3. A conversion may be applied to the string value based on the type of +// the specified proto field. +// - String values are retained as-is. +// - Enum values are converted from an "ENUM_NAME" string to the enum +// value. +// - Boolean values are converted from the case-insensitive strings +// "true" and "false". +// - Numeric conversions use the relevant StringTo* function for the +// type as defined in //base/strings/string_number_conversions.h. +// 4. The value is saved in output_field if the field was found, is a +// supported type, and the conversion succeeded. Otherwise an error is +// generated. +message FieldExtractor { + // The field to fill with the extracted value. + optional ProtoField output_field = 1; + + // A regex that captures the relevant content from the model output in the + // first capturing group. + optional string capturing_regex = 2; + + // An optional map to translate from captured strings to strings + // convertible to the proto field type. + map<string, string> translation_map = 3; +} + +message FieldwiseParserConfig { + repeated FieldExtractor field_extractors = 1; +}
diff --git a/components/optimization_guide/proto/on_device_model_execution_config.proto b/components/optimization_guide/proto/on_device_model_execution_config.proto index 24e89d38..7039d06 100644 --- a/components/optimization_guide/proto/on_device_model_execution_config.proto +++ b/components/optimization_guide/proto/on_device_model_execution_config.proto
@@ -11,6 +11,7 @@ import "components/optimization_guide/proto/common_types.proto"; import "components/optimization_guide/proto/descriptors.proto"; +import "components/optimization_guide/proto/fieldwise_parser_config.proto"; import "components/optimization_guide/proto/redaction.proto"; import "components/optimization_guide/proto/substitution.proto"; import "components/optimization_guide/proto/model_execution.proto"; @@ -119,7 +120,8 @@ // The proto type to use for the response metadata. optional string proto_type = 1; - // The proto field to populate the output string with. + // The proto field to populate the output string with. Applies for + // PARSER_KIND_SIMPLE only. optional ProtoField proto_field = 2; // Rules that result in redacting the output. @@ -128,7 +130,8 @@ // Which output parsing implementation to use. optional ParserKind parser_kind = 4; - reserved 8; // FieldWiseParserConfig + // A config for specifying parsing logic for the fieldwise parser. + optional FieldwiseParserConfig fieldwise_parser_config = 8; // Whether to suppress parsing incomplete output. optional bool suppress_parsing_incomplete_output = 5;
diff --git a/components/optimization_guide/proto/parser_kind.proto b/components/optimization_guide/proto/parser_kind.proto index d5693989..4b09aed 100644 --- a/components/optimization_guide/proto/parser_kind.proto +++ b/components/optimization_guide/proto/parser_kind.proto
@@ -15,6 +15,9 @@ // Model output is placed in the field specified by // OnDeviceModelExecutionOutputConfig::proto_field with no transformation. PARSER_KIND_SIMPLE = 1; + // Model output is parsed and placed into the specified fields according to + // OnDeviceModelExecutionOutputConfig::fieldwise_parser_config. + PARSER_KIND_FIELDWISE = 4; // Model output is parsed as JSON then converted to the response proto. PARSER_KIND_JSON = 2; // Model output is parsed as answers from an AQA model.
diff --git a/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.cc b/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.cc index 7e68872c..29dd6601 100644 --- a/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.cc +++ b/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.cc
@@ -121,13 +121,13 @@ } std::string IncomingPasswordSharingInvitationSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return entity_data.specifics.incoming_password_sharing_invitation().guid(); } std::string IncomingPasswordSharingInvitationSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetClientTag(entity_data); }
diff --git a/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.h b/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.h index e5c01d8..986194f 100644 --- a/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.h +++ b/components/password_manager/core/browser/sharing/incoming_password_sharing_invitation_sync_bridge.h
@@ -59,8 +59,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; bool SupportsGetClientTag() const override; bool SupportsGetStorageKey() const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList>
diff --git a/components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_sync_bridge.cc b/components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_sync_bridge.cc index 7df4170..3adb17c 100644 --- a/components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_sync_bridge.cc +++ b/components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_sync_bridge.cc
@@ -184,12 +184,12 @@ } std::string OutgoingPasswordSharingInvitationSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string OutgoingPasswordSharingInvitationSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return GetStorageKeyFromSpecifics( entity_data.specifics.outgoing_password_sharing_invitation());
diff --git a/components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_sync_bridge.h b/components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_sync_bridge.h index 8ac6583..2a3ffb4 100644 --- a/components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_sync_bridge.h +++ b/components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_sync_bridge.h
@@ -58,8 +58,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; bool SupportsGetClientTag() const override; bool SupportsGetStorageKey() const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList>
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc index 934c949d..49d3401 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.cc +++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -966,7 +966,7 @@ } std::string PasswordSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_password()) << "EntityData does not have password specifics."; @@ -975,7 +975,7 @@ } std::string PasswordSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { NOTREACHED() << "PasswordSyncBridge does not support GetStorageKey."; }
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.h b/components/password_manager/core/browser/sync/password_sync_bridge.h index ca2be2d1..40f7f14 100644 --- a/components/password_manager/core/browser/sync/password_sync_bridge.h +++ b/components/password_manager/core/browser/sync/password_sync_bridge.h
@@ -72,8 +72,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; bool SupportsGetStorageKey() const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/components/performance_manager/features.cc b/components/performance_manager/features.cc index 755b04be..87f08c7 100644 --- a/components/performance_manager/features.cc +++ b/components/performance_manager/features.cc
@@ -31,33 +31,10 @@ "restore_main_frame_state", true); -BASE_FEATURE(kPerformanceControlsPerformanceSurvey, - "PerformanceControlsPerformanceSurvey", - base::FEATURE_DISABLED_BY_DEFAULT); - -BASE_FEATURE(kPerformanceControlsBatteryPerformanceSurvey, - "PerformanceControlsBatteryPerformanceSurvey", - base::FEATURE_DISABLED_BY_DEFAULT); - -// The variable was renamed to "MemorySaver" but the experiment name remains as -// "HighEfficiency" because it is already running (crbug.com/1493843). -BASE_FEATURE(kPerformanceControlsMemorySaverOptOutSurvey, - "PerformanceControlsHighEfficiencyOptOutSurvey", - base::FEATURE_DISABLED_BY_DEFAULT); - -BASE_FEATURE(kPerformanceControlsBatterySaverOptOutSurvey, - "PerformanceControlsBatterySaverOptOutSurvey", - base::FEATURE_DISABLED_BY_DEFAULT); - BASE_FEATURE(kPerformanceControlsPPMSurvey, "PerformanceControlsPPMSurvey", base::FEATURE_DISABLED_BY_DEFAULT); -const base::FeatureParam<base::TimeDelta> - kPerformanceControlsBatterySurveyLookback{ - &kPerformanceControlsBatteryPerformanceSurvey, "battery_lookback", - base::Days(8)}; - BASE_FEATURE_PARAM(base::TimeDelta, kPerformanceControlsPPMSurveyMinDelay, &kPerformanceControlsPPMSurvey,
diff --git a/components/performance_manager/public/features.h b/components/performance_manager/public/features.h index 0466415..b8e39ccc 100644 --- a/components/performance_manager/public/features.h +++ b/components/performance_manager/public/features.h
@@ -53,17 +53,8 @@ BASE_DECLARE_FEATURE(kBatterySaverModeAvailable); // Flags to control HaTS surveys about Chrome performance. -BASE_DECLARE_FEATURE(kPerformanceControlsPerformanceSurvey); -BASE_DECLARE_FEATURE(kPerformanceControlsBatteryPerformanceSurvey); -BASE_DECLARE_FEATURE(kPerformanceControlsMemorySaverOptOutSurvey); -BASE_DECLARE_FEATURE(kPerformanceControlsBatterySaverOptOutSurvey); BASE_DECLARE_FEATURE(kPerformanceControlsPPMSurvey); -// Defines the time delta to look back when checking if a device has used -// battery. -extern const base::FeatureParam<base::TimeDelta> - kPerformanceControlsBatterySurveyLookback; - // Defines the minimum and maximum delay before showing the PPM survey. It will // be shown the next time the user opens the New Tab Page after a random time in // this range.
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc index 480fa74..96dee51 100644 --- a/components/permissions/permission_uma_util.cc +++ b/components/permissions/permission_uma_util.cc
@@ -1456,21 +1456,14 @@ // static void PermissionUmaUtil::RecordPermissionPredictionServiceHoldback( RequestType request_type, - bool is_on_device, + PredictionModelType model_type, bool is_heldback) { - if (is_on_device) { - base::UmaHistogramBoolean( - "Permissions.OnDevicePredictionService.Response." + - GetPermissionRequestString( - PermissionUtil::GetUmaValueForRequestType(request_type)), - is_heldback); - } else { - base::UmaHistogramBoolean( - "Permissions.PredictionService.Response." + - GetPermissionRequestString( - PermissionUtil::GetUmaValueForRequestType(request_type)), - is_heldback); - } + base::UmaHistogramBoolean( + base::StrCat( + {"Permissions.", GetPredictionModelString(model_type), ".Response.", + GetPermissionRequestString( + PermissionUtil::GetUmaValueForRequestType(request_type))}), + is_heldback); } // static @@ -1504,6 +1497,8 @@ return "PredictionService"; case PredictionModelType::kOnDeviceCpssV1Model: return "OnDevicePredictionService"; + case PredictionModelType::kOnDeviceAiV3Model: + return "AIv3"; default: NOTREACHED(); } @@ -2055,4 +2050,15 @@ base::UmaHistogramBoolean(histogram_name, always_active); } +// static +void PermissionUmaUtil::RecordPredictionModelInquireTime( + base::TimeTicks model_inquire_start_time, + PredictionModelType model_type) { + std::string histogram_name = + base::StrCat({"Permissions.", GetPredictionModelString(model_type), + ".InquiryDuration"}); + base::UmaHistogramMediumTimes( + histogram_name, base::TimeTicks::Now() - model_inquire_start_time); +} + } // namespace permissions
diff --git a/components/permissions/permission_uma_util.h b/components/permissions/permission_uma_util.h index 8613aa6..cd69220d 100644 --- a/components/permissions/permission_uma_util.h +++ b/components/permissions/permission_uma_util.h
@@ -53,6 +53,7 @@ kUnknown = 0, kServerSideCpssV3Model = 1, kOnDeviceCpssV1Model = 2, + kOnDeviceAiV3Model = 3, }; // LINT.ThenChange(//tools/metrics/histograms/metadata/permissions/histograms.xml:PredictionModels) @@ -798,7 +799,7 @@ static void RecordPermissionPredictionServiceHoldback( RequestType request_type, - bool is_on_device, + PredictionModelType model_type, bool is_heldback); static void RecordPageInfoDialogAccessType( @@ -910,6 +911,11 @@ std::string permission_action, bool always_active); + // Records the execution time of prediction model inquiries. + static void RecordPredictionModelInquireTime( + base::TimeTicks model_inquire_start_time, + PredictionModelType model_type); + // Records if the browser was active at the time the prompt started displaying static void RecordPromptShownInActiveBrowser( RequestTypeForUma request_type,
diff --git a/components/plus_addresses/settings/plus_address_setting_sync_bridge.cc b/components/plus_addresses/settings/plus_address_setting_sync_bridge.cc index 4506ec1..2cf096a 100644 --- a/components/plus_addresses/settings/plus_address_setting_sync_bridge.cc +++ b/components/plus_addresses/settings/plus_address_setting_sync_bridge.cc
@@ -190,12 +190,12 @@ } std::string PlusAddressSettingSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string PlusAddressSettingSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return entity_data.specifics.plus_address_setting().name(); }
diff --git a/components/plus_addresses/settings/plus_address_setting_sync_bridge.h b/components/plus_addresses/settings/plus_address_setting_sync_bridge.h index 6fe14db9..e358309 100644 --- a/components/plus_addresses/settings/plus_address_setting_sync_bridge.h +++ b/components/plus_addresses/settings/plus_address_setting_sync_bridge.h
@@ -58,8 +58,10 @@ StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; private: // Callbacks for various asynchronous operations of the `store_`.
diff --git a/components/plus_addresses/webdata/plus_address_sync_bridge.cc b/components/plus_addresses/webdata/plus_address_sync_bridge.cc index a57629e..0cbead8 100644 --- a/components/plus_addresses/webdata/plus_address_sync_bridge.cc +++ b/components/plus_addresses/webdata/plus_address_sync_bridge.cc
@@ -193,12 +193,12 @@ } std::string PlusAddressSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string PlusAddressSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return entity_data.specifics.plus_address().profile_id(); }
diff --git a/components/plus_addresses/webdata/plus_address_sync_bridge.h b/components/plus_addresses/webdata/plus_address_sync_bridge.h index b56adc7..5b5d925 100644 --- a/components/plus_addresses/webdata/plus_address_sync_bridge.h +++ b/components/plus_addresses/webdata/plus_address_sync_bridge.h
@@ -46,8 +46,10 @@ StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; private: PlusAddressTable* GetPlusAddressTable();
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 9761c6db..5b37231 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -2311,6 +2311,7 @@ <translation id="2652747206827086936">Karte mit SharePoint- und OneDrive-Dateien auf der Seite „Neuer Tab“ deaktivieren</translation> <translation id="2656559539624760733">Chrome Root Store nicht verwenden.</translation> <translation id="2658653824183107970">Alte <ph name="CORS" />-Implementierung statt des neuen <ph name="CORS" /> verwenden</translation> +<translation id="2659581762274047663">Dienst „<ph name="PRODUCT_NAME" />“ aktivieren</translation> <translation id="2660846099862559570">Nie Proxy verwenden</translation> <translation id="2661628029848851543">Jegliche Nutzung von verwalteten Konten ist zulässig</translation> <translation id="2664391398878045611">Die Seite „Neuer Tab“ zeigt die Information im mittleren Slot nicht an – selbst wenn sie verfügbar ist</translation> @@ -2947,6 +2948,7 @@ <translation id="3143203373436771188">Beim Aufrufen von Office-Dokumenten, die normalerweise im <ph name="BASIC_EDITOR_NAME" /> geöffnet werden, diese im <ph name="BASIC_EDITOR_NAME" /> öffnen</translation> <translation id="3144173889708944482">Wenn <ph name="PRINTERS_BLOCKLIST" /> für <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> ausgewählt ist, wird durch Festlegen von <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> angegeben, welche Drucker die Nutzer nicht verwenden können. Mit Ausnahme der in dieser Richtlinie aufgeführten IDs können die Nutzer auf alle Drucker zugreifen. Die IDs müssen dem Feld <ph name="ID_FIELD" /> oder dem Feld <ph name="GUID_FIELD" /> in der Datei entsprechen, die in <ph name="DEVICE_PRINTERS_POLICY_NAME" /> angegeben ist.</translation> <translation id="3146711617256415776">Stimmen für die Sprachausgabe bei Enhanced Network nicht zulassen, wenn die Funktion „Vorlesen“ verwendet wird</translation> +<translation id="315013437951136266">Funktion „<ph name="IP_PROTECTION_NAME" />“ aktivieren.</translation> <translation id="3150351525324499342"><ph name="PRODUCT_NAME" />-Symbol nicht standardmäßig in der Symbolleiste anzeigen, sondern Nutzer auswählen lassen</translation> <translation id="3152135410085709340">Lokalen Dateizugriff auf „file://“-URLs auf diesen Websites im PDF-Viewer zulassen</translation> <translation id="3152425128389603870">Unified Desktop verfügbar machen und standardmäßig aktivieren</translation> @@ -4142,6 +4144,7 @@ Beide Richtlinien können verwendet werden, diese Richtlinie wird jedoch bald eingestellt. Daher ist die Richtlinie <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> zu bevorzugen. Beide haben den gleichen Effekt auf das Browserverhalten.</translation> <translation id="4016700865356669962">Wenn diese Richtlinie aktiviert ist, dürfen Nutzer Vorlagen für Desktoplayouts verwenden. Ist diese Richtlinie deaktiviert oder nicht konfiguriert, sind diese Vorlagen nicht verfügbar.</translation> +<translation id="4018536413833147396">Nutzern erlauben, die Einstellung „<ph name="IP_PROTECTION_NAME" />“ auf ihrem Gerät zu aktivieren oder zu deaktivieren. Die Funktion wird standardmäßig aktiviert.</translation> <translation id="4020682745012723568">In das Nutzerprofil übertragene Cookies sind für Android-Apps nicht zugänglich.</translation> <translation id="4021684548211845008">Im Konzentrationsmodus Töne deaktivieren.</translation> <translation id="4025500273782820766">Zulassen, dass Nutzer „Immer öffnen“ auswählen, wenn ein Dialog für ein externes Protokoll angezeigt wird, sodass das Protokoll in Zukunft ohne die Bestätigung geöffnet wird</translation> @@ -4616,6 +4619,7 @@ Ist die Richtlinie deaktiviert, werden PDF-Dateien mit dem PDF-Plug‑in geöffnet, sofern es nicht von den Nutzern deaktiviert wird. Wenn diese Richtlinie konfiguriert ist, kann sie von Nutzern in <ph name="PRODUCT_NAME" /> nicht geändert werden. Ist die Richtlinie nicht konfiguriert, können Nutzer entscheiden, ob das PDF extern geöffnet werden soll.</translation> +<translation id="4413764344717830250">Sichtbarkeit der Namensnennung für Erweiterungen auf der Seite „Neuer Tab“ für verwaltete Browser steuern</translation> <translation id="4415603335307944578">Wenn die Richtlinie auf "true" gesetzt oder nicht konfiguriert ist, zeigt der Browser die Begrüßungsseite beim ersten Start nach einer Aktualisierung des Betriebssystems noch einmal an. Ist die Richtlinie auf "false" gesetzt, wird die Begrüßungsseite beim ersten Start nach einer Aktualisierung des Betriebssystems nicht noch einmal angezeigt.</translation> @@ -4738,6 +4742,7 @@ Der Wert der Richtlinie muss in Tagen angegeben werden.</translation> <translation id="4525328580251166229">Steuert zum Bruschetta-Subsystem gehörige Richtlinien.</translation> +<translation id="4528981768990874684">Funktion „<ph name="IP_PROTECTION_NAME" />“ deaktivieren.</translation> <translation id="453031441196755904">Diese Richtlinie ist veraltet.</translation> <translation id="4531706050939927436">Die Installation von Android-Apps kann von der Google Admin-Konsole aus über Google Play erzwungen werden. Android-Apps nutzen diese Richtlinie nicht.</translation> <translation id="4534500438517478692">Name der Android-Einschränkung:</translation> @@ -6523,6 +6528,11 @@ <translation id="5670249935663090320">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, wird <ph name="PRODUCT_NAME" /> aktiviert und kann von Nutzern über das App-Menü, Kontextmenüs von Seiten, Mediensteuerelemente auf für Google Cast optimierten Websites und das Symbol von Cast in der Symbolleiste (falls angezeigt) gestartet werden. Ist die Richtlinie deaktiviert, wird <ph name="PRODUCT_NAME" /> deaktiviert.</translation> +<translation id="5671392367521500075">Mit dieser Richtlinie wird die Sichtbarkeit der Namensnennung für Erweiterungen in der Fußzeile der Seite „Neuer Tab“ festgelegt, wenn die Seite von einer Erweiterung gesteuert wird. Standardmäßig werden in der Fußzeile Informationen zur Erweiterung angezeigt, die die Seite „Neuer Tab“ steuert. + +Wenn diese Richtlinie nicht konfiguriert oder auf „true“ gesetzt ist, wird in Browsern, in denen die Seite „Neuer Tab“ von einer Erweiterung gesteuert wird, ein Link zur Erweiterung und deren Name angezeigt. + +Ist sie auf „false“ gesetzt, wird die Namensnennung ausgeblendet.</translation> <translation id="5673254755365419402"><ph name="PRIVACY_SANDBOX_NAME" />-Funktion „Fingerprinting-Schutz“ aktivieren.</translation> <translation id="567377007899266033">Wenn die Richtlinie auf "True" gesetzt ist, werden Berichte über wichtige richtlinienbasierte Erweiterungsinstallationen an Google gesendet. Wenn die Richtlinie auf "False" gesetzt ist, werden keine diesbezüglichen Ereignisse erfasst. Ist die Richtlinie nicht konfiguriert, ist der Standardwert "True".</translation> <translation id="5673780539191375049">Mit dieser Richtlinie wird das Zeitintervall (in Minuten) festgelegt, gemäß dem der Authentifizierungsvorgang des Nutzers auf seinem <ph name="PRODUCT_OS_NAME" />-Gerät automatisch aktualisiert wird. Die Richtlinie wird eingeführt, um das Beenden einiger Dienste zu verhindern, die bei Authentifizierungsabläufen verwendet werden, nachdem das Gerät eine Weile inaktiv war. @@ -7577,6 +7587,23 @@ Weitere Informationen zur Datenverarbeitung bei auf generativer KI basierenden Funktionen findest du unter https://support.google.com/chrome/a?p=generative_ai_settings.</translation> <translation id="6394350458541421998">Diese Richtlinie ist ab <ph name="PRODUCT_OS_NAME" />-Version 29 nicht mehr vorhanden. Verwende stattdessen die Richtlinie "PresentationScreenDimDelayScale".</translation> +<translation id="6397424663361748439">Durch diese Richtlinie wird festgelegt, ob die <ph name="PRIVACY_SANDBOX_NAME" />-Funktion „<ph name="IP_PROTECTION_NAME" />“ aktiviert werden soll. + +Durch die Funktion „<ph name="IP_PROTECTION_NAME" />“ wird die Verfügbarkeit der ursprünglichen IP-Adresse von Nutzern, die im Inkognitomodus surfen, für bestimmte Netzwerkanfragen von Drittanbietern eingeschränkt. Dadurch werden Nutzer im Inkognitomodus besser vor websiteübergreifendem Tracking geschützt. + +Ist die Richtlinie deaktiviert, ist die Funktion „<ph name="IP_PROTECTION_NAME" />“ deaktiviert und Nutzer können sie nicht über die Einstellungen der Benutzeroberfläche aktivieren. +Ist die Richtlinie aktiviert, ist die Funktion „<ph name="IP_PROTECTION_NAME" />“ aktiviert und Nutzer können sie nicht über die Einstellungen der Benutzeroberfläche deaktivieren. +Ist die Richtlinie nicht konfiguriert, ist die Funktion „<ph name="IP_PROTECTION_NAME" />“ standardmäßig aktiviert und Nutzer können sie auf ihrem Gerät über die Einstellungen der Benutzeroberfläche steuern. + +Hinweise für Unternehmen, die erwägen, die Funktion „<ph name="IP_PROTECTION_NAME" />“ zu deaktivieren: +– Bei Anfragen über einen Proxy werden keine DNS-Lookups durchgeführt. Dies kann sich auf die DNS-basierte Kontrolle oder Filterung auswirken. +– Bei Unternehmensanwendungen, die im Inkognitomodus verwendet werden, können Probleme auftreten, wenn sie auf Anfragen an Domains (oder zugehörige Subdomains) auf der Liste der maskierten Domains (<ph name="MASKED_DOMAIN_LIST_URL" />) angewiesen sind und diese Anfragen aus bestimmten IP-Adressbereichen stammen müssen. +– Unter bestimmten Bedingungen wird der Traffic im Inkognitomodus möglicherweise nicht über einen Proxy geleitet, z. B. wenn Nutzer den Inkognitomodus über ein Chrome-Profil starten, in dem sie nicht angemeldet sind. Im Allgemeinen erfordert die Funktion, dass die Nutzer beim Starten des Inkognitomodus in Chrome in einem privaten Google-Konto angemeldet sind. +– Die Liste der maskierten Domains kann sich im Laufe der Zeit ändern. Neue Versionen werden automatisch an Nutzer gesendet. Weitere Informationen zur Liste der maskierten Domains finden Sie unter <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />. + +Weitere Informationen zur Funktion „<ph name="IP_PROTECTION_NAME" />“ finden Sie unter <ph name="IP_PROTECTION_README_URL" />. + +Die Funktion „<ph name="IP_PROTECTION_NAME" />“ wird frühestens mit M139 eingeführt.</translation> <translation id="6397588391180665797">Mit dieser Richtlinie wird festgelegt, ob die Netzwerkkonfiguration von Nutzern auf angemeldeten Geräten ausgegeben wird. Wenn sie auf „false“ gesetzt ist, werden keine Informationen ausgegeben.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 3d227bd..17027430 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -2435,6 +2435,7 @@ <translation id="2652747206827086936">Inhabilitar la tarjeta de archivos de SharePoint y OneDrive de NTP</translation> <translation id="2656559539624760733">No utilizar Chrome Root Store</translation> <translation id="2658653824183107970">Utiliza la implementación heredada de <ph name="CORS" /> en lugar de la nueva implementación de <ph name="CORS" /></translation> +<translation id="2659581762274047663">Habilitar el servicio <ph name="PRODUCT_NAME" /></translation> <translation id="2660846099862559570">Nunca usar un proxy</translation> <translation id="2661628029848851543">Se permiten todos los usos de cuentas administradas</translation> <translation id="2664391398878045611">La página Nueva pestaña no mostrará la notificación del espacio del medio aunque esté disponible</translation> @@ -3080,6 +3081,7 @@ <translation id="3143203373436771188">Cuando navegues a documentos de Office administrados por <ph name="BASIC_EDITOR_NAME" />, abrirlos en <ph name="BASIC_EDITOR_NAME" /></translation> <translation id="3144173889708944482">Si eliges <ph name="PRINTERS_BLOCKLIST" /> para <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, la configuración de <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> especificará las impresoras que no podrán utilizar los usuarios. Los usuarios podrán acceder a todas las impresoras, excepto aquellas con los ID mencionados en esta política. Los ID deben coincidir con los valores de los campos <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> en el archivo que se especifica en <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation> <translation id="3146711617256415776">No permitir las voces de texto a voz de la red mejorada cuando se utiliza Seleccionar para pronunciar</translation> +<translation id="315013437951136266">Habilitar la función <ph name="IP_PROTECTION_NAME" />.</translation> <translation id="3150351525324499342">No mostrar el ícono de <ph name="PRODUCT_NAME" /> en la barra de herramientas de forma predeterminada, pero permitir que los usuarios elijan</translation> <translation id="3152135410085709340">Permitir el acceso de archivo local a las URLs de file:// para estos sitios en el Lector de PDF</translation> <translation id="3152425128389603870">Habilitar el modo de escritorio unificado y activarlo de forma predeterminada</translation> @@ -4315,6 +4317,7 @@ Se puede usar cualquiera de las políticas, pero esta dejará de estar disponible pronto, por lo que se prefiere la política <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />. Ambas tienen el mismo efecto en el comportamiento del navegador.</translation> <translation id="4016700865356669962">Si habilitas la política, los usuarios podrán usar las plantillas de diseño de escritorio. Si inhabilitas la política o no la estableces, estas plantillas no estarán disponibles.</translation> +<translation id="4018536413833147396">Permitir que los usuarios activen o desactiven el parámetro de configuración <ph name="IP_PROTECTION_NAME" /> en sus dispositivos. La función estará habilitada de forma predeterminada.</translation> <translation id="4020682745012723568">Las apps de Android no pueden acceder a las cookies transferidas al perfil del usuario.</translation> <translation id="4021684548211845008">Inhabilitar los sonidos en el Modo sin distracciones.</translation> <translation id="4025500273782820766">Permitir que los usuarios seleccionen "Permitir siempre" cuando se muestra un diálogo de protocolo externo para omitir futuros mensajes de confirmación</translation> @@ -4818,6 +4821,7 @@ Si inhabilitas la política, se abrirán los archivos PDF, a menos que los usuarios desactiven el complemento de PDF. Si estableces esta política, los usuarios no podrán cambiarla en <ph name="PRODUCT_NAME" />. Si no la estableces, los usuarios podrán elegir si desean abrir los archivos PDF de forma externa o no.</translation> +<translation id="4413764344717830250">Controlar la visibilidad de la atribución de la extensión en la página Nueva pestaña para los navegadores administrados</translation> <translation id="4415603335307944578">Si esta política se configura como verdadera, o no se configura, el navegador volverá a mostrar la página de bienvenida la primera vez que se inicie después de una actualización del SO. Si esta política se configura como falsa, el navegador no volverá a mostrar la página de bienvenida la primera vez que se inicie después de una actualización del SO.</translation> @@ -4940,6 +4944,7 @@ El valor de la política deberá especificarse en días.</translation> <translation id="4525328580251166229">Controla las políticas relacionadas con el subsistema de Bruschetta.</translation> +<translation id="4528981768990874684">Inhabilitar la función <ph name="IP_PROTECTION_NAME" />.</translation> <translation id="453031441196755904">Esta política es obsoleta.</translation> <translation id="4531706050939927436">Con Google Play, se puede forzar la instalación de apps de Android desde la Consola del administrador de Google. Estas apps no usan esta política.</translation> <translation id="4534500438517478692">Nombre de restricción de Android:</translation> @@ -6782,6 +6787,11 @@ <translation id="5670249935663090320">Si habilitas la política o no la estableces, se activará <ph name="PRODUCT_NAME" />, que los usuarios pueden ejecutar desde el menú de la app, los menús contextuales de la página, los controles de contenido multimedia en los sitios web compatibles con Cast y el ícono de la barra de herramientas de Cast (si se muestra). Si inhabilitas la política, se desactivará <ph name="PRODUCT_NAME" />.</translation> +<translation id="5671392367521500075">Esta política controla la visibilidad de la atribución de la extensión en el pie de página de la página Nueva pestaña cuando esta página está controlada por una extensión. De forma predeterminada, este pie de página muestra información sobre la extensión que controla la página Nueva pestaña. + +Si no la estableces o la estableces como verdadera, los navegadores con una página Nueva pestaña controlada por una extensión mostrarán el nombre de la extensión y un vínculo a ella. + +Si estableces esta política como falsa, se ocultará la atribución de la extensión.</translation> <translation id="5673254755365419402">Habilitar la función Fingerprinting Protection de <ph name="PRIVACY_SANDBOX_NAME" />.</translation> <translation id="567377007899266033">Si estableces la política como verdadera, se enviarán a Google los informes sobre los eventos clave de instalación de extensiones que activan la política. Si la estableces como falsa, no se capturará ningún evento. Si no la estableces, se establecerá el valor predeterminado como verdadero.</translation> <translation id="5673780539191375049">Establece el intervalo de tiempo (en minutos) que se usa para volver a cargar automáticamente el flujo de autenticación del usuario en su dispositivo <ph name="PRODUCT_OS_NAME" />. Se presenta esta política para controlar el vencimiento de algunos servicios que se usan en los flujos de autenticación cuando el dispositivo permanece inactivo por un tiempo. @@ -7926,6 +7936,23 @@ Para obtener más información sobre el manejo de datos de las funciones potenciadas por IA generativa, consulta https://support.google.com/chrome/a?p=generative_ai_settings.</translation> <translation id="6394350458541421998">Esta política se eliminó a partir de la versión 29 de <ph name="PRODUCT_OS_NAME" />. Utiliza la política PresentationScreenDimDelayScale en su lugar.</translation> +<translation id="6397424663361748439">Una política que controla si se debe activar la función <ph name="IP_PROTECTION_NAME" /> de <ph name="PRIVACY_SANDBOX_NAME" />. + +<ph name="IP_PROTECTION_NAME" /> es una función que limita la disponibilidad de la dirección IP original de un usuario para ciertas solicitudes de red de terceros realizadas mientras navega en modo Incógnito, lo que mejora las protecciones contra el seguimiento entre sitios durante las sesiones de navegación en Incógnito. + +Si inhabilitas la política, se desactivará <ph name="IP_PROTECTION_NAME" /> y los usuarios no podrán activar la función desde la configuración de la IU. +Si la habilitas, se activará <ph name="IP_PROTECTION_NAME" /> y los usuarios no podrán desactivar la función desde la configuración de la IU. +Si no estableces la política, se habilitará <ph name="IP_PROTECTION_NAME" /> de forma predeterminada y los usuarios podrán controlar la función en sus dispositivos desde la configuración de la IU. + +Algunas consideraciones sobre si las empresas deben inhabilitar <ph name="IP_PROTECTION_NAME" /> incluyen: +- No se realizarán búsquedas de DNS para las solicitudes con proxy, lo que puede afectar la supervisión o el filtrado basado en DNS. +- Es posible que las aplicaciones empresariales se interrumpan cuando se usan en modo Incógnito si dependen de solicitudes a dominios (o subdominios de esos dominios) de la lista de dominios enmascarados (<ph name="MASKED_DOMAIN_LIST_URL" />) y requieren que esas solicitudes provengan de rangos de direcciones IP específicos. +- Es posible que el tráfico no se envíe mediante proxy en el modo Incógnito en ciertas condiciones, por ejemplo, cuando los usuarios abren el modo Incógnito desde un perfil de Chrome en el que no accedieron. En general, la función requiere que el usuario haya accedido a Chrome con una Cuenta de Google personal cuando inicia el modo Incógnito. +- La lista de dominios en la lista de dominios enmascarados puede cambiar con el tiempo, y las versiones nuevas se envían a los usuarios automáticamente. Para obtener más información sobre la lista de dominios enmascarados, consulta <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />. + +Para obtener más información sobre <ph name="IP_PROTECTION_NAME" />, consulta <ph name="IP_PROTECTION_README_URL" />. + +<ph name="IP_PROTECTION_NAME" /> se lanzará a más tardar en M139.</translation> <translation id="6397588391180665797">Informa a los usuarios sobre la configuración de red en dispositivos inscritos. Si estableces la política como falsa, no se informarán los eventos.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 02cf5d9..81a89f77 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -2312,6 +2312,7 @@ <translation id="2652747206827086936">Inhabilitar la tarjeta de archivo de SharePoint y OneDrive en la página Nueva pestaña</translation> <translation id="2656559539624760733">No usar Chrome Root Store</translation> <translation id="2658653824183107970">Permite usar la implementación antigua de <ph name="CORS" /> en vez de la nueva implementación de <ph name="CORS" />.</translation> +<translation id="2659581762274047663">Habilita el servicio <ph name="PRODUCT_NAME" /></translation> <translation id="2660846099862559570">No utilizar nunca un proxy</translation> <translation id="2661628029848851543">Se permiten todos los usos de las cuentas gestionadas</translation> <translation id="2664391398878045611">La página Nueva pestaña no mostrará el anuncio del espacio intermedio aunque esté disponible</translation> @@ -2950,6 +2951,7 @@ <translation id="3143203373436771188">Al acceder a documentos de Office gestionados por <ph name="BASIC_EDITOR_NAME" />, abrirlos en <ph name="BASIC_EDITOR_NAME" /></translation> <translation id="3144173889708944482">Si se utiliza <ph name="PRINTERS_BLOCKLIST" /> para la política <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, al establecer la política <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />, esta especifica qué impresoras no pueden utilizar los usuarios. Los usuarios podrán utilizar todas las impresoras, excepto aquellas con los ID indicados en la política. Los ID deben coincidir con los campos <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del archivo definido en la política <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation> <translation id="3146711617256415776">No permitir las voces de conversión de texto a voz de red mejorada al usar Enunciar selección</translation> +<translation id="315013437951136266">Habilita la función <ph name="IP_PROTECTION_NAME" />.</translation> <translation id="3150351525324499342">No mostrar de forma predeterminada el icono de <ph name="PRODUCT_NAME" /> en la barra de herramientas, pero dejar que los usuarios elijan</translation> <translation id="3152135410085709340">Permitir que estos sitios accedan a archivos locales mediante URLs file:// en el lector de PDFs</translation> <translation id="3152425128389603870">Habilitar el escritorio unificado y activarlo de forma predeterminada</translation> @@ -4151,6 +4153,7 @@ Puedes usar cualquiera de las dos políticas, pero esta dejará de estar disponible pronto, por lo que se recomienda usar la política <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />. Ambas tienen el mismo efecto en el comportamiento del navegador.</translation> <translation id="4016700865356669962">Si se habilita esta política, se permitirá que los usuarios usen plantillas de diseño de escritorio. Si se inhabilita esta política o no se establece, estas plantillas no estarán disponibles.</translation> +<translation id="4018536413833147396">Permitir que los usuarios activen o desactiven el ajuste <ph name="IP_PROTECTION_NAME" /> en sus dispositivos. La función estará habilitada de forma predeterminada.</translation> <translation id="4020682745012723568">Las aplicaciones para Android no pueden acceder a las cookies transferidas al perfil del usuario.</translation> <translation id="4021684548211845008">Inhabilitar los sonidos en el modo Sin distracciones</translation> <translation id="4025500273782820766">Permitir que los usuarios seleccionen "Permitir siempre" cuando un diálogo de protocolo externo aparezca para así saltarse futuras solicitudes de confirmación</translation> @@ -4753,6 +4756,7 @@ El valor de esta política debe especificarse en número de días.</translation> <translation id="4525328580251166229">Controla las políticas relacionadas con el subsistema Bruschetta.</translation> +<translation id="4528981768990874684">Inhabilita la función <ph name="IP_PROTECTION_NAME" />.</translation> <translation id="453031441196755904">Esta política está obsoleta.</translation> <translation id="4531706050939927436">Las aplicaciones para Android se pueden instalar de manera forzada desde la consola de administración de Google usando Google Play. No utilizan esta política.</translation> <translation id="4534500438517478692">Nombre de restricción de Android:</translation> @@ -7637,6 +7641,23 @@ Para obtener más información sobre el tratamiento de datos en las funciones de IA generativa, consulta https://support.google.com/chrome/a?p=generative_ai_settings.</translation> <translation id="6394350458541421998">Esta política no está disponible desde la versión 29 de <ph name="PRODUCT_OS_NAME" />. Utiliza la política PresentationScreenDimDelayScale en su lugar.</translation> +<translation id="6397424663361748439">Una política para controlar si debe habilitarse la función <ph name="IP_PROTECTION_NAME" /> de <ph name="PRIVACY_SANDBOX_NAME" />. + +<ph name="IP_PROTECTION_NAME" /> es una función que limita la disponibilidad de la dirección IP original de un usuario para ciertas solicitudes de red de terceros realizadas mientras navega en modo Incógnito, lo que mejora las protecciones contra el seguimiento entre sitios durante las sesiones de navegación en este modo. + +Si se inhabilita esta política, se inhabilitará <ph name="IP_PROTECTION_NAME" /> y los usuarios no podrán habilitar la función mediante la configuración de UI. +Si se habilita esta política, se habilitará <ph name="IP_PROTECTION_NAME" /> y los usuarios no podrán inhabilitar la función mediante la configuración de UI. +Si no se define esta política, <ph name="IP_PROTECTION_NAME" /> se habilitará de forma predeterminada y los usuarios podrán controlar la función en su dispositivo mediante la configuración de UI. + +Algunas consideraciones sobre si las empresas deberían inhabilitar <ph name="IP_PROTECTION_NAME" />: +- No se realizarán peticiones de DNS para las solicitudes con proxy, lo que puede afectar a la monitorización o al filtrado basados en DNS. +- Es posible que las aplicaciones empresariales no funcionen correctamente cuando se usan en modo Incógnito si dependen de solicitudes a dominios (o subdominios de esos dominios) de la lista de dominios enmascarados (<ph name="MASKED_DOMAIN_LIST_URL" />) y requieren que esas solicitudes procedan de intervalos de direcciones IP específicos. +- Es posible que el tráfico no se redirija a través de un proxy en el modo Incógnito en determinadas condiciones; por ejemplo, cuando los usuarios abren el modo Incógnito desde un perfil de Chrome en el que no han iniciado sesión. En general, esta función requiere que el usuario haya iniciado sesión en Chrome con una cuenta de Google personal al abrir el modo Incógnito. +- La lista de dominios enmascarados puede cambiar con el tiempo. Las nuevas versiones se enviarán a los usuarios automáticamente. Para obtener más información sobre la lista de dominios enmascarados, consulta <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />. + +Para obtener más información sobre <ph name="IP_PROTECTION_NAME" />, consulta <ph name="IP_PROTECTION_README_URL" />. + +<ph name="IP_PROTECTION_NAME" /> se lanzará a partir de la versión M139.</translation> <translation id="6397588391180665797">Envía información sobre la configuración de red de los usuarios en los dispositivos registrados. Si se asigna el valor false a esta política, no se enviará la información.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index e4cf610..3514465 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -4616,6 +4616,7 @@ Si cette règle est désactivée, les fichiers PDF sont ouverts, sauf si les utilisateurs ont désactivé le plug-in PDF. Si cette règle est configurée, les utilisateurs ne peuvent pas la modifier dans <ph name="PRODUCT_NAME" />. Si cette règle n'est pas configurée, les utilisateurs peuvent choisir d'ouvrir le PDF en externe ou non.</translation> +<translation id="4413764344717830250">Contrôler la visibilité de l'attribution de l'extension sur la page "Nouvel onglet" des navigateurs gérés</translation> <translation id="4415603335307944578">Si cette règle est définie sur "True" ou n'est pas configurée, le navigateur affiche la page de bienvenue à chaque premier lancement suivant une mise à jour de l'OS. Si cette règle est définie sur "False", le navigateur n'affiche pas la page de bienvenue à chaque premier lancement suivant une mise à jour de l'OS.</translation> @@ -6528,6 +6529,11 @@ <translation id="5670249935663090320">Si cette règle est activée ou qu'elle n'est pas configurée, <ph name="PRODUCT_NAME" /> est activé. Les utilisateurs pourront le lancer depuis le menu de l'application, les menus contextuels des pages, les commandes multimédias sur les sites Web compatibles Cast et l'icône Cast de la barre d'outils (si elle est affichée). Si cette règle est désactivée, <ph name="PRODUCT_NAME" /> le sera également.</translation> +<translation id="5671392367521500075">Cette règle contrôle la visibilité de l'attribution de l'extension dans le pied de la page "Nouvel onglet" lorsque cette page est contrôlée par une extension. Par défaut, le pied de la page "Nouvel onglet" affiche des informations sur l'extension qui contrôle cette page. + +Si cette règle n'est pas configurée ou si elle est définie sur "True", les navigateurs dont la page "Nouvel onglet" est contrôlée par une extension affichent le nom de l'extension et un lien vers celle-ci. + +Si cette règle est définie sur "False", l'attribution de l'extension sera masquée.</translation> <translation id="5673254755365419402">Activer la fonctionnalité de protection contre le fingerprinting de <ph name="PRIVACY_SANDBOX_NAME" />.</translation> <translation id="567377007899266033">Si cette règle est définie sur "True", des rapports sur les événements critiques d'installation d'extensions déclenchée par des règles sont transmis à Google. Si elle est définie sur "False", aucun événement n'est enregistré. Si elle n'est pas configurée, la valeur par défaut est définie sur "True".</translation> <translation id="5673780539191375049">Définit l'intervalle de temps (en minutes) pour actualiser automatiquement le flux d'authentification de l'utilisateur sur son appareil <ph name="PRODUCT_OS_NAME" />. Cette règle permet de gérer l'expiration de certains services utilisés dans les flux d'authentification lorsque l'appareil est inactif pendant un certain temps.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 9b5458f..4bc214e 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -2442,6 +2442,7 @@ <translation id="2652747206827086936">Nonaktifkan Kartu NTP SharePoint dan OneDrive File</translation> <translation id="2656559539624760733">Jangan gunakan Chrome Root Store.</translation> <translation id="2658653824183107970">Menggunakan implementasi <ph name="CORS" /> lama, bukan <ph name="CORS" /> baru.</translation> +<translation id="2659581762274047663">Mengaktifkan Layanan <ph name="PRODUCT_NAME" /></translation> <translation id="2660846099862559570">Jangan pernah gunakan proxy</translation> <translation id="2661628029848851543">Semua penggunaan akun terkelola diizinkan</translation> <translation id="2664391398878045611">Halaman Tab Baru tidak akan menampilkan pengumuman slot tengah meskipun jika tersedia</translation> @@ -3089,6 +3090,7 @@ <translation id="3143203373436771188">Saat membuka dokumen Office yang ditangani oleh <ph name="BASIC_EDITOR_NAME" />, buka dokumen tersebut di <ph name="BASIC_EDITOR_NAME" /></translation> <translation id="3144173889708944482">Jika <ph name="PRINTERS_BLOCKLIST" /> dipilih untuk <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, menyetel <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> akan menentukan printer yang tidak dapat digunakan oleh pengguna. Semua printer diberikan kepada pengguna kecuali ID yang tercantum dalam kebijakan ini. ID harus sesuai dengan kolom <ph name="ID_FIELD" /> atau <ph name="GUID_FIELD" /> dalam file yang ditentukan di <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation> <translation id="3146711617256415776">Larang suara text-to-speech enhanced network saat menggunakan Klik untuk Diucapkan</translation> +<translation id="315013437951136266">Aktifkan fitur <ph name="IP_PROTECTION_NAME" />.</translation> <translation id="3150351525324499342">Jangan tampilkan ikon <ph name="PRODUCT_NAME" /> di toolbar secara default, tetapi izinkan pengguna memilih</translation> <translation id="3152135410085709340">Mengizinkan akses file lokal ke URL file:// di situs ini di Penampil PDF</translation> <translation id="3152425128389603870">Membuat Desktop Terpadu tersedia dan aktif secara default</translation> @@ -4326,6 +4328,7 @@ Salah satu kebijakan dapat digunakan, tetapi kebijakan ini tidak akan digunakan lagi dalam waktu dekat sehingga kebijakan <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> lebih disarankan. Kedua kebijakan tersebut memiliki efek yang sama pada perilaku browser.</translation> <translation id="4016700865356669962">Jika kebijakan disetel ke Aktif, pengguna akan dapat menggunakan template tata letak desktop. Jika kebijakan disetel ke Nonaktif atau tidak disetel, template tersebut tidak akan tersedia.</translation> +<translation id="4018536413833147396">Izinkan pengguna mengaktifkan atau menonaktifkan setelan <ph name="IP_PROTECTION_NAME" /> di perangkat mereka. Fitur ini akan diaktifkan secara default.</translation> <translation id="4020682745012723568">Cookie yang ditransfer ke profil pengguna tidak dapat diakses oleh aplikasi Android.</translation> <translation id="4021684548211845008">Menonaktifkan suara dalam Mode Fokus.</translation> <translation id="4025500273782820766">Izinkan pengguna memilih "Selalu izinkan" untuk melewati perintah konfirmasi di waktu mendatang, jika dialog protokol eksternal muncul</translation> @@ -4828,6 +4831,7 @@ Jika kebijakan disetel ke Nonaktif, file PDF akan dibuka kecuali jika pengguna menonaktifkan plugin PDF. Jika Anda menyetel kebijakan, pengguna tidak dapat mengubahnya di <ph name="PRODUCT_NAME" />. Jika kebijakan tidak disetel, pengguna dapat memilih apakah akan membuka PDF secara eksternal atau tidak.</translation> +<translation id="4413764344717830250">Mengontrol visibilitas atribusi ekstensi di Halaman Tab Baru untuk browser terkelola</translation> <translation id="4415603335307944578">Jika kebijakan ini ditetapkan ke True atau tidak dikonfigurasi, browser akan menampilkan kembali halaman sambutan saat diluncurkan pertama kali setelah upgrade OS. Jika kebijakan ini ditetapkan ke False, browser tidak akan menampilkan kembali halaman sambutan saat diluncurkan pertama kali setelah upgrade OS.</translation> @@ -4950,6 +4954,7 @@ Nilai kebijakan harus ditentukan dalam hari.</translation> <translation id="4525328580251166229">Mengontrol kebijakan yang terkait dengan subsistem Bruschetta.</translation> +<translation id="4528981768990874684">Nonaktifkan fitur <ph name="IP_PROTECTION_NAME" />.</translation> <translation id="453031441196755904">Kebijakan ini tidak digunakan lagi.</translation> <translation id="4531706050939927436">Aplikasi Android dapat diinstal otomatis dari konsol Google Admin menggunakan Google Play. Aplikasi Android tidak menggunakan kebijakan ini.</translation> <translation id="4534500438517478692">Nama pembatasan Android:</translation> @@ -6793,6 +6798,11 @@ <translation id="5670249935663090320">Jika kebijakan disetel ke Aktif atau tidak disetel, <ph name="PRODUCT_NAME" /> akan diaktifkan dan pengguna dapat meluncurkannya dari menu aplikasi, menu konteks halaman, kontrol media di situs yang kompatibel untuk Cast, dan ikon toolbar Cast (jika ditampilkan). Jika kebijakan disetel ke Nonaktif, <ph name="PRODUCT_NAME" /> akan dinonaktifkan.</translation> +<translation id="5671392367521500075">Kebijakan ini mengontrol visibilitas atribusi ekstensi di dalam footer Halaman Tab Baru (NTP) saat NTP dikontrol oleh ekstensi. Secara default, footer NTP menampilkan informasi tentang ekstensi yang mengontrol NTP. + +Jika kebijakan ini tidak disetel atau disetel ke benar (true), browser dengan NTP yang dikontrol ekstensi akan menampilkan nama ekstensi dan link ke ekstensi tersebut. + +Jika kebijakan ini disetel ke salah (false), atribusi ekstensi akan disembunyikan.</translation> <translation id="5673254755365419402">Aktifkan fitur Perlindungan Pelacakan Sidik Jari <ph name="PRIVACY_SANDBOX_NAME" />.</translation> <translation id="567377007899266033">Jika kebijakan disetel ke Benar (True), laporan peristiwa penting penginstalan ekstensi Android yang dipicu kebijakan akan dikirimkan ke Google. Jika kebijakan disetel ke Salah (False), tidak ada peristiwa yang direkam. Jika kebijakan tidak disetel, nilai default akan disetel ke Benar (True).</translation> <translation id="5673780539191375049">Menetapkan interval waktu (dalam menit) yang digunakan untuk otomatis memuat ulang alur autentikasi pengguna di perangkat <ph name="PRODUCT_OS_NAME" /> mereka. Kebijakan ini diperkenalkan untuk menangani masa berlaku beberapa layanan yang digunakan dalam alur autentikasi saat perangkat dibiarkan tidak ada aktivitas selama beberapa waktu. @@ -7936,6 +7946,23 @@ Untuk mengetahui informasi selengkapnya tentang penanganan data untuk fitur AI generatif, lihat https://support.google.com/chrome/a?p=generative_ai_settings.</translation> <translation id="6394350458541421998">Kebijakan ini tidak lagi digunakan sejak <ph name="PRODUCT_OS_NAME" /> versi 29. Gunakan kebijakan PresentationScreenDimDelayScale sebagai gantinya.</translation> +<translation id="6397424663361748439">Kebijakan untuk mengontrol apakah fitur <ph name="IP_PROTECTION_NAME" /> <ph name="PRIVACY_SANDBOX_NAME" /> harus diaktifkan. + +<ph name="IP_PROTECTION_NAME" /> adalah fitur yang membatasi ketersediaan alamat IP asli pengguna untuk permintaan jaringan pihak ketiga tertentu yang dibuat saat menjelajah dalam mode Samaran, sehingga meningkatkan perlindungan terhadap pelacakan lintas situs selama sesi penjelajahan Samaran. + +Jika kebijakan ini disetel ke Nonaktif, <ph name="IP_PROTECTION_NAME" /> akan dinonaktifkan dan pengguna tidak akan dapat mengaktifkan fitur tersebut melalui setelan UI. +Jika kebijakan ini disetel ke Aktif, <ph name="IP_PROTECTION_NAME" /> akan diaktifkan dan pengguna tidak akan dapat menonaktifkan fitur tersebut melalui setelan UI. +Jika kebijakan ini tidak disetel, <ph name="IP_PROTECTION_NAME" /> akan diaktifkan secara default dan pengguna akan dapat mengontrol fitur tersebut di perangkatnya melalui setelan UI. + +Beberapa pertimbangan terkait apakah perusahaan harus menonaktifkan <ph name="IP_PROTECTION_NAME" /> meliputi: +- Pencarian DNS tidak akan dilakukan untuk permintaan yang di-proxy, yang dapat memengaruhi pemantauan atau pemfilteran berbasis DNS. +- Aplikasi perusahaan mungkin mengalami gangguan saat digunakan dalam mode Samaran jika aplikasi tersebut bergantung pada permintaan ke domain (atau subdomain dari domain tersebut) di Daftar Domain Tersamar (<ph name="MASKED_DOMAIN_LIST_URL" />) dan mengharuskan permintaan tersebut berasal dari rentang alamat IP tertentu. +- Traffic mungkin tidak di-proxy dalam mode Samaran dalam kondisi tertentu, misalnya saat pengguna meluncurkan mode Samaran dari profil Chrome yang tidak mereka gunakan untuk login. Secara umum, fitur ini mengharuskan pengguna untuk login ke Chrome dengan Akun Google pribadi saat meluncurkan mode Samaran. +- Daftar domain di Daftar Domain Tersamar mungkin berubah dari waktu ke waktu. Setiap versi barunya akan otomatis dikirimkan kepada pengguna. Untuk mengetahui informasi selengkapnya tentang Daftar Domain Tersamar, lihat: <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />. + +Untuk mengetahui informasi selengkapnya tentang <ph name="IP_PROTECTION_NAME" />, lihat: <ph name="IP_PROTECTION_README_URL" />. + +<ph name="IP_PROTECTION_NAME" /> akan diluncurkan mulai M139.</translation> <translation id="6397588391180665797">Melaporkan konfigurasi jaringan pengguna di perangkat terdaftar. Jika kebijakan disetel ke salah (false), informasi tersebut tidak akan dilaporkan.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 5b1bdd5..5aba157 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -2228,6 +2228,7 @@ <translation id="2652747206827086936">NTP SharePoint ファイルと OneDrive ファイルのカードを無効にする</translation> <translation id="2656559539624760733">Chrome Root Store を使用しない。</translation> <translation id="2658653824183107970">新しい <ph name="CORS" /> の実装ではなく以前の <ph name="CORS" /> の実装を使用する</translation> +<translation id="2659581762274047663"><ph name="PRODUCT_NAME" /> サービスを有効にする</translation> <translation id="2660846099862559570">プロキシを使用しない</translation> <translation id="2661628029848851543">管理対象アカウントの使用はすべて許可されます</translation> <translation id="2664391398878045611">中央スロットのお知らせが使用可能であっても、新しいタブページに表示しない</translation> @@ -2851,6 +2852,7 @@ <translation id="3143203373436771188"><ph name="BASIC_EDITOR_NAME" /> で処理される Office ドキュメントを操作する際に <ph name="BASIC_EDITOR_NAME" /> で開く</translation> <translation id="3144173889708944482"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> の値に <ph name="PRINTERS_BLOCKLIST" /> が選択されている場合、<ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> でユーザーが使用できないプリンタを指定できます。ユーザーは、このポリシーで指定されている ID 以外のすべてのプリンタを使用できます。この ID は、<ph name="DEVICE_PRINTERS_POLICY_NAME" /> で指定されたファイル内の「<ph name="ID_FIELD" />」または「<ph name="GUID_FIELD" />」フィールドに対応している必要があります。</translation> <translation id="3146711617256415776">「選択して読み上げ」の使用時に Enhanced Network のテキスト読み上げ音声を許可しない</translation> +<translation id="315013437951136266"><ph name="IP_PROTECTION_NAME" /> 機能を有効にする。</translation> <translation id="3150351525324499342">デフォルトで <ph name="PRODUCT_NAME" /> アイコンをツールバーに表示しないが、ユーザーが選択できるようにする</translation> <translation id="3152135410085709340">PDF ビューアで file:// URL へのローカル ファイル アクセスを許可するサイトを指定する</translation> <translation id="3152425128389603870">統合デスクトップを使用可能にし、デフォルトで有効にする</translation> @@ -4043,6 +4045,7 @@ どちらのポリシーも使用できますが、このポリシーはまもなくサポートが終了するため、<ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> ポリシーを推奨します。 どちらもブラウザの動作に対して同じ影響を及ぼします。</translation> <translation id="4016700865356669962">このポリシーを有効に設定した場合、ユーザーはパソコン用レイアウト テンプレートを使用できます。このポリシーを無効に設定するか未設定のままにした場合、これらのテンプレートは使用できません。</translation> +<translation id="4018536413833147396">ユーザーがデバイスで <ph name="IP_PROTECTION_NAME" /> の設定をオンまたはオフに切り替えられるようにする。この機能はデフォルトで有効になります。</translation> <translation id="4020682745012723568">Android アプリは、ユーザーのプロフィールに送信された Cookie にアクセスすることはできません。</translation> <translation id="4021684548211845008">フォーカス モードでサウンド再生を無効にする。</translation> <translation id="4025500273782820766">外部プロトコル ダイアログが表示されたときに、ユーザーが [常に許可] を選択して、それ以降の確認メッセージをスキップできるようにする</translation> @@ -4617,6 +4620,7 @@ ポリシーの値は日数で指定します。</translation> <translation id="4525328580251166229">Bruschetta サブシステムに関連するポリシーを制御します。</translation> +<translation id="4528981768990874684"><ph name="IP_PROTECTION_NAME" /> 機能を無効にする。</translation> <translation id="453031441196755904">このポリシーはサポートを終了しました。</translation> <translation id="4531706050939927436">Android アプリを強制的にインストールするには、Google 管理コンソールで Google Play からのインストールを指定します。Android アプリでこのポリシーは使用されません。</translation> <translation id="4534500438517478692">Android の制限名:</translation> @@ -7308,6 +7312,22 @@ 生成 AI 機能のデータ処理について詳しくは、https://support.google.com/chrome/a?p=generative_ai_settings をご覧ください。</translation> <translation id="6394350458541421998">このポリシーは <ph name="PRODUCT_OS_NAME" /> バージョン 29 で廃止されました。PresentationScreenDimDelayScale ポリシーを代わりに使用してください。</translation> +<translation id="6397424663361748439"><ph name="PRIVACY_SANDBOX_NAME" /> の <ph name="IP_PROTECTION_NAME" /> 機能を有効にするかどうかを管理するポリシーです。 + +<ph name="IP_PROTECTION_NAME" /> はシークレット モードでのブラウジング中に、特定のサードパーティのネットワーク リクエストに対して、ユーザーの元の IP アドレスの使用を制限する機能です。これにより、シークレット モードのブラウジング セッションでクロスサイト トラッキングに対する保護が強化されます。 + +このポリシーを無効に設定した場合、<ph name="IP_PROTECTION_NAME" /> は無効になり、ユーザーは UI 設定でこの機能を有効にできなくなります。 +このポリシーを有効に設定した場合、<ph name="IP_PROTECTION_NAME" /> は有効になり、ユーザーは UI 設定でこの機能を無効にできなくなります。 +このポリシーを未設定のままにした場合、<ph name="IP_PROTECTION_NAME" /> はデフォルトで有効になり、ユーザーはデバイスの UI 設定でこの機能を制御できるようになります。 + +企業で <ph name="IP_PROTECTION_NAME" /> を無効にするかどうかを検討する際は、次のような点を考慮します。 +- プロキシされるリクエストに対して DNS ルックアップは実行されません。このため、DNS ベースのモニタリングやフィルタリングに影響する可能性があります。 +- Masked Domain List(<ph name="MASKED_DOMAIN_LIST_URL" />)のドメイン(またはそのサブドメイン)へのリクエスト送信が必要で、送信元を特定の IP アドレス範囲に制限している企業アプリケーションの場合、シークレット モードで使用すると機能しない可能性があります。- 特定の条件下では、シークレット モードでトラフィックがプロキシされない場合があります。たとえば、ユーザーがログインしていない Chrome プロフィールでシークレット モードを開始した場合などです。通常、この機能では、シークレット モードを開始するときに、ユーザーが個人の Google アカウントで Chrome にログインしていることが必要となります。 +- Masked Domain List のドメインリストは今後変更される可能性があり、変更された場合はユーザーに自動的にプッシュされます。Masked Domain List について詳しくは、<ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" /> をご覧ください。 + +<ph name="IP_PROTECTION_NAME" /> について詳しくは、<ph name="IP_PROTECTION_README_URL" /> をご覧ください。 + +<ph name="IP_PROTECTION_NAME" /> は M139 以降にリリースされます。</translation> <translation id="6397588391180665797">登録済みデバイスのユーザーのネットワーク設定を報告します。 このポリシーを false に設定した場合、この情報は報告されません。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index f1cb385..7e0805f 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -2330,6 +2330,7 @@ <translation id="2652747206827086936">NTP SharePoint 및 OneDrive 파일 카드 사용 중지</translation> <translation id="2656559539624760733">Chrome Root Store를 사용하지 않습니다.</translation> <translation id="2658653824183107970">새 <ph name="CORS" /> 대신 기존 <ph name="CORS" /> 구현 사용</translation> +<translation id="2659581762274047663"><ph name="PRODUCT_NAME" /> 서비스를 사용 설정합니다.</translation> <translation id="2660846099862559570">프록시 사용하지 않음</translation> <translation id="2661628029848851543">관리 계정의 모든 사용 허용</translation> <translation id="2664391398878045611">가운데 슬롯을 사용할 수 있어도 새 탭 페이지에서 알림 표시 안함</translation> @@ -2969,6 +2970,7 @@ <translation id="3143203373436771188"><ph name="BASIC_EDITOR_NAME" />에서 처리하는 Office 문서로 이동할 때 <ph name="BASIC_EDITOR_NAME" />에서 열기</translation> <translation id="3144173889708944482"><ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />에 <ph name="PRINTERS_BLOCKLIST" />을 선택할 경우 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />를 설정하면 사용자가 사용할 수 없는 프린터가 지정됩니다. ID가 이 정책에 명시된 프린터를 제외한 모든 프린터가 사용자에게 제공됩니다. ID는 <ph name="DEVICE_PRINTERS_POLICY_NAME" />에 지정된 파일의 <ph name="ID_FIELD" /> 또는 <ph name="GUID_FIELD" /> 필드와 일치해야 합니다.</translation> <translation id="3146711617256415776">텍스트 읽어주기 사용 시 향상된 네트워크 텍스트 음성 변환 음성을 허용하지 않음</translation> +<translation id="315013437951136266"><ph name="IP_PROTECTION_NAME" /> 기능을 사용 설정합니다.</translation> <translation id="3150351525324499342">기본적으로 툴바에 <ph name="PRODUCT_NAME" /> 아이콘이 표시되지 않지만 사용자가 선택하도록 허용</translation> <translation id="3152135410085709340">로컬 파일이 PDF 뷰어에서 사이트의 file:// URL에 액세스하도록 허용</translation> <translation id="3152425128389603870">통합 바탕화면을 기본적으로 허용하고 사용 설정합니다.</translation> @@ -4183,6 +4185,7 @@ 두 정책은 모두 사용될 수 있지만 이 정책은 곧 지원 중단되므로 <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> 정책을 사용하는 것이 좋습니다. 브라우저의 동작에 미치는 영향은 둘 다 동일합니다.</translation> <translation id="4016700865356669962">정책을 사용으로 설정하면 사용자가 데스크톱 레이아웃 템플릿을 사용할 수 있습니다. 정책을 사용 중지로 설정하거나 설정하지 않으면 템플릿을 사용할 수 없습니다.</translation> +<translation id="4018536413833147396">사용자가 기기에서 <ph name="IP_PROTECTION_NAME" /> 설정을 사용 또는 사용 중지하도록 허용합니다. 이 기능은 기본적으로 사용 설정되어 있습니다.</translation> <translation id="4020682745012723568">사용자의 프로필로 전송된 쿠키는 Android 앱에 액세스할 수 없습니다.</translation> <translation id="4021684548211845008">집중 모드에서 사운드 사용 중지</translation> <translation id="4025500273782820766">향후 확인 메시지를 건너뛰는 외부 프로토콜 대화상자가 표시될 때 사용자가 '항상 허용'을 선택하도록 허용</translation> @@ -4671,6 +4674,7 @@ 정책을 Disabled로 설정하면 사용자가 PDF 플러그인을 사용 중지하지 않는 한 PDF 플러그인에서 PDF 파일을 엽니다. 정책을 설정하면 사용자가 <ph name="PRODUCT_NAME" />에서 정책을 변경할 수 없습니다. 설정하지 않으면 사용자가 외부에서 PDF를 열지를 선택할 수 있습니다.</translation> +<translation id="4413764344717830250">관리 브라우저의 새 탭 페이지에서 확장 프로그램 저작자를 표시할지를 제어합니다.</translation> <translation id="4415603335307944578">이 정책이 true로 설정되거나 설정되지 않으면 OS 업그레이드 후 처음 실행할 때 브라우저가 시작 페이지를 다시 표시합니다. 이 정책이 false로 설정되면 OS 업그레이드 후 처음 실행할 때 브라우저가 시작 페이지를 다시 표시하지 않습니다.</translation> @@ -4793,6 +4797,7 @@ 정책 값은 일 단위로 지정해야 합니다.</translation> <translation id="4525328580251166229">Bruschetta 하위 시스템과 관련된 정책을 관리합니다.</translation> +<translation id="4528981768990874684"><ph name="IP_PROTECTION_NAME" /> 기능을 사용 중지합니다.</translation> <translation id="453031441196755904">지원 중단된 정책입니다.</translation> <translation id="4531706050939927436">Google Play를 사용해 Google 관리 콘솔에서 Android 앱을 강제 설치할 수 있습니다. Android 앱은 이 정책을 사용하지 않습니다.</translation> <translation id="4534500438517478692">Android 제한 이름:</translation> @@ -6601,6 +6606,11 @@ <translation id="5670249935663090320">정책을 사용 설정하거나 설정하지 않은 상태로 두면 <ph name="PRODUCT_NAME" />가 사용 설정되며 사용자가 앱 메뉴, 페이지 컨텍스트 메뉴, Cast 지원 웹사이트의 미디어 컨트롤, Cast 툴바 아이콘(표시되는 경우)을 통해 실행할 수 있습니다. 정책을 사용 중지하면 <ph name="PRODUCT_NAME" />가 사용 중지됩니다.</translation> +<translation id="5671392367521500075">이 정책은 NTP가 확장 프로그램에 의해 제어될 때 새 탭 페이지(NTP)의 바닥글에 확장 프로그램 저작자를 표시할지를 제어합니다. 기본적으로 NTP 바닥글에는 NTP를 제어하는 확장 프로그램에 대한 정보가 표시됩니다. + +정책을 설정하지 않거나 true로 설정하면 확장 프로그램으로 제어되는 NTP가 있는 브라우저에 확장 프로그램 이름과 링크가 표시됩니다. + +정책을 false로 설정하면 확장 프로그램 속성이 숨겨집니다.</translation> <translation id="5673254755365419402"><ph name="PRIVACY_SANDBOX_NAME" /> 디지털 지문 수집 보호 기능을 사용 설정합니다.</translation> <translation id="567377007899266033">정책을 True로 설정하면 정책에 의해 실행된 확장 프로그램 설치 중에 발생한 중요 이벤트의 보고서를 Google로 전송합니다. False로 설정하면 이벤트가 캡처되지 않습니다. 정책이 설정되지 않으면 기본값이 True로 설정됩니다.</translation> <translation id="5673780539191375049"><ph name="PRODUCT_OS_NAME" /> 기기에서 사용자의 인증 흐름을 자동으로 새로고침하는 데 사용되는 시간 간격(분)을 설정합니다. 이 정책은 기기가 한동안 유휴 상태일 때 인증 흐름에 사용되는 일부 서비스의 만료를 처리하기 위해 도입되었습니다. @@ -7678,6 +7688,23 @@ 생성형 AI 기능의 데이터 처리에 관한 자세한 내용은 https://support.google.com/chrome/a?p=generative_ai_settings 페이지를 참고하세요.</translation> <translation id="6394350458541421998">이 정책은 <ph name="PRODUCT_OS_NAME" /> 버전 29를 기준으로 지원 중단되었습니다. 대신 PresentationScreenDimDelayScale 정책을 사용해 주시기 바랍니다.</translation> +<translation id="6397424663361748439"><ph name="PRIVACY_SANDBOX_NAME" /> <ph name="IP_PROTECTION_NAME" /> 기능의 사용 설정 여부를 제어하는 정책입니다. + +<ph name="IP_PROTECTION_NAME" /> 기능은 시크릿 모드에서 탐색하는 동안 발생하는 특정 서드 파티 네트워크 요청에 대해 사용자의 원래 IP 주소의 사용 가능 여부를 제한하여, 시크릿 모드 탐색 세션 중 크로스 사이트 추적에 대한 보호를 강화합니다. + +정책을 '사용 안함'으로 설정하면 <ph name="IP_PROTECTION_NAME" /> 기능이 사용 중지되며 사용자가 UI 설정을 통해 이 기능을 사용 설정할 수 없게 됩니다. +정책을 '사용'으로 설정하면 <ph name="IP_PROTECTION_NAME" /> 기능이 사용 설정되며 사용자가 UI 설정을 통해 이 기능을 사용 중지할 수 없게 됩니다. +정책을 설정하지 않으면 <ph name="IP_PROTECTION_NAME" /> 기능이 기본적으로 사용 설정되며 사용자가 UI 설정을 통해 기기에서 이 기능을 제어할 수 있습니다. + +기업에서 <ph name="IP_PROTECTION_NAME" /> 기능을 사용 중지할지 여부를 결정할 때 고려해야 할 사항은 다음과 같습니다. +- 프록시된 요청에 대해 DNS 조회가 수행되지 않으며, 이는 DNS 기반 모니터링 또는 필터링에 영향을 미칠 수 있습니다. +- 엔터프라이즈 애플리케이션이 마스크된 도메인 목록(<ph name="MASKED_DOMAIN_LIST_URL" />)에 포함된 도메인(또는 해당 도메인의 하위 도메인)에 대한 요청에 의존하고, 해당 요청이 특정 IP 주소 범위에서 이루어져야 하는 경우, 시크릿 모드에서 애플리케이션이 제대로 작동하지 않을 수 있습니다. +- 특정 조건에서는 시크릿 모드에서 트래픽이 프록시되지 않을 수 있습니다(예: 사용자가 로그인하지 않은 Chrome 프로필에서 시크릿 모드를 실행하는 경우). 일반적으로 이 기능을 사용하려면 시크릿 모드를 실행할 때 사용자가 개인 Google 계정으로 Chrome에 로그인한 상태여야 합니다. +- 마스크된 도메인 목록의 도메인 목록은 시간이 지남에 따라 변경될 수 있으며, 새 버전은 사용자에게 자동으로 푸시됩니다. 마스크된 도메인 목록에 관한 자세한 내용은 <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" /> 페이지를 참고하세요. + +<ph name="IP_PROTECTION_NAME" />에 대한 자세한 내용은 <ph name="IP_PROTECTION_README_URL" /> 페이지를 참조하세요. + +<ph name="IP_PROTECTION_NAME" /> 기능은 M139 이후에 출시될 예정입니다.</translation> <translation id="6397588391180665797">등록된 기기에서 사용자 네트워크 구성을 보고합니다. 정책을 False로 설정하면 정보가 보고되지 않습니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 0b4e612..fe06560 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -2309,6 +2309,7 @@ <translation id="2652747206827086936">Kaart SharePoint- en OneDrive-bestand uitzetten op de pagina Nieuw tabblad</translation> <translation id="2656559539624760733">De Chrome Root Store niet gebruiken.</translation> <translation id="2658653824183107970">De verouderde <ph name="CORS" />-implementatie in plaats van de nieuwe <ph name="CORS" /> gebruiken</translation> +<translation id="2659581762274047663">Service <ph name="PRODUCT_NAME" /> aanzetten</translation> <translation id="2660846099862559570">Nooit een proxy gebruiken</translation> <translation id="2661628029848851543">Alle typen gebruik van beheerde accounts zijn toegestaan</translation> <translation id="2664391398878045611">De pagina Nieuw tabblad toont de aankondiging in de middelste ruimte niet, ook niet als die beschikbaar is</translation> @@ -2945,6 +2946,7 @@ <translation id="3143203373436771188">Office-documenten die worden verwerkt door de <ph name="BASIC_EDITOR_NAME" />, openen in de <ph name="BASIC_EDITOR_NAME" /> als je ernaartoe navigeert</translation> <translation id="3144173889708944482">Als <ph name="PRINTERS_BLOCKLIST" /> wordt gekozen voor <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, kun je door <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> in te stellen aangeven welke printers gebruikers niet kunnen gebruiken. Alle printers zijn beschikbaar voor gebruikers, behalve de ID's in dit beleid. De ID's moeten overeenkomen met het veld <ph name="ID_FIELD" /> of <ph name="GUID_FIELD" /> in het bestand dat is opgegeven in <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation> <translation id="3146711617256415776">Stemmen voor verbeterde tekst-naar-spraak via netwerk niet toestaan bij gebruik van Selecteer om voor te lezen</translation> +<translation id="315013437951136266">Zet de functie <ph name="IP_PROTECTION_NAME" /> aan.</translation> <translation id="3150351525324499342">Het icoon voor <ph name="PRODUCT_NAME" /> niet standaard tonen in de werkbalk, maar gebruikers laten kiezen</translation> <translation id="3152135410085709340">Lokale bestandstoegang tot file://-URL's op deze sites toestaan in de pdf-viewer</translation> <translation id="3152425128389603870">Maak Samengestelde desktop beschikbaar en zet deze standaard aan</translation> @@ -4134,6 +4136,7 @@ Beide beleidsregels kunnen worden gebruikt, maar dit beleid wordt binnenkort beëindigd. Daarom heeft het beleid <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> de voorkeur. Ze hebben beide hetzelfde effect op het gedrag van de browser.</translation> <translation id="4016700865356669962">Als je het beleid toepast, kunnen gebruikers templates voor bureaubladindelingen gebruiken. Als je het beleid niet toepast of niet instelt, zijn deze templates niet beschikbaar.</translation> +<translation id="4018536413833147396">Toestaan dat gebruikers de instelling <ph name="IP_PROTECTION_NAME" /> aan- of uitzetten op hun apparaat. De functie wordt standaard aangezet.</translation> <translation id="4020682745012723568">Cookies die worden overgedragen naar het profiel van de gebruiker, zijn niet toegankelijk voor Android-apps.</translation> <translation id="4021684548211845008">Geluiden in Focusmodus uitzetten.</translation> <translation id="4025500273782820766">Sta toe dat gebruikers 'Altijd toestaan' selecteren als een dialoogvenster voor externe protocollen wordt getoond om toekomstige bevestigingsprompts over te slaan</translation> @@ -4731,6 +4734,7 @@ De beleidswaarde moet worden opgegeven in dagen.</translation> <translation id="4525328580251166229">Beheert de beleidsregels met betrekking tot het Bruschetta-subsysteem.</translation> +<translation id="4528981768990874684">Zet de functie <ph name="IP_PROTECTION_NAME" /> uit.</translation> <translation id="453031441196755904">Dit beleid is beëindigd.</translation> <translation id="4531706050939927436">De installatie van Android-apps kan via de Google Admin Console worden afgedwongen door gebruik te maken van Google Play. Deze apps gebruiken dit beleid niet.</translation> <translation id="4534500438517478692">Naam Android-beperking:</translation> @@ -7549,6 +7553,23 @@ Ga naar https://support.google.com/chrome/a?p=generative_ai_settings voor meer informatie over gegevensverwerking voor generatieve AI-functies.</translation> <translation id="6394350458541421998">Dit beleid wordt niet meer gebruikt sinds <ph name="PRODUCT_OS_NAME" /> versie 29. Gebruik het beleid PresentationScreenDimDelayScale.</translation> +<translation id="6397424663361748439">Beleid om te bepalen of de functie <ph name="IP_PROTECTION_NAME" /> van <ph name="PRIVACY_SANDBOX_NAME" /> moet worden aangezet. + +<ph name="IP_PROTECTION_NAME" /> is een functie die de beschikbaarheid van het oorspronkelijke IP-adres van een gebruiker beperkt voor bepaalde netwerkverzoeken van derden die worden gedaan terwijl de gebruiker in de incognitomodus browst. Hiermee wordt de beveiliging tegen cross-site tracking verbeterd tijdens incognitosessies. + +Als je het beleid niet toepast, wordt <ph name="IP_PROTECTION_NAME" /> uitgezet en kunnen gebruikers de functie niet aanzetten via de UI-instellingen. +Als je het beleid toepast, wordt <ph name="IP_PROTECTION_NAME" /> aangezet en kunnen gebruikers de functie niet uitzetten via de UI-instellingen. +Als je het beleid niet instelt, wordt <ph name="IP_PROTECTION_NAME" /> standaard aangezet en kunnen gebruikers de functie op hun apparaat beheren via de UI-instellingen. + +Enkele overwegingen voor bedrijven die <ph name="IP_PROTECTION_NAME" /> willen uitzetten: +- DNS-lookups worden niet uitgevoerd voor verzoeken die via een proxy worden gestuurd. Dit kan van invloed zijn op op DNS gebaseerde monitoring of filtering. +- Bedrijfsapps werken misschien niet goed als ze worden gebruikt in de incognitomodus als ze afhankelijk zijn van verzoeken naar domeinen (of subdomeinen van die domeinen) op de lijst met gemaskeerde domeinen (<ph name="MASKED_DOMAIN_LIST_URL" />) en als die verzoeken afkomstig moeten zijn van specifieke IP-adresbereiken. +- Verkeer wordt in de incognitomodus onder bepaalde omstandigheden misschien niet via een proxy gestuurd, bijvoorbeeld als gebruikers de incognitomodus starten vanuit een Chrome-profiel waarmee ze niet zijn ingelogd. Over het algemeen moet de gebruiker zijn ingelogd bij Chrome met een persoonlijk Google-account als die de incognitomodus start. +- De lijst met domeinen op de lijst met gemaskeerde domeinen kan in de loop van de tijd veranderen. Nieuwe versies worden automatisch naar gebruikers gestuurd. Ga naar <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" /> voor meer informatie over de lijst met gemaskeerde domeinen. + +Ga naar <ph name="IP_PROTECTION_README_URL" /> voor meer informatie over <ph name="IP_PROTECTION_NAME" />. + +<ph name="IP_PROTECTION_NAME" /> wordt niet eerder gelanceerd dan in M139.</translation> <translation id="6397588391180665797">De netwerkconfiguratie van gebruikers op ingeschreven apparaten rapporteren. Als je het beleid instelt op False, worden de gegevens niet gerapporteerd.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 034718e..f305a7a 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -4818,6 +4818,7 @@ Se ela for desativada, os arquivos PDF serão abertos no plug-in, a menos que ele seja desativado pelos usuários. Se você definir a política, os usuários não poderão mudá-la no <ph name="PRODUCT_NAME" />. Se ela não for definida, os usuários poderão escolher se os PDFs serão ou não abertos externamente.</translation> +<translation id="4413764344717830250">Controlar a visibilidade da atribuição da extensão na página "Nova guia" para navegadores gerenciados</translation> <translation id="4415603335307944578">Se esta política for definida como verdadeira ou não for configurada, o navegador mostrará novamente a página de recepção na primeira execução após um upgrade do SO. Se esta política for definida como falsa, o navegador não mostrará novamente a página de recepção na primeira execução após um upgrade do SO.</translation> @@ -6780,6 +6781,11 @@ <translation id="5670249935663090320">Se a política for definida como ativada ou não for definida, o <ph name="PRODUCT_NAME" /> será ativado e poderá ser iniciado pelos usuários no menu de apps, nos menus de contexto da página, nos controles de mídia em sites compatíveis com o Cast e no ícone da barra de ferramentas do Google Cast (se for exibido). Se a política for definida como desativada, o <ph name="PRODUCT_NAME" /> será desativado.</translation> +<translation id="5671392367521500075">Esta política controla a visibilidade da atribuição da extensão no rodapé da página "Nova guia" quando uma extensão controla essa página. Por padrão, o rodapé da página "Nova guia" exibe informações sobre a extensão que controla essa página. + +Se esta política for deixada sem definição ou for definida como "true", os navegadores com uma página "Nova guia" controlada por uma extensão vão mostrar o nome da extensão e um link para ela. + +Se esta política for definida como "false", a atribuição da extensão será ocultada.</translation> <translation id="5673254755365419402">Ativar o recurso Proteção contra técnicas de impressão digital do <ph name="PRIVACY_SANDBOX_NAME" />.</translation> <translation id="567377007899266033">Se a política for definida como verdadeira, o Google receberá relatórios sobre eventos importantes e acionados por políticas relacionados à instalação de extensões. Se a política for definida como falsa, nenhum evento será capturado. Se ela não for definida, o valor padrão será verdadeiro.</translation> <translation id="5673780539191375049">Define o intervalo de tempo (em minutos) usado para atualizar automaticamente o fluxo de autenticação do usuário no dispositivo <ph name="PRODUCT_OS_NAME" />. Esta política é introduzida para processar a validade de alguns serviços usados em fluxos de autenticação quando o dispositivo fica inativo por algum tempo.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 53421b0..7fa46c8 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -2313,6 +2313,7 @@ <translation id="2652747206827086936">Отключить карточку файлов NTP SharePoint и OneDrive</translation> <translation id="2656559539624760733">Не использовать Chrome Root Store</translation> <translation id="2658653824183107970">Приоритет устаревшей версии <ph name="CORS" /> перед новой реализацией <ph name="CORS" /></translation> +<translation id="2659581762274047663">Включить сервис "<ph name="PRODUCT_NAME" />"</translation> <translation id="2660846099862559570">Никогда не использовать прокси-сервер</translation> <translation id="2661628029848851543">Все виды использования управляемых аккаунтов разрешены</translation> <translation id="2664391398878045611">На странице быстрого доступа не будет показываться сообщение в среднем слоте, даже если оно доступно</translation> @@ -2951,6 +2952,7 @@ <translation id="3143203373436771188">Открывать документы Office, обрабатываемые приложением "<ph name="BASIC_EDITOR_NAME" />", в приложении "<ph name="BASIC_EDITOR_NAME" />"</translation> <translation id="3144173889708944482">Если в правиле <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> задан параметр <ph name="PRINTERS_BLOCKLIST" />, правило <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> определяет принтеры, с которыми не может работать пользователь. Пользователям запрещено работать только с теми принтерами, идентификаторы которых указаны в правиле. Эти идентификаторы должны соответствовать значениям полей <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" /> в файле, указанном в правиле <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation> <translation id="3146711617256415776">Функции "Озвучивание при нажатии" запрещено преобразовывать текст в речь через сервис Enhanced Network</translation> +<translation id="315013437951136266">Включить функцию "<ph name="IP_PROTECTION_NAME" />"</translation> <translation id="3150351525324499342">Не показывать значок <ph name="PRODUCT_NAME" /> на панели инструментов по умолчанию, но разрешить пользователям его добавлять</translation> <translation id="3152135410085709340">Разрешить указанным сайтам доступ к локальным файлам по URL с протоколом file:// в средстве просмотра PDF-файлов</translation> <translation id="3152425128389603870">Включить режим единого рабочего стола и установить его по умолчанию</translation> @@ -4141,6 +4143,7 @@ Можно выбрать любое из них, однако рекомендуется использовать <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />, так как поддержка FirstPartySetsEnabled скоро будет прекращена. Оба правила оказывают один и тот же эффект на работу браузера.</translation> <translation id="4016700865356669962">Если правило включено, пользователи могут применять шаблоны для рабочего стола. Если правило отключено или не настроено, такие шаблоны будут недоступны.</translation> +<translation id="4018536413833147396">Позволить пользователям включать и отключать функцию "<ph name="IP_PROTECTION_NAME" />" на устройствах (по умолчанию она будет включена)</translation> <translation id="4020682745012723568">Приложения Android не могут получить доступ к файлам cookie, перенесенным в профиль пользователя.</translation> <translation id="4021684548211845008">Отключить звуки в режиме концентрации внимания</translation> <translation id="4025500273782820766">Пользователи могут выбрать вариант "Разрешать всегда" в окне с запросом на запуск внешнего протокола, чтобы в дальнейшем не получать такие запросы</translation> @@ -4613,6 +4616,7 @@ Если правило отключено, для просмотра PDF-файлов используется плагин PDF (если он не отключен пользователем). Если правило настроено, пользователь не может изменить его в <ph name="PRODUCT_NAME" />. Если правило не настроено, пользователь может самостоятельно выбирать, как открывать PDF-файлы.</translation> +<translation id="4413764344717830250">Показ сведений о расширении на странице быстрого доступа в управляемых браузерах</translation> <translation id="4415603335307944578">Если задано значение True или правило не настроено, при первом запуске браузера после обновления системы будет снова показана стартовая страница. Если указано значение False, после обновления системы стартовая страница не появится.</translation> @@ -4735,6 +4739,7 @@ Значение для правила указывается в днях.</translation> <translation id="4525328580251166229">Правило позволяет управлять правилами, связанными с подсистемой Bruschetta.</translation> +<translation id="4528981768990874684">Отключить функцию "<ph name="IP_PROTECTION_NAME" />"</translation> <translation id="453031441196755904">Правило устарело.</translation> <translation id="4531706050939927436">Приложения Android можно принудительно установить через консоль администратора Google, скачав их из Google Play. Это правило приложениями не используется.</translation> <translation id="4534500438517478692">Название ограничения для Android:</translation> @@ -6519,6 +6524,11 @@ <translation id="5670249935663090320">Если правило включено или не настроено, будет задействована технология <ph name="PRODUCT_NAME" />. Ее можно активировать через меню приложения, контекстное меню страницы, элементы управления медиаконтентом на сайтах с поддержкой Cast или при помощи значка трансляции на панели инструментов (если он есть). Если правило отключено, технология <ph name="PRODUCT_NAME" /> использоваться не будет.</translation> +<translation id="5671392367521500075">Правило позволяет настроить, нужно ли показывать в нижнем колонтитуле страницы быстрого доступа сведения о расширении, которым она управляется. По умолчанию эти данные видны в ее нижнем колонтитуле. + +Если правило не настроено или задано значение True, в браузере со страницей быстрого доступа, управляемой расширением, показаны название расширения и ссылка на него. + +Если выбрано значение False, они будут скрыты.</translation> <translation id="5673254755365419402">Включить защиту от создания цифровых отпечатков, которую обеспечивает <ph name="PRIVACY_SANDBOX_NAME" /></translation> <translation id="567377007899266033">Если задано значение True, в Google отправляются отчеты об основных событиях установки расширений, которая была выполнена в соответствии с каким-либо правилом. Если указано значение False, события не регистрируются. Если правило не настроено, для него по умолчанию устанавливается значение True.</translation> <translation id="5673780539191375049">Устанавливает временной интервал в минутах, по прошествии которого процесс аутентификации пользователя на устройстве с <ph name="PRODUCT_OS_NAME" /> автоматически перезапускается. Это правило позволяет возобновлять работу некоторых сервисов, используемых для аутентификации, когда срок их активности истекает при бездействии устройства. @@ -7595,6 +7605,23 @@ Подробнее о том, как обрабатываются данные при использовании функций на основе генеративного ИИ: https://support.google.com/chrome/a?p=generative_ai_settings.</translation> <translation id="6394350458541421998">Это правило не поддерживается в <ph name="PRODUCT_OS_NAME" /> версии 29 и будет исключено из более поздних версий. Вместо него используйте правило PresentationScreenDimDelayScale.</translation> +<translation id="6397424663361748439">Это правило управляет функцией "<ph name="IP_PROTECTION_NAME" />" из <ph name="PRIVACY_SANDBOX_NAME" />. + +Функция "<ph name="IP_PROTECTION_NAME" />" позволяет не передавать подлинный IP-адрес пользователя в ответ на сетевой запрос некоторых третьих сторон при работе в режиме инкогнито. Это усиливает защиту от межсайтового отслеживания. + +Если правило отключено, <ph name="IP_PROTECTION_NAME" /> не работает и пользователи не могут включить ее в настройках. +Если оно включено, <ph name="IP_PROTECTION_NAME" /> активирована и ее нельзя отключить через пользовательский интерфейс. +Если правило не настроено, <ph name="IP_PROTECTION_NAME" /> включена по умолчанию и пользователи могут отключить ее в настройках на своих устройствах. + +Некоторые причины, почему компаниям может быть лучше отключить функцию "<ph name="IP_PROTECTION_NAME" />": +- DNS-запросы через прокси-серверы не выполняются, отчего может нарушиться мониторинг или фильтрация на основе DNS. +- Корпоративные приложения, запущенные в режиме инкогнито, могут не работать, если они отправляют запросы доменам или субдоменам из списка деиндентифицированных доменов (<ph name="MASKED_DOMAIN_LIST_URL" />) и требуется, чтобы эти запросы исходили от IP-адресов в определенных диапазонах. +- При определенных условиях трафик в режиме инкогнито не проходит через прокси-сервер, например когда пользователь включает режим инкогнито, не войдя в профиль Chrome. Обычно для работы этой функции нужно, чтобы пользователь, запускающий режим инкогнито, вошел в Chrome с личным аккаунтом Google. +- Список деиндентифицированных доменов может меняться, и новые версии передаются пользователям автоматически. Чтобы узнать больше о списке деидентифицированных доменов, перейдите по ссылке <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />. + +Подробнее о функции "<ph name="IP_PROTECTION_NAME" />": <ph name="IP_PROTECTION_README_URL" />. + +Планируется, что <ph name="IP_PROTECTION_NAME" /> появится в версии M139.</translation> <translation id="6397588391180665797">Позволяет настроить отправку информации о конфигурации сети на зарегистрированных устройствах. Если указано значение False, эти сведения отправляться не будут.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 7eccd63f..7dc50c9a 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -2314,6 +2314,7 @@ <translation id="2652747206827086936">ปิดใช้การ์ดไฟล์ SharePoint และ OneDrive ของ NTP</translation> <translation id="2656559539624760733">ไม่ใช้ Chrome Root Store</translation> <translation id="2658653824183107970">ควรใช้การใช้งาน <ph name="CORS" /> เดิมมากกว่า <ph name="CORS" /> ใหม่</translation> +<translation id="2659581762274047663">เปิดใช้บริการ <ph name="PRODUCT_NAME" /></translation> <translation id="2660846099862559570">ไม่ใช้พร็อกซี</translation> <translation id="2661628029848851543">ระบบจะอนุญาตการใช้งานทั้งหมดของบัญชีที่จัดการ</translation> <translation id="2664391398878045611">หน้าแท็บใหม่จะไม่แสดงประกาศในช่องกลางแม้ว่าจะมีประกาศ</translation> @@ -2950,6 +2951,7 @@ <translation id="3143203373436771188">เมื่อไปยังเอกสาร Office ที่จัดการโดย <ph name="BASIC_EDITOR_NAME" /> ให้เปิดเอกสารเหล่านั้นใน <ph name="BASIC_EDITOR_NAME" /></translation> <translation id="3144173889708944482">หากมีการเลือก <ph name="PRINTERS_BLOCKLIST" /> ไว้สำหรับ <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> การตั้งค่า <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> จะระบุเครื่องพิมพ์ที่ผู้ใช้จะใช้ไม่ได้ เครื่องพิมพ์ทั้งหมดจะพร้อมให้ผู้ใช้นำมาใช้งาน ยกเว้นเครื่องที่มีรหัสตามที่ระบุไว้ในนโยบายนี้ รหัสดังกล่าวต้องตรงกับช่อง <ph name="ID_FIELD" /> หรือ <ph name="GUID_FIELD" /> ในไฟล์ที่ระบุไว้ใน <ph name="DEVICE_PRINTERS_POLICY_NAME" /></translation> <translation id="3146711617256415776">ไม่อนุญาตเสียงของการอ่านออกเสียงข้อความของเครือข่ายที่ปรับปรุงเมื่อใช้ "เลือกเพื่อให้อ่าน"</translation> +<translation id="315013437951136266">เปิดใช้ฟีเจอร์ <ph name="IP_PROTECTION_NAME" /></translation> <translation id="3150351525324499342">ไม่แสดงไอคอน "<ph name="PRODUCT_NAME" />" ในแถบเครื่องมือโดยค่าเริ่มต้น แต่ให้ผู้ใช้เลือก</translation> <translation id="3152135410085709340">อนุญาตให้เข้าถึงไฟล์ในเครื่องผ่าน URL รูปแบบ file:// ในโปรแกรมอ่าน PDF สำหรับเว็บไซต์เหล่านี้</translation> <translation id="3152425128389603870">ทำให้เดสก์ท็อปแบบรวมหลายหน้าจอพร้อมใช้งานและเปิดใช้โดยค่าเริ่มต้น</translation> @@ -4138,6 +4140,7 @@ ระบบอาจใช้นโยบายใดนโยบายหนึ่ง แต่นโยบายนี้จะเลิกใช้งานในอีกไม่ช้า เราจึงขอแนะนำให้ใช้นโยบาย <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> มากกว่า นโยบายทั้งสองมีผลต่อลักษณะการทำงานของเบราว์เซอร์เหมือนกัน</translation> <translation id="4016700865356669962">การตั้งค่านโยบายเป็น "เปิดใช้" ทำให้ผู้ใช้ใช้เทมเพลตเลย์เอาต์เดสก์ท็อปได้ การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าหมายความว่าเทมเพลตเหล่านี้จะไม่พร้อมใช้งาน</translation> +<translation id="4018536413833147396">อนุญาตให้ผู้ใช้เปิดหรือปิดการตั้งค่า <ph name="IP_PROTECTION_NAME" /> ในอุปกรณ์ได้ ฟีเจอร์นี้จะเปิดใช้อยู่โดยค่าเริ่มต้น</translation> <translation id="4020682745012723568">แอป Android ไม่สามารถเข้าถึงคุกกี้ที่โอนไปยังโปรไฟล์ของผู้ใช้</translation> <translation id="4021684548211845008">ปิดเสียงในโหมดโฟกัส</translation> <translation id="4025500273782820766">อนุญาตให้ผู้ใช้เลือก "อนุญาตเสมอ" เมื่อมีการแสดงกล่องโต้ตอบของโปรโตคอลภายนอกให้ข้ามข้อความแจ้งยืนยันในอนาคต</translation> @@ -4739,6 +4742,7 @@ ควรระบุค่าของนโยบายเป็นวัน</translation> <translation id="4525328580251166229">ควบคุมนโยบายที่เกี่ยวข้องกับระบบย่อย Bruschetta</translation> +<translation id="4528981768990874684">ปิดใช้ฟีเจอร์ <ph name="IP_PROTECTION_NAME" /></translation> <translation id="453031441196755904">นโยบายนี้เลิกใช้งานแล้ว</translation> <translation id="4531706050939927436">สามารถบังคับการติดตั้งแอป Android ได้จากคอนโซล Google Admin ผ่าน Google Play แอปดังกล่าวไม่ได้ใช้นโยบายนี้</translation> <translation id="4534500438517478692">ชื่อการจำกัด Android:</translation> @@ -7558,6 +7562,23 @@ ดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการข้อมูลสำหรับฟีเจอร์ Generative AI ได้ที่ https://support.google.com/chrome/a?p=generative_ai_settings</translation> <translation id="6394350458541421998">นโยบายนี้ได้ถูกยกเลิกไปตั้งแต่ <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 29 โปรดใช้นโยบาย PresentationScreenDimDelayScale แทน</translation> +<translation id="6397424663361748439">นโยบายสำหรับควบคุมว่าควรเปิดใช้ฟีเจอร์ <ph name="IP_PROTECTION_NAME" /> ของ <ph name="PRIVACY_SANDBOX_NAME" /> หรือไม่ + +<ph name="IP_PROTECTION_NAME" /> เป็นฟีเจอร์ที่จำกัดความพร้อมใช้งานในที่อยู่ IP เดิมของผู้ใช้สําหรับคำขอเครือข่ายของบุคคลที่สามบางรายการที่ดำเนินการขณะท่องเว็บในโหมดไม่ระบุตัวตน ซึ่งจะช่วยเพิ่มการป้องกันการติดตามข้ามเว็บไซต์ในระหว่างเซสชันการท่องเว็บแบบไม่ระบุตัวตน + +หากตั้งค่านโยบายเป็น "ปิดใช้" ระบบจะปิดใช้ <ph name="IP_PROTECTION_NAME" /> และผู้ใช้จะเปิดฟีเจอร์ดังกล่าวผ่านการตั้งค่า UI ไม่ได้ +หากตั้งค่านโยบายเป็น "เปิดใช้" ระบบจะเปิดใช้ <ph name="IP_PROTECTION_NAME" /> และผู้ใช้จะปิดฟีเจอร์ดังกล่าวผ่านการตั้งค่า UI ไม่ได้ +หากไม่ได้ตั้งค่านโยบายไว้ ระบบจะเปิดใช้ <ph name="IP_PROTECTION_NAME" /> โดยค่าเริ่มต้นและผู้ใช้จะควบคุมฟีเจอร์ในอุปกรณ์ผ่านการตั้งค่า UI ได้ + +ข้อควรพิจารณาบางประการเกี่ยวกับว่าองค์กรควรปิดใช้ <ph name="IP_PROTECTION_NAME" /> หรือไม่ ได้แก่ +- ระบบจะไม่ทำ DNS Lookup สำหรับคำขอที่ใช้พร็อกซี ซึ่งอาจส่งผลต่อการตรวจสอบหรือกรองตาม DNS +- แอปพลิเคชันระดับองค์กรอาจหยุดทำงานเมื่อใช้ในโหมดไม่ระบุตัวตน หากแอปพลิเคชันดังกล่าวใช้คำขอไปยังโดเมน (หรือโดเมนย่อยของโดเมนเหล่านั้น) ในรายการโดเมนที่มาสก์ (<ph name="MASKED_DOMAIN_LIST_URL" />) และกำหนดให้คำขอดังกล่าวมาจากช่วงที่อยู่ IP ที่เฉพาะเจาะจง +- อาจไม่มีการใช้พร็อกซีกับการเข้าชมในโหมดไม่ระบุตัวตนภายใต้เงื่อนไขบางประการ เช่น เมื่อผู้ใช้เปิดโหมดไม่ระบุตัวตนจากโปรไฟล์ Chrome ที่ไม่ได้ลงชื่อเข้าใช้ โดยปกติแล้วฟีเจอร์นี้กำหนดให้ผู้ใช้ต้องลงชื่อเข้าใช้ Chrome ด้วยบัญชี Google ส่วนบุคคลเมื่อเปิดตัวโหมดไม่ระบุตัวตน +- รายการโดเมนในรายการโดเมนที่มาสก์อาจเปลี่ยนแปลงเมื่อเวลาผ่านไป โดยระบบจะส่งเวอร์ชันใหม่ไปยังผู้ใช้โดยอัตโนมัติ ดูข้อมูลเพิ่มเติมเกี่ยวกับรายการโดเมนที่มาสก์ได้ที่ <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" /> + +ดูข้อมูลเพิ่มเติมเกี่ยวกับ <ph name="IP_PROTECTION_NAME" /> ได้ที่ <ph name="IP_PROTECTION_README_URL" /> + +<ph name="IP_PROTECTION_NAME" /> อาจเปิดตัวใน M139 หรือหลังจากนั้น</translation> <translation id="6397588391180665797">รายงานการกำหนดค่าเครือข่ายของผู้ใช้ในอุปกรณ์ที่ลงทะเบียนไว้ หากตั้งค่านโยบายเป็น "เท็จ" จะไม่มีการรายงานข้อมูล
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 5313cd4..65c679f8 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -2345,6 +2345,7 @@ <translation id="2652747206827086936">Вимкнути картку файлів SharePoint і OneDrive на сторінці нової вкладки</translation> <translation id="2656559539624760733">Не використовувати Chrome Root Store.</translation> <translation id="2658653824183107970">Використовувати для <ph name="CORS" />застаріле застосування <ph name="CORS" />, а не нове</translation> +<translation id="2659581762274047663">Увімкнення сервісу "<ph name="PRODUCT_NAME" />"</translation> <translation id="2660846099862559570">Ніколи не використовувати проксі-сервер</translation> <translation id="2661628029848851543">Усі способи використання керованих облікових записів дозволено</translation> <translation id="2664391398878045611">На сторінці нової вкладки не з’являтиметься оголошення в центрі, навіть якщо воно доступне</translation> @@ -2983,6 +2984,7 @@ <translation id="3143203373436771188">Відкривати документи Office, які обробляє <ph name="BASIC_EDITOR_NAME" />, у редакторі <ph name="BASIC_EDITOR_NAME" /></translation> <translation id="3144173889708944482">Якщо для правила <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> вибрано параметр <ph name="PRINTERS_BLOCKLIST" />, тоді налаштування <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> визначає, які принтери не можна використовувати. Користувачам недоступні лише принтери з переліченими в правилі ідентифікаторами. Ідентифікатори мають відповідати полю <ph name="ID_FIELD" /> або <ph name="GUID_FIELD" /> у файлі, указаному в правилі <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation> <translation id="3146711617256415776">Заборонити покращені голоси для синтезу мовлення через мережу під час використання функції "Читання з екрана"</translation> +<translation id="315013437951136266">Увімкнути функцію "<ph name="IP_PROTECTION_NAME" />".</translation> <translation id="3150351525324499342">Не показувати значок функції <ph name="PRODUCT_NAME" /> за умовчанням на панелі інструментів, але дозволити користувачам вибирати</translation> <translation id="3152135410085709340">Дозволити цим сайтам доступ до локальних файлів із URL-адресами типу file:// у засобі перегляду PDF-файлів</translation> <translation id="3152425128389603870">За умовчанням робити доступним і вмикати уніфікований режим робочого стола</translation> @@ -4180,6 +4182,7 @@ Це правило працює так само, як і правило <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />. Хоча вони мають однаковий вплив на роботу веб-переглядача, радимо віддати перевагу <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" />, оскільки це правило незабаром буде вилучено.</translation> <translation id="4016700865356669962">Якщо ввімкнути це правило, користувачі зможуть застосовувати варіанти макета робочого столу. Якщо його вимкнути або не налаштувати, ці макети будуть недоступні.</translation> +<translation id="4018536413833147396">Дозволити користувачам вмикати й вимикати на своїх пристроях функцію "<ph name="IP_PROTECTION_NAME" />". Цю функцію буде ввімкнено за умовчанням.</translation> <translation id="4020682745012723568">Додатки Android не мають доступу до файлів cookie, перенесених у профіль користувача.</translation> <translation id="4021684548211845008">Вимкнути звуки в Режимі концентрації уваги.</translation> <translation id="4025500273782820766">Дозволити користувачам вибирати опцію "Завжди дозволяти", коли з'являється вікно зовнішнього протоколу, щоб не отримувати такі запити в майбутньому</translation> @@ -4653,6 +4656,7 @@ Якщо вимкнути це правило, файли PDF відкриватимуться через внутрішній плагін (за умови, що користувачі його не вимкнуть). Якщо налаштувати це правило, користувачі не зможуть змінювати його в <ph name="PRODUCT_NAME" />. Якщо правило не налаштувати, користувачі зможуть самі вибирати, чи відкривати файли PDF у зовнішньому додатку.</translation> +<translation id="4413764344717830250">Визначає, чи потрібно показувати атрибути розширення на сторінці нової вкладки в керованих вебпереглядачах</translation> <translation id="4415603335307944578">Якщо для цього правила вибрано значення true або його не налаштовано, веб-переглядач показує сторінку привітання під час першого запуску після оновлення ОС. Якщо для цього правила вибрано значення false, веб-переглядач не показує сторінку привітання під час першого запуску після оновлення ОС.</translation> @@ -4775,6 +4779,7 @@ Значення правила вказується в днях.</translation> <translation id="4525328580251166229">Керує правилами для підсистеми Bruschetta.</translation> +<translation id="4528981768990874684">Вимкнути функцію "<ph name="IP_PROTECTION_NAME" />".</translation> <translation id="453031441196755904">Це правило не підтримується.</translation> <translation id="4531706050939927436">Додатки Android можна примусово встановити з консолі адміністратора Google через Google Play. Вони не використовують це правило.</translation> <translation id="4534500438517478692">Назва обмеження для Android:</translation> @@ -6569,6 +6574,11 @@ <translation id="5670249935663090320">Якщо це правило ввімкнути або не налаштувати, активується функція <ph name="PRODUCT_NAME" />, яку користувачі можуть запустити з меню додатка, контекстних меню на сторінці, елементів керування медіаконтентом на веб-сайтах із підтримкою Google Cast, а також через значок на панелі інструментів Cast (якщо відображається). Якщо це правило вимкнути, функція <ph name="PRODUCT_NAME" /> деактивується.</translation> +<translation id="5671392367521500075">Це правило визначає, чи потрібно показувати атрибути розширення, яке керує сторінкою нової вкладки, у її нижньому колонтитулі. За умовчанням у нижньому колонтитулі сторінки нової вкладки відображається інформація про розширення, яке нею керує. + +Якщо це правило не налаштувати або вибрати для нього значення "правда", на сторінці нової вкладки, якою керує розширення, показуватиметься його назва й посилання на нього. + +Якщо для цього правила вибрати значення "неправда", атрибути розширення буде приховано.</translation> <translation id="5673254755365419402">Увімкнути функцію захисту відбитків пальця <ph name="PRIVACY_SANDBOX_NAME" />.</translation> <translation id="567377007899266033">Якщо для цього правила вибрано значення True, у Google надсилатимуться звіти про основні події під час встановлень розширень, які було активовано правилом. Якщо для цього правила вибрано значення False, події не реєструватимуться. Якщо це правило не налаштовано, значенням за умовчанням буде вибрано True.</translation> <translation id="5673780539191375049">За допомогою цього правила можна встановити інтервал часу (у хвилинах), після якого процедура автентифікації на пристрої <ph name="PRODUCT_OS_NAME" /> користувача автоматично перезапускатиметься. Це правило дає змогу керувати завершенням строку дії деяких сервісів, що використовуються під час автентифікації, якщо пристрій певний час неактивний. @@ -7662,6 +7672,23 @@ Щоб дізнатися більше про обробку даних для функцій на основі генеративного ШІ, перейдіть на сторінку https://support.google.com/chrome/a?p=generative_ai_settings.</translation> <translation id="6394350458541421998">Це правило не підтримується від 29-ї версії <ph name="PRODUCT_OS_NAME" />. Натомість використовуйте правило PresentationScreenDimDelayScale.</translation> +<translation id="6397424663361748439">За допомогою цього правила можна керувати функцією "<ph name="IP_PROTECTION_NAME" />" у <ph name="PRIVACY_SANDBOX_NAME" />. + +<ph name="IP_PROTECTION_NAME" /> – це функція, яка обмежує доступ до вихідної IP-адреси користувача для певних запитів сторонніх мереж, здійснених в анонімному режимі, і підвищує рівень захисту від міжсайтового відстеження під час сеансів анонімного перегляду. + +Якщо вимкнути це правило, функцію "<ph name="IP_PROTECTION_NAME" />" буде деактивовано й користувачі не зможуть увімкнути її в параметрах інтерфейсу. +Якщо ввімкнути це правило, функцію "<ph name="IP_PROTECTION_NAME" />" буде активовано й користувачі не зможуть вимкнути її в параметрах інтерфейсу. +Якщо це правило не налаштувати, функцію "<ph name="IP_PROTECTION_NAME" />" буде активовано за умовчанням, і користувачі зможуть керувати нею на своїх пристроях у параметрах інтерфейсу. + +Перш ніж вимикати функцію "<ph name="IP_PROTECTION_NAME" />", рекомендуємо компаніям ознайомитися з наведеною нижче інформацією. +– DNS-запити через проксі-сервери не виконуватимуться, що може вплинути на моніторинг або фільтрування на основі DNS. +– Корпоративні додатки можуть працювати неправильно в анонімному режимі, якщо вони надсилають запити до доменів, які входять до списку замаскованих (<ph name="MASKED_DOMAIN_LIST_URL" />), або піддоменів таких доменів і вимагають, щоб ці запити надходили з певних діапазонів IP-адрес. +– Трафік може не надсилатися через проксі-сервери в анонімному режимі за певних умов, наприклад коли користувачі запускають анонімний режим із профілю Chrome, у який не ввійшли. Щоб застосувати цю функцію, користувач має ввійти в Chrome за допомогою особистого облікового запису Google, коли запускає анонімний режим. +– Перелік доменів у списку замаскованих може змінюватись із часом, а його нові версії автоматично надсилатимуться користувачам. Щоб дізнатися більше про список замаскованих доменів, перейдіть за цим посиланням: <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />. + +Докладнішу інформацію про функцію "<ph name="IP_PROTECTION_NAME" />" можна переглянути на сторінці <ph name="IP_PROTECTION_README_URL" />. + +Функцію "<ph name="IP_PROTECTION_NAME" />" буде запущено не раніше ніж у версії M139.</translation> <translation id="6397588391180665797">Визначає, чи надсилати дані про конфігурацію мережі користувачів на зареєстрованих пристроях. Якщо для цього правила вибрати значення false, інформація не надсилатиметься.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 9b0d435..e1e83b8 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -2332,6 +2332,7 @@ <translation id="2652747206827086936">Tắt Thẻ tệp SharePoint và OneDrive trên NTP</translation> <translation id="2656559539624760733">Không sử dụng Chrome Root Store.</translation> <translation id="2658653824183107970">Sử dụng quy trình triển khai <ph name="CORS" /> cũ thay vì <ph name="CORS" /> mới</translation> +<translation id="2659581762274047663">Bật dịch vụ <ph name="PRODUCT_NAME" /></translation> <translation id="2660846099862559570">Không bao giờ sử dụng proxy</translation> <translation id="2661628029848851543">Cho phép mọi cách sử dụng tài khoản được quản lý</translation> <translation id="2664391398878045611">Thông báo giữa trang sẽ không xuất hiện trên trang Thẻ mới ngay cả khi có</translation> @@ -2969,6 +2970,7 @@ <translation id="3143203373436771188">Khi chuyển đến tài liệu Office do <ph name="BASIC_EDITOR_NAME" /> xử lý thì mở các tài liệu đó trong <ph name="BASIC_EDITOR_NAME" /></translation> <translation id="3144173889708944482">Nếu bạn chọn <ph name="PRINTERS_BLOCKLIST" /> cho <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, thì việc đặt <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> sẽ chỉ định những máy in mà người dùng không thể sử dụng. Tất cả máy in sẽ được cung cấp cho người dùng, ngoại trừ những mã nhận dạng được liệt kê trong chính sách này. Các mã nhận dạng này phải tương ứng với trường <ph name="ID_FIELD" /> hoặc <ph name="GUID_FIELD" /> ở tệp được chỉ định trong <ph name="DEVICE_PRINTERS_POLICY_NAME" />.</translation> <translation id="3146711617256415776">Không cho phép dùng các giọng nói của tính năng chuyển văn bản sang lời nói trên mạng nâng cao khi dùng tính năng Chọn để nói</translation> +<translation id="315013437951136266">Bật tính năng <ph name="IP_PROTECTION_NAME" />.</translation> <translation id="3150351525324499342">Không hiển thị biểu tượng <ph name="PRODUCT_NAME" /> trên thanh công cụ theo mặc định mà để người dùng chọn</translation> <translation id="3152135410085709340">Cho phép truy cập tệp cục bộ vào URL file:// trên các trang web này trong Trình xem PDF</translation> <translation id="3152425128389603870">Cho phép Màn hình hợp nhất và chính sách này bật theo mặc định.</translation> @@ -4191,6 +4193,7 @@ Bạn có thể sử dụng một trong hai chính sách nhưng chính sách này sắp không được dùng nữa nên chính sách <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> sẽ được ưu tiên sử dụng. Cả hai có tác động như nhau đối với hành vi của trình duyệt.</translation> <translation id="4016700865356669962">Khi bạn bật chính sách này, người dùng sẽ được phép sử dụng các mẫu bố cục màn hình. Khi bạn tắt hoặc không đặt chính sách này thì các mẫu đó sẽ không dùng được.</translation> +<translation id="4018536413833147396">Cho phép người dùng bật hoặc tắt chế độ cài đặt <ph name="IP_PROTECTION_NAME" /> trên thiết bị của họ. Tính năng này sẽ được bật theo mặc định.</translation> <translation id="4020682745012723568">Cookie được chuyển tới hồ sơ của người dùng không thể truy cập vào các ứng dụng Android.</translation> <translation id="4021684548211845008">Tắt âm thanh ở Chế độ tập trung.</translation> <translation id="4025500273782820766">Cho phép người dùng chọn "Luôn cho phép" khi hộp thoại giao thức bên ngoài hiển thị để bỏ qua những lời nhắc xác nhận trong tương lai</translation> @@ -4816,6 +4819,7 @@ Bạn phải chỉ định giá trị của chính sách bằng ngày.</translation> <translation id="4525328580251166229">Kiểm soát các chính sách liên quan đến hệ thống con Bruschetta.</translation> +<translation id="4528981768990874684">Tắt tính năng <ph name="IP_PROTECTION_NAME" />.</translation> <translation id="453031441196755904">Chính sách này không còn dùng nữa.</translation> <translation id="4531706050939927436">Các ứng dụng Android có thể bị buộc cài đặt từ Bảng điều khiển dành cho quản trị viên của Google bằng Google Play. Các ứng dụng đó không sử dụng chính sách này.</translation> <translation id="4534500438517478692">Tên giới hạn Android:</translation> @@ -7754,6 +7758,23 @@ Để biết thêm thông tin về cách xử lý dữ liệu cho các tính năng AI tạo sinh, vui lòng truy cập https://support.google.com/chrome/a?p=generative_ai_settings.</translation> <translation id="6394350458541421998">Chính sách này đã chấm dứt kể từ phiên bản <ph name="PRODUCT_OS_NAME" /> 29. Vui lòng sử dụng chính sách PresentationScreenDimDelayScale thay vào đó.</translation> +<translation id="6397424663361748439">Đây là chính sách kiểm soát việc có bật tính năng <ph name="PRIVACY_SANDBOX_NAME" /> <ph name="IP_PROTECTION_NAME" /> hay không. + +<ph name="IP_PROTECTION_NAME" /> là một tính năng giúp hạn chế hiển thị địa chỉ IP gốc của người dùng đối với một số yêu cầu mạng nhất định của bên thứ ba khi duyệt web ở chế độ ẩn danh, giúp tăng khả năng bảo vệ chống theo dõi trên nhiều trang web trong các phiên duyệt web ở chế độ ẩn danh. + +Nếu bạn đặt chính sách này thành Tắt, <ph name="IP_PROTECTION_NAME" /> sẽ bị tắt và người dùng sẽ không thể bật tính năng này thông qua cài đặt giao diện người dùng. +Nếu bạn đặt chính sách này thành Bật, <ph name="IP_PROTECTION_NAME" /> sẽ được bật và người dùng sẽ không thể tắt tính năng này thông qua cài đặt giao diện người dùng. +Nếu bạn không đặt chính sách này, <ph name="IP_PROTECTION_NAME" /> sẽ được bật theo mặc định và người dùng có thể kiểm soát tính năng này trên thiết bị của họ thông qua cài đặt giao diện người dùng. + +Một số yếu tố cần cân nhắc liên quan đến việc doanh nghiệp có nên tắt <ph name="IP_PROTECTION_NAME" /> hay không: +– Tra cứu DNS sẽ không được thực hiện đối với các yêu cầu được chuyển tiếp qua proxy, điều này có thể ảnh hưởng đến việc giám sát hoặc lọc dựa trên DNS. +– Các ứng dụng doanh nghiệp có thể bị gián đoạn khi được dùng ở chế độ ẩn danh nếu chúng phụ thuộc vào yêu cầu đến các miền (hoặc miền con của những miền đó) nằm trong Danh sách miền bị ẩn (<ph name="MASKED_DOMAIN_LIST_URL" />) và đòi hỏi những yêu cầu đó phải đến từ các dải địa chỉ IP cụ thể. +– Lưu lượng truy cập có thể không được chuyển tiếp qua proxy ở chế độ ẩn danh trong một số điều kiện nhất định, chẳng hạn như khi người dùng khởi chạy chế độ ẩn danh từ một hồ sơ Chrome mà họ chưa đăng nhập. Nói chung, tính năng này đòi hỏi người dùng phải đăng nhập vào Chrome bằng tài khoản Google cá nhân khi khởi chạy chế độ ẩn danh. +- Danh sách miền trong Danh sách miền bị ẩn có thể thay đổi theo thời gian, và các phiên bản mới sẽ được tự động chuyển đến người dùng. Để biết thêm thông tin về Danh sách miền bị ẩn, truy cập: <ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />. + +Để biết thêm thông tin về <ph name="IP_PROTECTION_NAME" />, truy cập: <ph name="IP_PROTECTION_README_URL" />. + +<ph name="IP_PROTECTION_NAME" /> sẽ được ra mắt sớm nhất vào phiên bản M139.</translation> <translation id="6397588391180665797">Báo cáo cho người dùng về cấu hình mạng trên các thiết bị đã đăng ký. Nếu bạn tắt chính sách này thì hệ thống sẽ không báo cáo thông tin.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 3fc742f7..0bbe306 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -2301,6 +2301,7 @@ <translation id="2652747206827086936">停用 NTP SharePoint 和 OneDrive 文件卡片</translation> <translation id="2656559539624760733">不使用 Chrome 根存储区。</translation> <translation id="2658653824183107970">使用旧版 <ph name="CORS" /> 实现方案(而非新版 <ph name="CORS" />)</translation> +<translation id="2659581762274047663">启用 <ph name="PRODUCT_NAME" /> Service</translation> <translation id="2660846099862559570">从不使用代理</translation> <translation id="2661628029848851543">允许受管理的账号的所有使用情况</translation> <translation id="2664391398878045611">“新标签页”页面将不会显示中间槽通知(即使有)</translation> @@ -2937,6 +2938,7 @@ <translation id="3143203373436771188">找到由<ph name="BASIC_EDITOR_NAME" />处理的 Office 文档后,在<ph name="BASIC_EDITOR_NAME" />中打开它们</translation> <translation id="3144173889708944482">如果为 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 选择了 <ph name="PRINTERS_BLOCKLIST" />,您便可通过设置 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> 来指定用户不能使用哪些打印机。除了与此政策中所列 ID 对应的打印机之外,其他所有打印机都可供用户使用。ID 必须与 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 所指定文件内的<ph name="ID_FIELD" />或<ph name="GUID_FIELD" />字段相符。</translation> <translation id="3146711617256415776">不允许在使用“随选朗读”功能时使用增强型网络文字转语音的语音</translation> +<translation id="315013437951136266">启用 <ph name="IP_PROTECTION_NAME" />功能。</translation> <translation id="3150351525324499342">默认情况下不在工具栏中显示 <ph name="PRODUCT_NAME" /> 图标,但允许用户选择是否显示</translation> <translation id="3152135410085709340">允许这些网站使用 PDF 查看器对 file:// 网址进行本地文件访问</translation> <translation id="3152425128389603870">使“统一桌面”功能可供用户使用,并使其在默认情况下处于启用状态</translation> @@ -4122,6 +4124,7 @@ 您可在这两项政策中任选其一,但此政策很快就会被弃用,所以您应首选 <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> 政策。 这两者对浏览器行为的影响相同。</translation> <translation id="4016700865356669962">如果此政策已启用,用户便能使用桌面布局模板。如果此政策已停用或未设置,则意味着这些模板不可用。</translation> +<translation id="4018536413833147396">允许用户在其设备上开启或关闭 <ph name="IP_PROTECTION_NAME" />设置。该功能默认处于启用状态。</translation> <translation id="4020682745012723568">Android 应用无法访问已转移到用户个人资料中的 Cookie。</translation> <translation id="4021684548211845008">禁止在专注模式下播放音乐。</translation> <translation id="4025500273782820766">允许用户在系统显示外部协议对话框时选择“始终允许”,以跳过后续的确认提示</translation> @@ -4719,6 +4722,7 @@ 此政策的值应以天为单位。</translation> <translation id="4525328580251166229">控制与 Bruschetta 子系统相关的政策。</translation> +<translation id="4528981768990874684">停用 <ph name="IP_PROTECTION_NAME" />功能。</translation> <translation id="453031441196755904">此政策已被弃用。</translation> <translation id="4531706050939927436">您可以通过 Google Play 从 Google 管理控制台中强制安装 Android 应用。这些应用不会使用此政策。</translation> <translation id="4534500438517478692">Android 限制名称:</translation> @@ -7536,6 +7540,23 @@ 如需详细了解生成式 AI 功能的数据处理机制,请访问 https://support.google.com/chrome/a?p=generative_ai_settings。</translation> <translation id="6394350458541421998">此政策从 <ph name="PRODUCT_OS_NAME" />版本 29 起开始弃用。请改用 PresentationScreenDimDelayScale 政策。</translation> +<translation id="6397424663361748439">此政策用于控制是否应启用 <ph name="PRIVACY_SANDBOX_NAME" /> <ph name="IP_PROTECTION_NAME" />功能。 + +<ph name="IP_PROTECTION_NAME" />功能可限制用户在无痕模式下浏览时发出的某些第三方网络请求使用用户的原始 IP 地址,从而加强无痕模式浏览会话期间的跨网站跟踪防护。 + +如果已停用此政策,<ph name="IP_PROTECTION_NAME" />将停用,而且用户无法通过界面设置启用此功能。 +如果已启用此政策,<ph name="IP_PROTECTION_NAME" />将会启用,而且用户无法通过界面设置停用此功能。 +如果未设置此政策,<ph name="IP_PROTECTION_NAME" />将默认处于启用状态,而且用户将能够在其设备上通过界面设置控制此功能。 + +关于企业是否应停用 <ph name="IP_PROTECTION_NAME" />的注意事项包括: +- 对于通过代理传输的请求,系统不会执行 DNS 查找,这可能会影响基于 DNS 的监控或过滤。 +- 如果企业应用依赖于对掩码网域列表 (<ph name="MASKED_DOMAIN_LIST_URL" />) 中的某些网域(或这些网域的子网域)的请求,并且要求这些请求来自特定 IP 地址范围,那么在无痕模式下使用时,这些应用可能会出现功能异常。 +- 在特定条件下,无痕模式下的流量可能不会通过代理传输,例如当用户通过未登录的 Chrome 个人资料启动无痕模式时。一般来说,此功能要求用户在启动无痕模式时,已使用个人 Google 账号登录 Chrome。 +- 掩码网域列表中的网域可能会随时间更新,新版本会自动推送给用户。如需详细了解掩码网域列表,请参阅:<ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />。 + +如需详细了解 <ph name="IP_PROTECTION_NAME" />,请参阅:<ph name="IP_PROTECTION_README_URL" />。 + +<ph name="IP_PROTECTION_NAME" />最快会在 M139 中推出。</translation> <translation id="6397588391180665797">报告已注册的设备上的用户网络配置。 如果此政策设为 false,系统将不会报告这些信息。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index bd669be..bfc9ed0 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -2272,6 +2272,7 @@ <translation id="2652747206827086936">停用 NTP SharePoint 和 OneDrive 檔案資訊卡</translation> <translation id="2656559539624760733">不要使用 Chrome Root Store。</translation> <translation id="2658653824183107970">使用舊版 <ph name="CORS" /> 模式,而不使用新版 <ph name="CORS" /></translation> +<translation id="2659581762274047663">啟用<ph name="PRODUCT_NAME" />服務</translation> <translation id="2660846099862559570">永不使用 Proxy</translation> <translation id="2661628029848851543">允許受管理帳戶的所有使用情況</translation> <translation id="2664391398878045611">即使中間版位公告可供存取,新分頁也不會顯示</translation> @@ -2892,6 +2893,7 @@ <translation id="3143203373436771188">瀏覽由<ph name="BASIC_EDITOR_NAME" />處理的 Office 文件時,在<ph name="BASIC_EDITOR_NAME" />中開啟文件</translation> <translation id="3144173889708944482">如果在 <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> 中選擇了 <ph name="PRINTERS_BLOCKLIST" />,系統會根據 <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> 的設定指定使用者不能操作的印表機。除了這項政策所列 ID 的印表機外,其他印表機皆可供使用。印表機 ID 必須與 <ph name="DEVICE_PRINTERS_POLICY_NAME" /> 政策指定檔案的 <ph name="ID_FIELD" /> 或 <ph name="GUID_FIELD" /> 欄位值相符。</translation> <translation id="3146711617256415776">禁止在使用隨選朗讀時使用加強型網路文字轉語音功能</translation> +<translation id="315013437951136266">啟用 <ph name="IP_PROTECTION_NAME" />功能。</translation> <translation id="3150351525324499342">預設不在工具列顯示 <ph name="PRODUCT_NAME" /> 圖示,但允許使用者選擇</translation> <translation id="3152135410085709340">允許這些網站在 PDF 檢視器中存取本機的 file:// 網址</translation> <translation id="3152425128389603870">允許使用整合桌面並預設為啟用。</translation> @@ -4058,6 +4060,7 @@ 這項政策與 <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> 政策相同,系統可能會使用其中一項,但前者將在不久後淘汰,因此建議使用 <ph name="RELATED_WEBSITE_SETS_ENABLED_POLICY_NAME" /> 政策。 上述兩項政策對瀏覽器行為的影響效力相同。</translation> <translation id="4016700865356669962">如果將這項政策設為 Enabled,使用者就能使用桌面版面配置範本。如果將這項政策設為 Disabled 或不設定,則會導致使用者無法使用這些範本。</translation> +<translation id="4018536413833147396">允許使用者在裝置上開啟或關閉 <ph name="IP_PROTECTION_NAME" />設定。這項功能將預設為啟用。</translation> <translation id="4020682745012723568">Android 應用程式無法存取傳輸到該使用者設定檔的 Cookie。</translation> <translation id="4021684548211845008">禁止在專注模式下播放任何音效。</translation> <translation id="4025500273782820766">如有外部通訊協定對話方塊詢問使用者是否要略過日後的確認提示,允許使用者選取 [一律允許]</translation> @@ -4652,6 +4655,7 @@ 指定政策值時需以天為單位。</translation> <translation id="4525328580251166229">控管 Bruschetta 子系統的相關政策。</translation> +<translation id="4528981768990874684">停用 <ph name="IP_PROTECTION_NAME" />功能。</translation> <translation id="453031441196755904">這項政策已遭到淘汰。</translation> <translation id="4531706050939927436">你可以在 Google 管理控制台中使用 Google Play 強制安裝 Android 應用程式 (不會使用這項政策)。</translation> <translation id="4534500438517478692">Android 限制名稱:</translation> @@ -7434,6 +7438,23 @@ 如要進一步瞭解生成式 AI 功能的資料處理方式,請前往 https://support.google.com/chrome/a?p=generative_ai_settings。</translation> <translation id="6394350458541421998">我們已於 <ph name="PRODUCT_OS_NAME" />版本 29 中移除這項政策。請改用 PresentationScreenDimDelayScale 政策。</translation> +<translation id="6397424663361748439">這項政策控管是否應啟用 <ph name="PRIVACY_SANDBOX_NAME" /> <ph name="IP_PROTECTION_NAME" />功能。 + +<ph name="IP_PROTECTION_NAME" />功能可控管在無痕模式下瀏覽時,是否要針對某些第三方網路要求提供使用者的原始 IP 位址,加強防範無痕瀏覽工作階段的跨網站追蹤。 + +如果將這項政策設為停用,系統會停用 <ph name="IP_PROTECTION_NAME" />功能,而且使用者無法透過使用者介面設定啟用。 +如果將這項政策設為啟用,系統會啟用 <ph name="IP_PROTECTION_NAME" />功能,而且使用者無法透過使用者介面設定停用。 +如果未設定這項政策,系統會預設啟用 <ph name="IP_PROTECTION_NAME" />功能,使用者可透過裝置上的使用者介面設定控制這項功能。 + +考量企業是否應停用 <ph name="IP_PROTECTION_NAME" />功能時,請留意以下事項: +- 系統不會為經由 Proxy 傳送的要求執行 DNS 查詢,這可能會影響以 DNS 為依據的監控或篩選作業。 +- 如果企業應用程式需要向「已加遮罩的網域清單」(<ph name="MASKED_DOMAIN_LIST_URL" />) 中的網域 (或相關子網域) 提出要求,且這些要求必須來自特定 IP 位址範圍,使用者可能會在無痕模式下遇到應用程式故障的問題。 +- 在某些情況下,系統可能不會在無痕模式中透過 Proxy 處理流量,例如使用者透過未登入的 Chrome 設定檔啟動無痕模式時。一般來說,使用者必須先以個人 Google 帳戶登入 Chrome,才能啟動無痕模式。 +- 已加遮罩的網域清單可能會隨時間變動,系統會自動向使用者推送新版本。如要進一步瞭解已加遮罩的網域清單,請參閱:<ph name="MASKED_DOMAIN_LIST_CRITERIA_URL" />。 + +如要進一步瞭解 <ph name="IP_PROTECTION_NAME" />功能,請參閱:<ph name="IP_PROTECTION_README_URL" />。 + +<ph name="IP_PROTECTION_NAME" />功能最快會在 M139 推出。</translation> <translation id="6397588391180665797">回報已註冊裝置上的使用者網路設定。 如果將這項政策設為 False,系統不會回報這項資訊。
diff --git a/components/power_bookmarks/storage/power_bookmark_sync_bridge.cc b/components/power_bookmarks/storage/power_bookmark_sync_bridge.cc index ed27e71..2f6280e 100644 --- a/components/power_bookmarks/storage/power_bookmark_sync_bridge.cc +++ b/components/power_bookmarks/storage/power_bookmark_sync_bridge.cc
@@ -79,12 +79,12 @@ } std::string PowerBookmarkSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return entity_data.specifics.power_bookmark().guid(); } std::string PowerBookmarkSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); }
diff --git a/components/power_bookmarks/storage/power_bookmark_sync_bridge.h b/components/power_bookmarks/storage/power_bookmark_sync_bridge.h index 83b302df..2b6afd7 100644 --- a/components/power_bookmarks/storage/power_bookmark_sync_bridge.h +++ b/components/power_bookmarks/storage/power_bookmark_sync_bridge.h
@@ -82,8 +82,10 @@ std::optional<syncer::ModelError> ApplyIncrementalSyncChanges( std::unique_ptr<syncer::MetadataChangeList> metadata_change_list, syncer::EntityChangeList entity_changes) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override;
diff --git a/components/reading_list/core/reading_list_sync_bridge.cc b/components/reading_list/core/reading_list_sync_bridge.cc index 002f559..117cd4c 100644 --- a/components/reading_list/core/reading_list_sync_bridge.cc +++ b/components/reading_list/core/reading_list_sync_bridge.cc
@@ -299,13 +299,13 @@ } std::string ReadingListSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return GetStorageKey(entity_data); } std::string ReadingListSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return entity_data.specifics.reading_list().entry_id(); }
diff --git a/components/reading_list/core/reading_list_sync_bridge.h b/components/reading_list/core/reading_list_sync_bridge.h index e007556d..2acc1946 100644 --- a/components/reading_list/core/reading_list_sync_bridge.h +++ b/components/reading_list/core/reading_list_sync_bridge.h
@@ -146,7 +146,8 @@ // it is also used to verify the hash of remote data. If a data type was never // launched pre-USS, then method does not need to be different from // GetStorageKey(). - std::string GetClientTag(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; // Get or generate a storage key for |entity_data|. This will only ever be // called once when first encountering a remote entity. Local changes will @@ -154,7 +155,8 @@ // Theoretically this function doesn't need to be stable across multiple calls // on the same or different clients, but to keep things simple, it probably // should be. - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; // Invoked when sync is permanently stopped. void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList>
diff --git a/components/safe_browsing/core/common/features.cc b/components/safe_browsing/core/common/features.cc index adf345b..3a169c6c 100644 --- a/components/safe_browsing/core/common/features.cc +++ b/components/safe_browsing/core/common/features.cc
@@ -330,13 +330,13 @@ BASE_FEATURE(kShowWarningsForSuspiciousNotifications, "ShowWarningsForSuspiciousNotifications", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); constexpr base::FeatureParam<int> kShowWarningsForSuspiciousNotificationsScoreThreshold{ &kShowWarningsForSuspiciousNotifications, "ShowWarningsForSuspiciousNotificationsScoreThreshold", - /*default_value=*/100}; + /*default_value=*/90}; constexpr base::FeatureParam<bool> kShowWarningsForSuspiciousNotificationsShouldSwapButtons{
diff --git a/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.cc b/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.cc index 00845fb5..ca6d6a6 100644 --- a/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.cc +++ b/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.cc
@@ -357,12 +357,12 @@ } std::string SavedTabGroupSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return entity_data.specifics.saved_tab_group().guid(); } std::string SavedTabGroupSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); }
diff --git a/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.h b/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.h index 9120744..fef80f39 100644 --- a/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.h +++ b/components/saved_tab_groups/internal/saved_tab_group_sync_bridge.h
@@ -68,8 +68,10 @@ syncer::ConflictResolution ResolveConflict( const std::string& storage_key, const syncer::EntityData& remote_data) const override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override;
diff --git a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc index d90a3940..cb0adc0 100644 --- a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc +++ b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.cc
@@ -261,14 +261,14 @@ } std::string SharedTabGroupAccountDataSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return GetClientTagFromSpecifics( entity_data.specifics.shared_tab_group_account_data()); } std::string SharedTabGroupAccountDataSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return GetClientTag(entity_data); }
diff --git a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.h b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.h index f483f0a1..f5183ae 100644 --- a/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.h +++ b/components/saved_tab_groups/internal/shared_tab_group_account_data_sync_bridge.h
@@ -49,8 +49,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; bool SupportsGetClientTag() const override; bool SupportsGetStorageKey() const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList>
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 48d8a6f0..be00ce82 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
@@ -759,14 +759,14 @@ } std::string SharedTabGroupDataSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { CHECK(entity_data.collaboration_metadata.has_value()); return entity_data.specifics.shared_tab_group_data().guid() + "|" + entity_data.collaboration_metadata->collaboration_id().value(); } std::string SharedTabGroupDataSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return entity_data.specifics.shared_tab_group_data().guid(); }
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h index 1d9c0f5b..3bdd7d3 100644 --- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h +++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.h
@@ -77,8 +77,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; bool SupportsGetClientTag() const override; bool SupportsGetStorageKey() const override; bool SupportsIncrementalUpdates() const override;
diff --git a/components/send_tab_to_self/send_tab_to_self_bridge.cc b/components/send_tab_to_self/send_tab_to_self_bridge.cc index 43af5069..67462922 100644 --- a/components/send_tab_to_self/send_tab_to_self_bridge.cc +++ b/components/send_tab_to_self/send_tab_to_self_bridge.cc
@@ -239,12 +239,12 @@ } std::string SendTabToSelfBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string SendTabToSelfBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return entity_data.specifics.send_tab_to_self().guid(); }
diff --git a/components/send_tab_to_self/send_tab_to_self_bridge.h b/components/send_tab_to_self/send_tab_to_self_bridge.h index 44cbfff..cb171be 100644 --- a/components/send_tab_to_self/send_tab_to_self_bridge.h +++ b/components/send_tab_to_self/send_tab_to_self_bridge.h
@@ -70,8 +70,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/components/sharing_message/sharing_message_bridge_impl.cc b/components/sharing_message/sharing_message_bridge_impl.cc index 32fa590..8ce5d21f 100644 --- a/components/sharing_message/sharing_message_bridge_impl.cc +++ b/components/sharing_message/sharing_message_bridge_impl.cc
@@ -175,12 +175,12 @@ } std::string SharingMessageBridgeImpl::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string SharingMessageBridgeImpl::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_sharing_message()); return entity_data.specifics.sharing_message().message_id(); }
diff --git a/components/sharing_message/sharing_message_bridge_impl.h b/components/sharing_message/sharing_message_bridge_impl.h index 48727de..b3272b1 100644 --- a/components/sharing_message/sharing_message_bridge_impl.h +++ b/components/sharing_message/sharing_message_bridge_impl.h
@@ -45,8 +45,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void OnCommitAttemptErrors( const syncer::FailedCommitResponseDataList& error_response_list) override; CommitAttemptFailedBehavior OnCommitAttemptFailed(
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 97eb97fc..fd83db1 100644 --- a/components/signin/public/identity_manager/account_managed_status_finder.cc +++ b/components/signin/public/identity_manager/account_managed_status_finder.cc
@@ -12,6 +12,7 @@ #include "base/logging.h" #include "base/time/time.h" #include "components/signin/public/identity_manager/account_info.h" +#include "components/signin/public/identity_manager/identity_manager.h" #include "google_apis/gaia/gaia_auth_util.h" #include "google_apis/gaia/google_service_auth_error.h" @@ -548,7 +549,15 @@ return; } - // This is the relevant account! Determine its type. + if (!identity_manager_->AreRefreshTokensLoaded()) { + // `OnRefreshTokensLoaded()` will update the outcome. + return; + } + + // This is the relevant account! Determine its type. It can't be any of the + // types that can be known synchronously, otherwise it would have been + // determined already, either in the constructor or in + // `OnRefreshTokensLoaded()`. OutcomeDeterminedAsync(info.IsManaged() ? Outcome::kEnterprise : Outcome::kConsumerNotWellKnown); } @@ -573,7 +582,7 @@ DCHECK_EQ(outcome_, Outcome::kPending); if (!identity_manager_->AreRefreshTokensLoaded()) { - // `OnRefreshTokensLoaded` will update the outcome. + // `OnRefreshTokensLoaded()` will update the outcome. return; } @@ -653,10 +662,10 @@ : Outcome::kConsumerNotWellKnown; } - GoogleServiceAuthError authError = + GoogleServiceAuthError auth_error = identity_manager_->GetErrorStateOfRefreshTokenForAccount( account_.account_id); - if (!ignore_persistent_auth_errors_ && authError.IsPersistentError()) { + if (!ignore_persistent_auth_errors_ && auth_error.IsPersistentError()) { return Outcome::kTimeout; }
diff --git a/components/signin/public/identity_manager/account_managed_status_finder_unittest.cc b/components/signin/public/identity_manager/account_managed_status_finder_unittest.cc index de55486..efd549e 100644 --- a/components/signin/public/identity_manager/account_managed_status_finder_unittest.cc +++ b/components/signin/public/identity_manager/account_managed_status_finder_unittest.cc
@@ -296,6 +296,35 @@ AccountManagedStatusFinder::Outcome::kConsumerNotWellKnown); } +TEST_F(AccountManagedStatusFinderTest, + KeepsWaitingOnAccountInfoUpdateBeforeTokensLoaded) { + AccountInfo account = + identity_env_.MakeAccountAvailable("account@enterprise.com"); + // Simulate refresh tokens not being loaded state. + identity_env_.ResetToAccountsNotYetLoadedFromDiskState(); + + // Outcome is pending until tokens are loaded. + base::MockCallback<base::OnceClosure> outcome_determined; + AccountManagedStatusFinder finder(identity_env_.identity_manager(), account, + outcome_determined.Get()); + ASSERT_EQ(finder.GetOutcome(), AccountManagedStatusFinder::Outcome::kPending); + + // The account info gets determined before the refresh tokens finish loading. + // AccountManagedStatusFinder should keep waiting. + EXPECT_CALL(outcome_determined, Run).Times(0); + identity_env_.SimulateSuccessfulFetchOfAccountInfo( + account.account_id, account.email, account.gaia, + /*hosted_domain=*/"enterprise.com", "Full Name", "Given Name", "en-US", + /*picture_url=*/""); + + // Once the refresh tokens are loaded, the outcome should be determined + // immediately, since the account info was already available. + EXPECT_CALL(outcome_determined, Run); + identity_env_.ReloadAccountsFromDisk(); + EXPECT_EQ(finder.GetOutcome(), + AccountManagedStatusFinder::Outcome::kEnterprise); +} + TEST_F(AccountManagedStatusFinderTest, ErrorOnNonExistentAccount) { AccountInfo account = identity_env_.MakeAccountAvailable("account@gmail.com");
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index f710bda..85becc1 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Teks</translation> <translation id="2162620598375156287">Nou <ph name="CURRENT_PRICE" /> op <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Kyk of daar 'n tikfout is in <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Outovul lojaliteitskaarte vanaf Google Wallet</translation> <translation id="2166049586286450108">Volle administrateurtoegang</translation> <translation id="2166378884831602661">Hierdie werf kan nie 'n veilige verbinding bied nie</translation> <translation id="2168151236314517198">Administrateursbeleid verhoed dat hierdie inhoud gedruk kan word</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google-opdatering</translation> <translation id="6278015583149890680">Google Drive en OneDrive</translation> <translation id="6280223929691119688">Kan nie by hierdie adres aflewer nie. Kies 'n ander adres.</translation> -<translation id="628324801501145855">Bestuur in betaalmetodes se instellings</translation> <translation id="6284292079994426700">26x38 dm.</translation> <translation id="6284449872909111707">Teks- en kitsboodskappe</translation> <translation id="6284517535531159884">Variasiesaadtipe</translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 79c38f9..bda62e4 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">ጽሁፍ</translation> <translation id="2162620598375156287">አሁን <ph name="CURRENT_PRICE" /> <ph name="SOURCE_WEBSITE" /> ላይ</translation> <translation id="2164510882479075877">በ<ph name="HOST_NAME" /> ውስጥ የፊደል ግድፈት ካለ ይፈትሹ።</translation> -<translation id="2165700285977947082">ከGoogle Wallet የታማኝነት ካርዶችን በራስ-ይሙሉ</translation> <translation id="2166049586286450108">ሙሉ የአስተዳደር መድረሻ</translation> <translation id="2166378884831602661">ይህ ጣቢያ ደህንነቱ አስተማማኝ የሆነ ግንኙነት ማቅረብ አይችልም</translation> <translation id="2168151236314517198">ይህን ይዘት ማተም በአስተዳዳሪ መመሪያ ታግዷል</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">የGoogle ዝማኔ</translation> <translation id="6278015583149890680">Google Drive እና OneDrive</translation> <translation id="6280223929691119688">ወደዚህ አድራሻ ማድረስ አይቻልም። የተለየ አድራሻ ይምረጡ።</translation> -<translation id="628324801501145855">የመክፈያ ዘዴ ቅንብሮች ውስጥ ያስተዳድሩ</translation> <translation id="6284292079994426700">26 x 38 ኢንች</translation> <translation id="6284449872909111707">ጽሁፍ እና ቅጽበታዊ መልዕክት መላላክ</translation> <translation id="6284517535531159884">የአማራጭ ቅርጾች ዘር ዓይነት</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">አድምቅ</translation> <translation id="8339163506404995330">በ<ph name="LANGUAGE" /> ያሉ ገጾች አይተረጎሙም</translation> <translation id="8339275256517065202">Touch ID በመጠቀም ግዢዎን ያጠናቅቁ</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />፣ ያስፈልጋል</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">የምናባዊ ካርድ ምዝገባ በሙሉ ቁመት ተከፍቷል</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 4425645..0e89931 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">نص</translation> <translation id="2162620598375156287">السعر الحالي هو <ph name="CURRENT_PRICE" /> على <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">تحقَّق ما إذا ورد خطأ إملائي في <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">يمكنك ملء بطاقات الولاء تلقائيًا من "محفظة Google"</translation> <translation id="2166049586286450108">الوصول الكامل للمشرف</translation> <translation id="2166378884831602661">لا يمكن لهذا الموقع الإلكتروني توفير اتصال آمن</translation> <translation id="2168151236314517198">تحظر سياسة المشرف إمكانية طباعة هذا المحتوى.</translation> @@ -3055,7 +3054,6 @@ <translation id="6272383483618007430">تحديث Google</translation> <translation id="6278015583149890680">Google Drive وOneDrive</translation> <translation id="6280223929691119688">لا يمكن التسليم على هذا العنوان. اختَر عنوانًا آخر.</translation> -<translation id="628324801501145855">يمكنك إدارة ذلك من خلال إعدادات "طرق الدفع"</translation> <translation id="6284292079994426700">26 × 38 بوصة</translation> <translation id="6284449872909111707">رسائل نصية وفورية</translation> <translation id="6284517535531159884">نوع المحتوى الأساسي للإصدارات المُعدَّلة</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 624be42..f1e8c1f 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">পাঠ</translation> <translation id="2162620598375156287">এতিয়া <ph name="SOURCE_WEBSITE" />ত <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> টাইপ কৰোঁতে ভুল হৈছে নেকি পৰীক্ষা কৰক।</translation> -<translation id="2165700285977947082">Google Walletৰ পৰা লয়েল্টী কাৰ্ড স্বয়ংক্ৰিয়ভাৱে পূৰ কৰক</translation> <translation id="2166049586286450108">প্ৰশাসকৰ সম্পূর্ণ এক্সেছ</translation> <translation id="2166378884831602661">এই ছাইটটোৱে সুৰক্ষিত সংযোগ প্ৰদান কৰিব নোৱাৰে</translation> <translation id="2168151236314517198">এই সমল প্ৰিণ্ট কৰাটো প্ৰশাসকৰ নীতিয়ে অৱৰোধ কৰিছে</translation> @@ -3048,7 +3047,6 @@ <translation id="6272383483618007430">Google আপডে’ট</translation> <translation id="6278015583149890680">Google Drive আৰু OneDrive</translation> <translation id="6280223929691119688">এই ঠিকনাটোত পঠিয়াব নোৱাৰি৷ অন্য এটা ঠিকনা বাছনি কৰক।</translation> -<translation id="628324801501145855">পৰিশোধ পদ্ধতিৰ ছেটিঙত পৰিচালনা কৰক</translation> <translation id="6284292079994426700">২৬ x ৩৮ ইঞ্চি</translation> <translation id="6284449872909111707">পাঠ আৰু তাৎক্ষণিক বাৰ্তা বিনিময়</translation> <translation id="6284517535531159884">ৰূপভেদ ছীডৰ প্ৰকাৰ</translation> @@ -3855,6 +3853,7 @@ <translation id="7639968568612851608">গাঢ় ধোঁৱাবৰণীয়া</translation> <translation id="7646681339175747202">আপুনি এইমাত্ৰ ব্যৱহাৰ কৰা পাছৱৰ্ডটো এটা ডেটা উলংঘনত পোৱা গৈছে। Google Password Managerএ এই পাছৱৰ্ডটো এতিয়াই সলনি কৰাটো চুপাৰিছ কৰে।</translation> <translation id="7647206758853451655">প্ৰিণ্টৰ গুণগত মান</translation> +<translation id="7648527891719919697">আপুনি আপোনাৰ <ph name="BEGIN_ANDROID_SETTINGS_LINK" />Androidৰ ছেটিঙ<ph name="END_ANDROID_SETTINGS_LINK" />ত সুৰক্ষা সম্পৰ্কীয় উন্নত সুবিধা অন কৰি থোৱাৰ বাবে এই ছাইটটো অৱৰোধিত হৈ থাকিব। <ph name="BEGIN_LEARN_MORE_LINK" />এই সকীয়নিৰ বিষয়ে অধিক জানক<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7648992873808071793">এই ডিভাইচত ফাইলসমূহ ষ্ট’ৰ কৰক</translation> <translation id="7653957176542370971">পৰিশোধ নিয়ন্ত্ৰক শ্বীটখন বন্ধ কৰা আছে</translation> <translation id="7654909834015434372">আপুনি এন’টেশ্বন সম্পাদনা কৰিলে, এই নথিখন ইয়াৰ মূল ঘূৰ্ণনলৈ পুনৰ সলনি হ’ব</translation> @@ -4249,6 +4248,7 @@ <translation id="833262891116910667">হাইলাইট</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> ভাষাৰ পৃষ্ঠাসমূহ অনুবাদ কৰা নহয়</translation> <translation id="8339275256517065202">স্পৰ্শ আইডি ব্যৱহাৰ কৰি আপোনাৰ ক্ৰয় সম্পূৰ্ণ কৰক</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, আৱশ্যকীয়</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">ভাৰ্চুৱেল কাৰ্ডৰ পঞ্জীয়ন পূৰ্ণ উচ্চতাত খোলা হৈছে</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index b26e284..b50ade2e 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Mətn</translation> <translation id="2162620598375156287">İndi <ph name="SOURCE_WEBSITE" /> saytında <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> hostunda orfoqrafik səhv olub-olmadığını yoxlayın.</translation> -<translation id="2165700285977947082">Google Pulqabıdan loyallıq kartlarını avtomatik doldurun</translation> <translation id="2166049586286450108">Tam Admin Girişi</translation> <translation id="2166378884831602661">Bu sayt təhlükəsiz bağlantı təmin edə bilməz</translation> <translation id="2168151236314517198">Bu məzmunun çap edilməsi administrator siyasəti əsasında bloklanıb</translation> @@ -3049,7 +3048,6 @@ <translation id="6272383483618007430">Google Güncəlləməsi</translation> <translation id="6278015583149890680">Google Disk və OneDrive</translation> <translation id="6280223929691119688">Bu ünvana çatdırmaq mümkün deyil. Başqa ünvan seçin.</translation> -<translation id="628324801501145855">Ödəniş metodları ayarlarında idarə edin</translation> <translation id="6284292079994426700">26 x 38 düym</translation> <translation id="6284449872909111707">Mətn və Ani Mesajlaşma</translation> <translation id="6284517535531159884">Çeşidlərin başlanğıc dəyər növü</translation> @@ -4251,6 +4249,7 @@ <translation id="833262891116910667">Vurğulama</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> dilində olan səhifələr tərcümə edilməyəcək</translation> <translation id="8339275256517065202">Sensor ID ilə alışı tamamlayın</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, tələb olunur</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Virtual kart qeydiyyatı tam uzunluqda açıldı</translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 3542d02..658843a 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Тэкст</translation> <translation id="2162620598375156287">Цяперашняя цана на сайце <ph name="SOURCE_WEBSITE" /> – <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877">Праверце, ці няма памылкі ў напісанні: <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Аўтазапаўненне картак лаяльнасці з Google Кашалька</translation> <translation id="2166049586286450108">Поўны доступ адміністратара</translation> <translation id="2166378884831602661">Гэты сайт не можа забяспечыць бяспечнае падключэнне</translation> <translation id="2168151236314517198">Палітыка, зададзеная адміністратарам, блакіруе магчымасць друкавання гэтага змесціва</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Абнаўленне Google</translation> <translation id="6278015583149890680">Google Дыск і OneDrive</translation> <translation id="6280223929691119688">Немагчыма адправіць на гэты адрас. Выберыце іншы адрас.</translation> -<translation id="628324801501145855">Каб кіраваць карткай, перайдзіце ў налады спосабаў аплаты</translation> <translation id="6284292079994426700">26 x 38 цаляў</translation> <translation id="6284449872909111707">Абмен тэкставымі і імгненнымі паведамленнямі</translation> <translation id="6284517535531159884">Тып зыходнага матэрыялу для мадыфікацый</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">Вылучэнне</translation> <translation id="8339163506404995330">Старонкі на мове <ph name="LANGUAGE" /> не будуць перакладацца</translation> <translation id="8339275256517065202">Завяршыце куплю з дапамогай Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, абавязковае для запаўнення поле</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Дыялогавае акно рэгістрацыі віртуальнай карткі разгорнута на ўвесь экран</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index ee4d1e8..3830be77 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Текст</translation> <translation id="2162620598375156287">Сега цената е <ph name="CURRENT_PRICE" /> в(ъв) <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Проверете дали <ph name="HOST_NAME" /> е изписано правилно.</translation> -<translation id="2165700285977947082">Автоматично попълване на карти за лоялност от Google Wallet</translation> <translation id="2166049586286450108">Пълен администраторски достъп</translation> <translation id="2166378884831602661">Този сайт не може да осигури защитена връзка</translation> <translation id="2168151236314517198">Отпечатването на това съдържание е блокирано чрез администраторско правило</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Актуализиране</translation> <translation id="6278015583149890680">Google Диск и OneDrive</translation> <translation id="6280223929691119688">Този адрес за бърза доставка не се поддържа. Изберете друг.</translation> -<translation id="628324801501145855">Управление в настройките за начините на плащане</translation> <translation id="6284292079994426700">26 x 38 инча</translation> <translation id="6284449872909111707">SMS и незабавни съобщения</translation> <translation id="6284517535531159884">Тип на началното число за вариантите</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index 78f1deb..61183683 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -680,7 +680,6 @@ <translation id="2161656808144014275">পাঠ্য</translation> <translation id="2162620598375156287">এখন <ph name="SOURCE_WEBSITE" />-এ <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" />-এ কোনও বানান ভুল লেখা হয়েছে কিনা তা চেক করে দেখুন।</translation> -<translation id="2165700285977947082">Google Wallet থেকে অটোফিল লয়ালটি কার্ড</translation> <translation id="2166049586286450108">পূর্ণ প্রশাসক অ্যাক্সেস</translation> <translation id="2166378884831602661">এই সাইটটি একটি সুরক্ষিত সংযোগ দিতে পারছে না</translation> <translation id="2168151236314517198">অ্যাডমিনিস্ট্রেটরের সেট করা নীতি অনুযায়ী এই কন্টেন্ট প্রিন্ট করার সুবিধা ব্লক করা হয়েছে</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google আপডেট</translation> <translation id="6278015583149890680">Google Drive এবং OneDrive</translation> <translation id="6280223929691119688">এই ঠিকানায় ডেলিভারি করা যাবে না। অন্য ঠিকানা বেছে নিন।</translation> -<translation id="628324801501145855">পেমেন্ট পদ্ধতি সম্পর্কিত সেটিংস থেকে ম্যানেজ করুন</translation> <translation id="6284292079994426700">২৬ x ৩৮ ইঞ্চি</translation> <translation id="6284449872909111707">টেক্সট ও ইনস্ট্যান্ট মেসেজিং</translation> <translation id="6284517535531159884">ভ্যারিয়েশন সিডের ধরন</translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index bbeaf6de..2cc89d7 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekst</translation> <translation id="2162620598375156287">Sada je <ph name="CURRENT_PRICE" /> na <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Provjerite je li adresa <ph name="HOST_NAME" /> ispravno napisana.</translation> -<translation id="2165700285977947082">Automatski popunjavajte kartice lojalnosti iz Google Novčanika</translation> <translation id="2166049586286450108">Puni administratorski pristup</translation> <translation id="2166378884831602661">Ova web lokacija ne može obezbijediti sigurnu vezu</translation> <translation id="2168151236314517198">Administratorska pravila blokiraju štampanje ovog sadržaja</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Ažuriranje</translation> <translation id="6278015583149890680">Google Disku i OneDriveu</translation> <translation id="6280223929691119688">Isporuka na ovu adresu nije moguća. Odaberite drugu adresu.</translation> -<translation id="628324801501145855">Upravljajte u postavkama načina plaćanja</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6284449872909111707">Razmjena tekstualnih i instant poruka</translation> <translation id="6284517535531159884">Vrsta početne vrijednosti varijacija</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index 5174cea..864b0b5 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Text</translation> <translation id="2162620598375156287">Ara costa <ph name="CURRENT_PRICE" /> a <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Comprova si <ph name="HOST_NAME" /> està ben escrit.</translation> -<translation id="2165700285977947082">Emplena automàticament les targetes de fidelització de Google Wallet</translation> <translation id="2166049586286450108">Accés administratiu complet</translation> <translation id="2166378884831602661">Aquest lloc web no pot proporcionar una connexió segura</translation> <translation id="2168151236314517198">La política de l'administrador ha bloquejat l'opció d'imprimir aquest contingut</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive i OneDrive</translation> <translation id="6280223929691119688">No es pot entregar a aquesta adreça. Selecciona'n una altra.</translation> -<translation id="628324801501145855">Gestiona a la configuració de les formes de pagament</translation> <translation id="6284292079994426700">26 x 38 polzades</translation> <translation id="6284449872909111707">Missatgeria de text i instantània</translation> <translation id="6284517535531159884">Tipus d'origen de les variacions</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">Destacat</translation> <translation id="8339163506404995330">Les pàgines en <ph name="LANGUAGE" /> no es traduiran</translation> <translation id="8339275256517065202">Completa la compra amb Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" /> (obligatori)</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">S'ha obert la inscripció de targetes virtuals a alçada completa</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index 28f2dabf..c4bf7e9 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Text</translation> <translation id="2162620598375156287">Nyní <ph name="CURRENT_PRICE" /> na webu <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Zkontrolujte, zda v adrese <ph name="HOST_NAME" /> nemáte překlep.</translation> -<translation id="2165700285977947082">Automaticky vyplňujte věrnostní karty z Peněženky Google</translation> <translation id="2166049586286450108">Úplný přístup administrátora</translation> <translation id="2166378884831602661">Tento web nemůže poskytnout zabezpečené připojení</translation> <translation id="2168151236314517198">Tisk tohoto obsahu zakazují zásady administrátora</translation> @@ -3048,7 +3047,6 @@ <translation id="6272383483618007430">Aktualizace Google</translation> <translation id="6278015583149890680">Disk Google a OneDrive</translation> <translation id="6280223929691119688">Doručení na tuto adresu není možné. Vyberte jinou adresu.</translation> -<translation id="628324801501145855">Spravovat v nastavení platebních metod</translation> <translation id="6284292079994426700">26 × 38 palců</translation> <translation id="6284449872909111707">Textové zprávy a chat</translation> <translation id="6284517535531159884">Typ zdroje variant</translation> @@ -3855,6 +3853,7 @@ <translation id="7639968568612851608">Tmavě šedá</translation> <translation id="7646681339175747202">Právě použité heslo bylo nalezeno na seznamu hesel uniklých při incidentu porušení zabezpečení údajů. Správce hesel Google doporučuje ihned toto heslo změnit.</translation> <translation id="7647206758853451655">Kvalita tisku</translation> +<translation id="7648527891719919697">Tento web zůstane zablokován, protože máte v <ph name="BEGIN_ANDROID_SETTINGS_LINK" />nastavení systému Android <ph name="END_ANDROID_SETTINGS_LINK" />zapnutou pokročilou ochranu. <ph name="BEGIN_LEARN_MORE_LINK" />Další informace o tomto upozornění<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7648992873808071793">Ukládat soubory v tomto zařízení</translation> <translation id="7653957176542370971">List obslužného nástroje pro platby je zavřený</translation> <translation id="7654909834015434372">Když upravíte poznámky, obnoví se původní orientace tohoto dokumentu</translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 52a0857..dff216b 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Testun</translation> <translation id="2162620598375156287">Nawr <ph name="CURRENT_PRICE" /> yn <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Gwiriwch a oes teipo yn <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Awtolenwi cardiau teyrngarwch o Google Wallet</translation> <translation id="2166049586286450108">Mynediad Gweinyddol Llawn</translation> <translation id="2166378884831602661">Ni all y wefan hon ddarparu cysylltiad diogel</translation> <translation id="2168151236314517198">Mae argraffu'r cynnwys hwn wedi'i rhwystro gan bolisi gweinyddwr</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Diweddariad Google</translation> <translation id="6278015583149890680">Google Drive a OneDrive</translation> <translation id="6280223929691119688">Methu ag anfon i'r cyfeiriad hwn. Dewiswch gyfeiriad gwahanol.</translation> -<translation id="628324801501145855">Rheoli yn y gosodiadau dulliau talu</translation> <translation id="6284292079994426700">26 x 38 modfedd</translation> <translation id="6284449872909111707">Tecstio a Negeseuo Gwib</translation> <translation id="6284517535531159884">Math o Hedyn Amrywiadau</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">Amlygu</translation> <translation id="8339163506404995330">Ni fydd tudalennau yn <ph name="LANGUAGE" /> yn cael eu cyfieithu</translation> <translation id="8339275256517065202">Cwblhewch eich pryniant gan ddefnyddio Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, gofynnol</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Agorwyd cofrestriad cerdyn rhithwir ar uchder llawn</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 5253f944..f72fc2a 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekst</translation> <translation id="2162620598375156287">Fås nu til <ph name="CURRENT_PRICE" /> på <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Tjek, om der er en stavefejl i <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Udfyld loyalitetskort automatisk fra Google Wallet</translation> <translation id="2166049586286450108">Fuld administratoradgang</translation> <translation id="2166378884831602661">Dette website kan ikke levere en sikker forbindelse</translation> <translation id="2168151236314517198">Administratorpolitikken tillader ikke, at du udskriver dette indhold</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drev og OneDrive</translation> <translation id="6280223929691119688">Der kan ikke leveres til denne adresse. Vælg en anden adresse.</translation> -<translation id="628324801501145855">Administrer i indstillinger for betalingsmetoder</translation> <translation id="6284292079994426700">26 x 38 tommer</translation> <translation id="6284449872909111707">Beskeder og chatfunktioner</translation> <translation id="6284517535531159884">Varianter af seedtype</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">Fremhæv</translation> <translation id="8339163506404995330">Sider på <ph name="LANGUAGE" /> oversættes ikke</translation> <translation id="8339275256517065202">Gennemfør dit køb ved hjælp af Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, påkrævet</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Tilmelding via virtuelt kort er åbnet i fuld højde</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index fe96bb4..490a525 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Text</translation> <translation id="2162620598375156287">Jetzt <ph name="CURRENT_PRICE" /> auf <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Prüfe, ob „<ph name="HOST_NAME" />“ einen Tippfehler enthält.</translation> -<translation id="2165700285977947082">Kundenkarten aus Google Wallet automatisch ausfüllen</translation> <translation id="2166049586286450108">Vollständiger Administratorzugriff</translation> <translation id="2166378884831602661">Diese Website kann keine sichere Verbindung bereitstellen</translation> <translation id="2168151236314517198">Die Administratorrichtlinie blockiert das Drucken dieses Inhalts</translation> @@ -3051,7 +3050,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive und OneDrive</translation> <translation id="6280223929691119688">Die Lieferadresse wird nicht unterstützt. Bitte wähle eine andere Adresse aus.</translation> -<translation id="628324801501145855">In den Einstellungen für Zahlungsmethoden verwalten</translation> <translation id="6284292079994426700">26 x 38 Zoll</translation> <translation id="6284449872909111707">SMS und Chat</translation> <translation id="6284517535531159884">Quelltyp der Varianten</translation> @@ -4254,6 +4252,7 @@ <translation id="833262891116910667">Hervorheben</translation> <translation id="8339163506404995330">Seiten auf <ph name="LANGUAGE" /> werden nicht übersetzt</translation> <translation id="8339275256517065202">Schließe den Kauf mit Touch ID ab</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, erforderlich</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Ansicht zur Registrierung der virtuellen Karte vollständig geöffnet</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index 782085e..acd0b6f4 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Κείμενο</translation> <translation id="2162620598375156287">Τώρα <ph name="CURRENT_PRICE" /> στο <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Ελέγξτε μήπως υπάρχει κάποιο ορθογραφικό λάθος στη διεύθυνση <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Αυτόματη συμπλήρωση καρτών επιβράβευσης αφοσιωμένων πελατών από το Πορτοφόλι Google</translation> <translation id="2166049586286450108">Πλήρης πρόσβαση διαχειριστή</translation> <translation id="2166378884831602661">Αυτός ο ιστότοπος δεν μπορεί να προσφέρει ασφαλή σύνδεση</translation> <translation id="2168151236314517198">Η εκτύπωση αυτού του περιεχομένου έχει αποκλειστεί από την πολιτική διαχειριστή.</translation> @@ -3055,7 +3054,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive και OneDrive</translation> <translation id="6280223929691119688">Δεν είναι δυνατή η παράδοση σε αυτήν τη διεύθυνση. Επιλέξτε μια άλλη διεύθυνση.</translation> -<translation id="628324801501145855">Διαχείριση στις ρυθμίσεις τρόπων πληρωμής</translation> <translation id="6284292079994426700">26 x 38 ίντσες</translation> <translation id="6284449872909111707">Αποστολή άμεσων μηνυμάτων και μηνυμάτων κειμένου</translation> <translation id="6284517535531159884">Τύπος αρχικών θέσεων παραλλαγών</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 3ae1168..0890a38 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Text</translation> <translation id="2162620598375156287">Now <ph name="CURRENT_PRICE" /> on <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Check if there is a typo in <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Autofill loyalty cards from Google Wallet</translation> <translation id="2166049586286450108">Full Admin Access</translation> <translation id="2166378884831602661">This site can’t provide a secure connection</translation> <translation id="2168151236314517198">Printing this content is blocked by administrator policy</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google update</translation> <translation id="6278015583149890680">Google Drive and OneDrive</translation> <translation id="6280223929691119688">Can’t deliver to this address. Select a different address.</translation> -<translation id="628324801501145855">Manage in payment methods settings</translation> <translation id="6284292079994426700">26 in x 38 in</translation> <translation id="6284449872909111707">Text and instant messaging</translation> <translation id="6284517535531159884">Variations Seed Type</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 17f26c8..19651d1 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Texto</translation> <translation id="2162620598375156287">Ahora <ph name="CURRENT_PRICE" /> en <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Revisa que no haya errores de ortografía en <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Autocompletar tarjetas de lealtad de la Billetera de Google</translation> <translation id="2166049586286450108">Acceso de administrador completo</translation> <translation id="2166378884831602661">Este sitio no puede proporcionar una conexión segura</translation> <translation id="2168151236314517198">La política del administrador no permite imprimir este contenido.</translation> @@ -3054,7 +3053,6 @@ <translation id="6272383483618007430">Google Actualización</translation> <translation id="6278015583149890680">Google Drive y OneDrive</translation> <translation id="6280223929691119688">La dirección de envío no es válida. Selecciona una dirección diferente.</translation> -<translation id="628324801501145855">Administrar en la configuración de las formas de pago</translation> <translation id="6284292079994426700">66.04 × 96.52 cm</translation> <translation id="6284449872909111707">Mensajería instantánea y de texto</translation> <translation id="6284517535531159884">Tipo de origen de las variaciones</translation> @@ -4257,6 +4255,7 @@ <translation id="833262891116910667">Destacar</translation> <translation id="8339163506404995330">No se traducirán las páginas en <ph name="LANGUAGE" /></translation> <translation id="8339275256517065202">Completa tu compra con Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, obligatorio</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">El diálogo de inscripción de tarjeta virtual está totalmente abierto</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index bca07b2..8bfd998 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Texto</translation> <translation id="2162620598375156287">Ahora, por <ph name="CURRENT_PRICE" /> en <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Comprueba si hay un error de escritura en <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Autocompletar tarjetas de fidelización de Google Wallet</translation> <translation id="2166049586286450108">Acceso de administrador completo</translation> <translation id="2166378884831602661">Este sitio web no puede proporcionar una conexión segura</translation> <translation id="2168151236314517198">La política del administrador ha bloqueado la opción de imprimir este contenido</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive y OneDrive</translation> <translation id="6280223929691119688">Los pedidos no se pueden entregar en esta dirección. Selecciona otra.</translation> -<translation id="628324801501145855">Gestiónala en los ajustes de métodos de pago</translation> <translation id="6284292079994426700">26x38 pulgadas</translation> <translation id="6284449872909111707">Mensajería instantánea y de texto</translation> <translation id="6284517535531159884">Tipo de origen de las variaciones</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">Resaltar</translation> <translation id="8339163506404995330">No se traducirán las páginas en <ph name="LANGUAGE" /></translation> <translation id="8339275256517065202">Completa tu compra con Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, obligatorio</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Registro de tarjeta virtual abierto a altura completa</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index dd2b9e6..6fa9822 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekst</translation> <translation id="2162620598375156287">Nüüd <ph name="CURRENT_PRICE" /> veebisaidil <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Kontrollige, kas nimes <ph name="HOST_NAME" /> on kirjaviga.</translation> -<translation id="2165700285977947082">Kliendikaartide automaatselt täitmine Google Walletist</translation> <translation id="2166049586286450108">Täielik administraatorijuurdepääs</translation> <translation id="2166378884831602661">See sait ei saa turvalist ühendust luua</translation> <translation id="2168151236314517198">Selle sisu printimine on administraatori eeskirjadega blokeeritud</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive ja OneDrive</translation> <translation id="6280223929691119688">Sellele aadressile ei saa kaupa kohale toimetada. Valige mõni teine aadress.</translation> -<translation id="628324801501145855">Hallake makseviiside seadetes</translation> <translation id="6284292079994426700">26 × 38 tolli</translation> <translation id="6284449872909111707">Tekst- ja kiirsõnumside</translation> <translation id="6284517535531159884">Variantide algandmete tüüp</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">Tõsta esile</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> keeles olevaid lehti ei tõlgita</translation> <translation id="8339275256517065202">Viige ost lõpule Touch ID abil</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, nõutav</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Virtuaalkaardi registreerimise dialoog on avatud poolel kõrgusel</translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 98f53034..4e26ab20 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">testua</translation> <translation id="2162620598375156287">Orain, <ph name="CURRENT_PRICE" /> balio du <ph name="SOURCE_WEBSITE" /> webgunean</translation> <translation id="2164510882479075877">Egiaztatu behar bezala idatzita dagoela <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Bete automatikoki fideltasun-txartelak Google Diru-zorroa zerbitzutik</translation> <translation id="2166049586286450108">Administratzailearen sarbide osoa</translation> <translation id="2166378884831602661">Webguneak ezin du eskaini konexio segururik</translation> <translation id="2168151236314517198">Administratzailearen gidalerroek ez dute uzten edukia inprimatzen</translation> @@ -3048,7 +3047,6 @@ <translation id="6272383483618007430">Google-ren eguneratzea</translation> <translation id="6278015583149890680">Google Drive eta OneDrive</translation> <translation id="6280223929691119688">Ezin da entregatu helbide horretan. Hautatu beste helbide bat.</translation> -<translation id="628324801501145855">Kudeatu ordainketa-metodoen ezarpenetan</translation> <translation id="6284292079994426700">66,04 × 96,52 cm (26 × 38 in)</translation> <translation id="6284449872909111707">Testu-mezuak eta istanteko mezularitza</translation> <translation id="6284517535531159884">Aldaeren iturburu mota</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index e35cc1b..1422f03 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">نوشتار</translation> <translation id="2162620598375156287">اکنون با قیمت <ph name="CURRENT_PRICE" /> در <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">احتمال وجود غلط املائی در <ph name="HOST_NAME" /> را بررسی کنید.</translation> -<translation id="2165700285977947082">تکمیل خودکار کارتهای وفاداری از «کیف پول Google»</translation> <translation id="2166049586286450108">دسترسی کامل سرپرست</translation> <translation id="2166378884831602661">این سایت نمیتواند اتصالی ایمن ارائه دهد</translation> <translation id="2168151236314517198">خطمشی سرپرست چاپ این محتوا را مسدود کرده است</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive و OneDrive</translation> <translation id="6280223929691119688">تحویل به این نشانی ممکن نیست. نشانی دیگری را انتخاب کنید.</translation> -<translation id="628324801501145855">مدیریت در تنظیمات روشهای پرداخت</translation> <translation id="6284292079994426700">۳۸ × ۲۶ اینچ</translation> <translation id="6284449872909111707">پیامک و پیامرسانی فوری</translation> <translation id="6284517535531159884">نوع پیگردی گونهها</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 96e4a93..55c6c73 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Teksti</translation> <translation id="2162620598375156287">Nyt <ph name="CURRENT_PRICE" /> osoitteessa <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Tarkista, sisältääkö <ph name="HOST_NAME" /> kirjoitusvirheitä.</translation> -<translation id="2165700285977947082">Täytä kanta-asiakaskortit automaattisesti Google Walletista</translation> <translation id="2166049586286450108">Järjestelmänvalvojan täydet käyttöoikeudet</translation> <translation id="2166378884831602661">Tämä sivusto ei voi tarjota suojattua yhteyttä</translation> <translation id="2168151236314517198">Järjestelmänvalvojakäytäntö on estänyt tämän sisällön tulostamisen</translation> @@ -3054,7 +3053,6 @@ <translation id="6272383483618007430">Google-päivitys</translation> <translation id="6278015583149890680">Google Drive ja OneDrive</translation> <translation id="6280223929691119688">Toimitus ei onnistu tähän osoitteeseen. Valitse eri osoite.</translation> -<translation id="628324801501145855">Muokkaa maksutapa-asetuksista</translation> <translation id="6284292079994426700">26 x 38 tuumaa</translation> <translation id="6284449872909111707">Tekstiviestit ja pikaviestit</translation> <translation id="6284517535531159884">Muunnelmien lähdetyyppi</translation> @@ -4257,6 +4255,7 @@ <translation id="833262891116910667">Korosta</translation> <translation id="8339163506404995330">Kielellä <ph name="LANGUAGE" /> kirjoitettuja sivuja ei käännetä.</translation> <translation id="8339275256517065202">Suorita ostos loppuun Touch ID:n avulla</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, vaaditaan</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Virtuaalikortin rekisteröinti avattu koko näytön kokoisena</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index 51c3dd5..f2e67514 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Text</translation> <translation id="2162620598375156287"><ph name="CURRENT_PRICE" /> ngayon sa <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Tingnan kung may typo sa <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">I-autofill ang mga loyalty card mula sa Google Wallet</translation> <translation id="2166049586286450108">Ganap na Access ng Admin</translation> <translation id="2166378884831602661">Hindi makakapagbigay ng secure na koneksyon ang site na ito</translation> <translation id="2168151236314517198">Na-block ng patakaran ng administrator ang pag-print ng content na ito</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive at OneDrive</translation> <translation id="6280223929691119688">Hindi maaaring maghatid sa address na ito. Pumili ng ibang address.</translation> -<translation id="628324801501145855">Pamahalaan sa mga setting ng mga paraan ng pagbabayad</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6284449872909111707">Text at Instant Messaging</translation> <translation id="6284517535531159884">Uri ng Seed ng Mga Variation</translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 33efd168..ac831fd 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Texte</translation> <translation id="2162620598375156287">Maintenant <ph name="CURRENT_PRICE" /> sur <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Vérifiez si <ph name="HOST_NAME" /> est écrit correctement.</translation> -<translation id="2165700285977947082">Remplissez automatiquement les cartes de fidélité à partir de Google Portefeuille</translation> <translation id="2166049586286450108">Accès administrateur complet</translation> <translation id="2166378884831602661">Ce site ne fournit pas de connexion sécurisée</translation> <translation id="2168151236314517198">La politique définie par l'administrateur empêche l'impression de ce contenu</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Mise à jour Google</translation> <translation id="6278015583149890680">Google Disque et OneDrive</translation> <translation id="6280223929691119688">Impossible d'effectuer une livraison à cette adresse. Sélectionnez une autre adresse.</translation> -<translation id="628324801501145855">Gérez dans les paramètres des modes de paiement</translation> <translation id="6284292079994426700">26 po x 38 po</translation> <translation id="6284449872909111707">Messagerie texte et clavardage</translation> <translation id="6284517535531159884">Type d'élément de référence des variantes</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 78e8578..2955bc7 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Texte</translation> <translation id="2162620598375156287">Actuellement à <ph name="CURRENT_PRICE" /> sur <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Vérifiez si l'adresse <ph name="HOST_NAME" /> est correcte.</translation> -<translation id="2165700285977947082">Saisissez automatiquement les cartes de fidélité depuis Google Wallet</translation> <translation id="2166049586286450108">Accès administrateur complet</translation> <translation id="2166378884831602661">Ce site ne peut pas fournir de connexion sécurisée</translation> <translation id="2168151236314517198">Une règle de l'administrateur a bloqué l'impression de ce contenu</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive et OneDrive</translation> <translation id="6280223929691119688">Impossible de livrer à cette adresse. Sélectionnez-en une autre.</translation> -<translation id="628324801501145855">Gérez dans les paramètres des modes de paiement</translation> <translation id="6284292079994426700">26 x 38 pouces</translation> <translation id="6284449872909111707">SMS et messagerie instantanée</translation> <translation id="6284517535531159884">Type de valeur source des variantes</translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index 605b1cd..ec3fce1 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Texto</translation> <translation id="2162620598375156287">Agora <ph name="CURRENT_PRICE" /> en <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Comproba que <ph name="HOST_NAME" /> estea ben escrito.</translation> -<translation id="2165700285977947082">Autocompleta as tarxetas de fidelidade de Google Wallet</translation> <translation id="2166049586286450108">Acceso de administrador completo</translation> <translation id="2166378884831602661">Este sitio non pode fornecer unha conexión segura</translation> <translation id="2168151236314517198">A política do administrador bloqueou a impresión deste contido</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Actualización de Google</translation> <translation id="6278015583149890680">Google Drive e OneDrive</translation> <translation id="6280223929691119688">Non se pode realizar a entrega neste enderezo. Selecciona un diferente.</translation> -<translation id="628324801501145855">Xestiona esta opción na configuración de métodos de pago</translation> <translation id="6284292079994426700">26 × 38 in</translation> <translation id="6284449872909111707">Mensaxaría instantánea e de texto</translation> <translation id="6284517535531159884">Tipo de orixe das variacións</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 254daf0..7ffcba1 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">ટેક્સ્ટ</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> પર હવે <ph name="CURRENT_PRICE" /> કિંમત છે</translation> <translation id="2164510882479075877">ચેક કરો કે <ph name="HOST_NAME" />માં કોઈ ટાઇપિંગ ભૂલ તો નથી ને.</translation> -<translation id="2165700285977947082">Google Walletમાંથી લૉયલ્ટિ કાર્ડ ઑટોમૅટિક રીતે ભરો</translation> <translation id="2166049586286450108">સંપૂર્ણ વ્યવસ્થાપક ઍક્સેસ</translation> <translation id="2166378884831602661">આ સાઇટ એક સુરક્ષિત કનેક્શન આપી શકતી નથી</translation> <translation id="2168151236314517198">વ્યવસ્થાપક પૉલિસીને કારણે આ કન્ટેન્ટ પ્રિન્ટ કરવાની સુવિધા બ્લૉક કરવામાં આવી છે</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google અપડેટ</translation> <translation id="6278015583149890680">Google Drive અને OneDrive</translation> <translation id="6280223929691119688">આ સરનામે વિતરણ કરી શકતા નથી. કોઈ ભિન્ન સરનામું પસંદ કરો.</translation> -<translation id="628324801501145855">ચુકવણી પદ્ધતિના સેટિંગમાં મેનેજ કરો</translation> <translation id="6284292079994426700">26 x 38 ઇંચ</translation> <translation id="6284449872909111707">ટેક્સ્ટ અને ઇન્સ્ટન્ટ મેસેજિંગ</translation> <translation id="6284517535531159884">વૅરિએશન સીડનો પ્રકાર</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">હાઇલાઇટ</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" />માં છે તે પેજનો અનુવાદ થશે નહીં</translation> <translation id="8339275256517065202">Touch IDનો ઉપયોગ કરીને તમારી ખરીદી પૂર્ણ કરો</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, આવશ્યક</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">વર્ચ્યુઅલ કાર્ડની નોંધણી પૂરી ઊંચાઈ સુધી ખોલવામાં આવી છે</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index d2d373b..5ca34d69 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -680,7 +680,6 @@ <translation id="2161656808144014275">लेख संदेश</translation> <translation id="2162620598375156287">अब <ph name="SOURCE_WEBSITE" /> पर कीमत <ph name="CURRENT_PRICE" /> है</translation> <translation id="2164510882479075877">देखें कि <ph name="HOST_NAME" /> की स्पेलिंग गलत तो नहीं है.</translation> -<translation id="2165700285977947082">Google Wallet से लॉयल्टी कार्ड की जानकारी अपने-आप भरने की सुविधा</translation> <translation id="2166049586286450108">पूरा एडमिन एक्सेस</translation> <translation id="2166378884831602661">यह साइट सुरक्षित कनेक्शन नहीं उपलब्ध करा सकती</translation> <translation id="2168151236314517198">एडमिन नीति के तहत, इस कॉन्टेंट की प्रिंटिंग को ब्लॉक किया गया</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google अपडेट</translation> <translation id="6278015583149890680">Google Drive और OneDrive</translation> <translation id="6280223929691119688">इस पते पर वितरित नहीं किया जा सकता. कोई दूसरा पता चुनें.</translation> -<translation id="628324801501145855">इसे पेमेंट के तरीकों की सेटिंग में जाकर मैनेज करें</translation> <translation id="6284292079994426700">26 x 38 इंच</translation> <translation id="6284449872909111707">टेक्स्ट और फटाफट मैसेज सेवा</translation> <translation id="6284517535531159884">वैरिएशन सीड टाइप</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">हाइलाइट करें</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> भाषा के पेज का अनुवाद नहीं किया जाएगा</translation> <translation id="8339275256517065202">Touch ID का इस्तेमाल करके खरीदारी पूरी करें</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, ज़रूरी है</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">वर्चुअल कार्ड रजिस्टर करने की सुविधा पूरी स्क्रीन पर खुली है</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 4c16eca6..131c9ce 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekst</translation> <translation id="2162620598375156287">Trenutačna cijena sada je <ph name="CURRENT_PRICE" /> na <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Provjerite sadrži li naziv <ph name="HOST_NAME" /> pravopisnu pogrešku.</translation> -<translation id="2165700285977947082">Automatsko popunjavanje kartica vjernosti iz Google Walleta</translation> <translation id="2166049586286450108">Potpuni administratorski pristup</translation> <translation id="2166378884831602661">Web-lokacija ne može pružiti sigurnu vezu</translation> <translation id="2168151236314517198">Administratorska pravila blokiraju ispis tog sadržaja</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google ažuriranje</translation> <translation id="6278015583149890680">Google disku i OneDriveu</translation> <translation id="6280223929691119688">Dostava na tu adresu nije moguća. Odaberite drugu adresu.</translation> -<translation id="628324801501145855">Upravljanje u postavkama načina plaćanja</translation> <translation id="6284292079994426700">26 x 38 inča</translation> <translation id="6284449872909111707">Slanje poruka i slanje neposrednih poruka</translation> <translation id="6284517535531159884">Vrsta izvora varijacije</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index ab9f2e7f..1baed71 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Szöveg</translation> <translation id="2162620598375156287">Most <ph name="CURRENT_PRICE" /> áron a következő webhelyen: <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Ellenőrizze, hogy van-e elírás a(z) <ph name="HOST_NAME" /> domainnévben.</translation> -<translation id="2165700285977947082">Hűségkártyák automatikus kitöltése a Google Walletből</translation> <translation id="2166049586286450108">Teljes rendszergazdai hozzáférés</translation> <translation id="2166378884831602661">A webhely nem képes biztonságos kapcsolatot nyújtani</translation> <translation id="2168151236314517198">Ennek a tartalomnak a nyomtatását rendszergazdai házirend tiltja</translation> @@ -3050,7 +3049,6 @@ <translation id="6272383483618007430">Google Frissítés</translation> <translation id="6278015583149890680">Google Drive és OneDrive</translation> <translation id="6280223929691119688">Erre a címre nem lehetséges a kézbesítés. Válasszon másik címet.</translation> -<translation id="628324801501145855">A fizetési módok beállításaiban kezelheti</translation> <translation id="6284292079994426700">26 × 38 hüvelyk</translation> <translation id="6284449872909111707">Szöveges és azonnali üzenetek</translation> <translation id="6284517535531159884">Változatok forrástípusa</translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index 1c8b1375..7d03e7a 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -683,7 +683,6 @@ <translation id="2161656808144014275">Տեքստ</translation> <translation id="2162620598375156287">Այժմ <ph name="CURRENT_PRICE" />՝ <ph name="SOURCE_WEBSITE" /> կայքում</translation> <translation id="2164510882479075877">Համոզվեք, որ <ph name="HOST_NAME" /> անվան մեջ տառասխալներ չկան։</translation> -<translation id="2165700285977947082">Ավտոմատ լրացրեք մշտական հաճախորդի քարտերի տվյալները Google Wallet-ից</translation> <translation id="2166049586286450108">Ադմինիստրատորի ամբողջական թույլտվություն</translation> <translation id="2166378884831602661">Այս կայքը չի կարող անվտանգ կապակցում ապահովել</translation> <translation id="2168151236314517198">Ադմինիստրատորը թույլ չի տալիս տպել այս բովանդակությունը</translation> @@ -3062,7 +3061,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive-ում և OneDrive-ում</translation> <translation id="6280223929691119688">Այս հասցեով հնարավոր չէ առաքել: Ընտրեք այլ հասցե:</translation> -<translation id="628324801501145855">Կառավարեք վճարման եղանակների կարգավորումներում</translation> <translation id="6284292079994426700">26 x 38 դյույմ</translation> <translation id="6284449872909111707">SMS-ներ և ակնթարթային հաղորդակցում</translation> <translation id="6284517535531159884">Տարբերակների նախնական տեսակ</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index cf574cd..a68a9b7 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -680,7 +680,6 @@ <translation id="2161656808144014275">Teks</translation> <translation id="2162620598375156287">Sekarang <ph name="CURRENT_PRICE" /> di <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Periksa apakah ada kesalahan ketik di <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Isi otomatis kartu loyalitas dari Google Wallet</translation> <translation id="2166049586286450108">Akses Penuh Admin</translation> <translation id="2166378884831602661">Situs ini tidak dapat menyediakan sambungan aman</translation> <translation id="2168151236314517198">Pencetakan konten ini diblokir oleh kebijakan administrator</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive dan OneDrive</translation> <translation id="6280223929691119688">Tidak dapat mengirim ke alamat ini. Pilih alamat lain.</translation> -<translation id="628324801501145855">Kelola di setelan metode pembayaran</translation> <translation id="6284292079994426700">26 x 38 inci (66 x 96 cm)</translation> <translation id="6284449872909111707">Pesan Teks & Fitur Pesan Instan</translation> <translation id="6284517535531159884">Jenis Seed Variasi</translation> @@ -4254,6 +4252,7 @@ <translation id="833262891116910667">Sorotan</translation> <translation id="8339163506404995330">Halaman dalam bahasa <ph name="LANGUAGE" /> tidak akan diterjemahkan</translation> <translation id="8339275256517065202">Selesaikan pembelian menggunakan Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, wajib</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Pendaftaran kartu virtual terbuka sepenuhnya</translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index 91b7375..789d18f 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Texti</translation> <translation id="2162620598375156287">Núna <ph name="CURRENT_PRICE" /> á <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Kannaðu hvort innsláttarvillu sé að finna í <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Fylltu sjálfkrafa út tryggðarkort úr Google-veski</translation> <translation id="2166049586286450108">Fullt stjórnandaaðgengi</translation> <translation id="2166378884831602661">Þetta vefsvæði getur ekki ábyrgst örugga tengingu</translation> <translation id="2168151236314517198">Regla stjórnanda kemur í veg fyrir að hægt sé að prenta þetta efni</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google uppfærslur</translation> <translation id="6278015583149890680">Google Drive og OneDrive</translation> <translation id="6280223929691119688">Ekki er hægt að senda á þetta heimilisfang. Veldu annað heimilisfang.</translation> -<translation id="628324801501145855">Þú getur stjórnað þessu í stillingum greiðslumáta</translation> <translation id="6284292079994426700">26 x 38 to.</translation> <translation id="6284449872909111707">SMS- og spjallþjónusta</translation> <translation id="6284517535531159884">Dreifingargerð tilbrigðis (Variations Seed Type)</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index 1b59499..6a692d2b 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Testo</translation> <translation id="2162620598375156287">Ora a <ph name="CURRENT_PRICE" /> su <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Controlla eventuali errori di battitura in <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Compilazione automatica delle carte fedeltà da Google Wallet</translation> <translation id="2166049586286450108">Accesso amministrativo completo</translation> <translation id="2166378884831602661">Il sito non può fornire una connessione protetta</translation> <translation id="2168151236314517198">La stampa di questi contenuti è stata bloccata dalla policy dell'amministratore</translation> @@ -3049,7 +3048,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive e OneDrive</translation> <translation id="6280223929691119688">Impossibile consegnare all'indirizzo specificato. Seleziona un indirizzo diverso.</translation> -<translation id="628324801501145855">Gestisci nelle impostazioni dei metodi di pagamento</translation> <translation id="6284292079994426700">66,0 × 96,5 cm</translation> <translation id="6284449872909111707">SMS e messaggistica immediata</translation> <translation id="6284517535531159884">Tipo di origine varianti</translation> @@ -3857,6 +3855,7 @@ <translation id="7639968568612851608">Grigio scuro</translation> <translation id="7646681339175747202">La password appena usata è stata compromessa nell'ambito di una violazione dei dati. Gestore delle password di Google consiglia di cambiarla subito.</translation> <translation id="7647206758853451655">Qualità di stampa</translation> +<translation id="7648527891719919697">Questo sito rimarrà bloccato perché hai attivato la protezione avanzata nelle <ph name="BEGIN_ANDROID_SETTINGS_LINK" />impostazioni di Android<ph name="END_ANDROID_SETTINGS_LINK" />. <ph name="BEGIN_LEARN_MORE_LINK" />Scopri di più su questo avviso<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7648992873808071793">Memorizzare file sul dispositivo</translation> <translation id="7653957176542370971">Il foglio per la gestione dei pagamenti è chiuso</translation> <translation id="7654909834015434372">Quando modifichi le annotazioni, questo documento torna alla sua rotazione originale</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index 8a1c09ca..add6263 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">טקסט</translation> <translation id="2162620598375156287">עכשיו במחיר <ph name="CURRENT_PRICE" /> ב-<ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">יש לבדוק אם יש שגיאה בהקלדה ב-<ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">מילוי אוטומטי של כרטיסי מועדון לקוחות מ-Google Wallet</translation> <translation id="2166049586286450108">גישה מלאה של מנהל המערכת</translation> <translation id="2166378884831602661">אתר זה לא יכול לספק חיבור מאובטח</translation> <translation id="2168151236314517198">בהתאם למדיניות מנהל המערכת, הדפסת התוכן הזה חסומה</translation> @@ -3058,7 +3057,6 @@ <translation id="6272383483618007430">עדכוני Google</translation> <translation id="6278015583149890680">Google Drive ו-OneDrive</translation> <translation id="6280223929691119688">לא ניתן לבצע מסירה בכתובת זו. עליך לבחור כתובת אחרת.</translation> -<translation id="628324801501145855">אפשר לנהל זאת בהגדרות של אמצעי התשלום</translation> <translation id="6284292079994426700">26x38 אינץ'</translation> <translation id="6284449872909111707">העברת הודעות מיידיות והודעות טקסט</translation> <translation id="6284517535531159884">וריאציות של סוג המקור</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index fe271542..609804a 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">テキスト</translation> <translation id="2162620598375156287">現在の価格は <ph name="SOURCE_WEBSITE" /> で <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> にタイプミスがないか確認してください。</translation> -<translation id="2165700285977947082">Google ウォレットからポイントカードを自動入力</translation> <translation id="2166049586286450108">すべてのデータへの管理者アクセス</translation> <translation id="2166378884831602661">このサイトは安全に接続できません</translation> <translation id="2168151236314517198">このコンテンツの印刷は管理者が設定したポリシーによってブロックされています</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google ドライブと OneDrive</translation> <translation id="6280223929691119688">この住所には配達できません。別の住所を選択してください。</translation> -<translation id="628324801501145855">お支払い方法の設定で管理</translation> <translation id="6284292079994426700">26x38 インチ</translation> <translation id="6284449872909111707">テキスト メッセージ、インスタント メッセージ</translation> <translation id="6284517535531159884">バリエーション シードタイプ</translation> @@ -4257,6 +4255,7 @@ <translation id="833262891116910667">ハイライト表示</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" />のページは翻訳されません</translation> <translation id="8339275256517065202">Touch ID を使用して購入手続きを完了してください</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />、必須</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" /> / <ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">仮想カードの登録が画面全体に表示されています</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index a240b01..ff5a494e 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">ტექსტი</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" />-ზე ახლა <ph name="CURRENT_PRICE" /> ღირს</translation> <translation id="2164510882479075877">შეამოწმეთ, სწორად არის თუ არა აკრეფილი <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">ერთგული კლიენტის ბარათების მონაცემების ავტომატური შევსება Google საფულით</translation> <translation id="2166049586286450108">ადმინისტრატორის სრული წვდომა</translation> <translation id="2166378884831602661">ეს საიტი ვერ უზრუნველყოფს დაცულ კავშირს</translation> <translation id="2168151236314517198">ამ კონტენტის ბეჭდვა დაბლოკილია ადმინისტრატორის წესების მიხედვით</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google განახლება</translation> <translation id="6278015583149890680">Google Drive და OneDrive</translation> <translation id="6280223929691119688">ამ მისამართზე მიწოდება ვერ მოხერხდება. აირჩიეთ სხვა მისამართი.</translation> -<translation id="628324801501145855">მართეთ გადახდის მეთოდების პარამეტრებიდან</translation> <translation id="6284292079994426700">26 x 38 დუიმი</translation> <translation id="6284449872909111707">ტექსტური და მყისიერი შეტყობინებები</translation> <translation id="6284517535531159884">ნაირსახეობათა წყაროს ტიპი</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">გამოყოფა</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> გვერდები არ ითარგმნება</translation> <translation id="8339275256517065202">დაასრულეთ შეძენა Touch ID-ს მეშვეობით</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, სავალდებულო</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">ვირტუალური ბარათის რეგისტრაცია გახსნილია სრულ სიმაღლეზე</translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index e09cfe1..65dc0a24 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Мәтін</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> сайтындағы қазіргі бағасы – <ph name="CURRENT_PRICE" />.</translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> қатесіз енгізілгенін тексеріңіз.</translation> -<translation id="2165700285977947082">Google Wallet-тегі тұрақты клиент карталарын автоматты түрде толтырыңыз</translation> <translation id="2166049586286450108">Әкімшінің бүкіл дерекке кіру рұқсаты</translation> <translation id="2166378884831602661">Бұл сайт қауіпсіз байланысты ұсына алмайды</translation> <translation id="2168151236314517198">Әкімші саясаты бұл контентті басып шығару процесін бөгеді.</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive және OneDrive</translation> <translation id="6280223929691119688">Бұл мекенжайға жеткізілмейді. Басқа мекенжайды таңдаңыз.</translation> -<translation id="628324801501145855">Төлеу әдісі параметрлерінде реттеу</translation> <translation id="6284292079994426700">26 x 38 дюйм</translation> <translation id="6284449872909111707">Мәтін және лезде хабар алмасу</translation> <translation id="6284517535531159884">Вариациялар дереккөзінің түрі</translation> @@ -3859,6 +3857,7 @@ <translation id="7639968568612851608">Қою сұр</translation> <translation id="7646681339175747202">Сіз жаңа ғана қолданған құпия сөз деректердің қолды болуы салдарынан жария етілді. Google Password Manager құпия сөзіңізді дереу өзгертуді ұсынады.</translation> <translation id="7647206758853451655">Басып шығару сапасы</translation> +<translation id="7648527891719919697">Бұл сайт блокталған күйі қалады, себебі <ph name="BEGIN_ANDROID_SETTINGS_LINK" />Android параметрлерінде<ph name="END_ANDROID_SETTINGS_LINK" /> күшейтілген қорғаныс қосылды. <ph name="BEGIN_LEARN_MORE_LINK" />Бұл ескерту туралы толық ақпарат<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7648992873808071793">Файлдарды осы құрылғыда сақтау</translation> <translation id="7653957176542370971">Төлем өңдегіш беті жабық.</translation> <translation id="7654909834015434372">Аннотацияларды өзгерткенде, бұл құжат бастапқыдағыдай бұрылып тұрады.</translation> @@ -4253,6 +4252,7 @@ <translation id="833262891116910667">Ерекшелеу</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> тіліндегі беттер аударылмайды</translation> <translation id="8339275256517065202">Сатып алуды Touch ID көмегімен аяқтаңыз.</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" /> (міндетті)</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Виртуалдық картаны тіркеудің диалогтік терезесі толық ашылды</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index 6f3f336..45c4ab5 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -681,7 +681,6 @@ <translation id="2161656808144014275">អត្ថបទ</translation> <translation id="2162620598375156287">ឥឡូវនេះ <ph name="CURRENT_PRICE" /> នៅលើ <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">សូមពិនិត្យមើលថាតើ <ph name="HOST_NAME" /> មានកំហុសអក្ខរាវិរុទ្ធឬអត់។</translation> -<translation id="2165700285977947082">បំពេញកាតសមាជិកដោយស្វ័យប្រវត្តិពី Google Wallet</translation> <translation id="2166049586286450108">ការចូលប្រើពេញលេញដោយអ្នកគ្រប់គ្រង</translation> <translation id="2166378884831602661">គេហទំព័រនេះមិនអាចផ្តល់ការតភ្ជាប់ដែលមានសុវត្ថិភាពទេ</translation> <translation id="2168151236314517198">ការបោះពុម្ពខ្លឹមសារនេះត្រូវបានទប់ស្កាត់ដោយគោលការណ៍របស់អ្នកគ្រប់គ្រង</translation> @@ -3057,7 +3056,6 @@ <translation id="6272383483618007430">Google បច្ចុប្បន្នភាព</translation> <translation id="6278015583149890680">Google ថាស និង OneDrive</translation> <translation id="6280223929691119688">មិនអាចដឹកជញ្ជូនផ្ទាល់ទៅអាសយដ្ឋាននេះបានទេ។ សូមជ្រើសរើសអាសយដ្ឋានផ្សេង។</translation> -<translation id="628324801501145855">គ្រប់គ្រងនៅក្នុងការកំណត់វិធីបង់ប្រាក់</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6284449872909111707">ការផ្ញើសារជាអក្សរ និងការផ្ញើសារភ្លាមៗ</translation> <translation id="6284517535531159884">ប្រភេទឯកសារកំណត់រចនាសម្ព័ន្ធកំណែប្រែ</translation> @@ -4261,6 +4259,7 @@ <translation id="833262891116910667">រំលេច</translation> <translation id="8339163506404995330">ទំព័រជាភាសា <ph name="LANGUAGE" /> នឹងមិនត្រូវបានបកប្រែទេ</translation> <translation id="8339275256517065202">បញ្ចប់ការទិញរបស់អ្នកដោយប្រើ Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" /> ចាំបាច់</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">បានបើកការចុះឈ្មោះកាតនិម្មិតពេញអេក្រង់</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index e86812936..bdff1d60 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -678,7 +678,6 @@ <translation id="2161656808144014275">ಪಠ್ಯ</translation> <translation id="2162620598375156287">ಇದೀಗ <ph name="CURRENT_PRICE" /><ph name="SOURCE_WEBSITE" /> ನಲ್ಲಿ</translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> ನ ಕಾಗುಣಿತ ತಪ್ಪಾಗಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.</translation> -<translation id="2165700285977947082">Google Wallet ನಿಂದ ಲಾಯಲ್ಟಿ ಕಾರ್ಡ್ಗಳನ್ನು ಆಟೋಫಿಲ್ ಮಾಡಿ</translation> <translation id="2166049586286450108">ಪೂರ್ಣ ನಿರ್ವಾಹಕ ಆ್ಯಕ್ಸೆಸ್</translation> <translation id="2166378884831602661">ಈ ಸೈಟ್ಗೆ ಸುರಕ್ಷಿತ ಸಂಪರ್ಕವನ್ನು ಒದಗಿಸಲಾಗುವುದಿಲ್ಲ</translation> <translation id="2168151236314517198">ನಿರ್ವಾಹಕರ ನೀತಿಯ ಪ್ರಕಾರ ಈ ವಿಷಯವನ್ನು ಪ್ರಿಂಟ್ ಮಾಡುವುದನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> @@ -3049,7 +3048,6 @@ <translation id="6272383483618007430">Google ಅಪ್ಡೇಟ್</translation> <translation id="6278015583149890680">Google Drive ಮತ್ತು OneDrive</translation> <translation id="6280223929691119688">ಈ ವಿಳಾಸಕ್ಕೆ ತಲುಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಬೇರೊಂದು ವಿಳಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.</translation> -<translation id="628324801501145855">ಪಾವತಿ ವಿಧಾನಗಳ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನಿರ್ವಹಿಸಿ</translation> <translation id="6284292079994426700">26 x 38 ಇಂಚು</translation> <translation id="6284449872909111707">ಪಠ್ಯ ಮತ್ತು ಇನ್ಸ್ಟಂಟ್ ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ</translation> <translation id="6284517535531159884">ವೇರಿಯೇಶನ್ಸ್ ಸೀಡ್ ಪ್ರಕಾರ</translation> @@ -4252,6 +4250,7 @@ <translation id="833262891116910667">ಹೈಲೈಟ್ ಮಾಡಿ</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> ನಲ್ಲಿನ ಪುಟಗಳನ್ನು ಅನುವಾದ ಮಾಡಲಾಗುವುದಿಲ್ಲ</translation> <translation id="8339275256517065202">Touch ID ಯನ್ನು ಬಳಸಿಕೊಂಡು ನಿಮ್ಮ ಖರೀದಿಯನ್ನು ಪೂರ್ಣಗೊಳಿಸಿ</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, ಅಗತ್ಯವಿದೆ</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">ಸಂಪೂರ್ಣ ಎತ್ತರದಲ್ಲಿ ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ನೋಂದಣಿಯನ್ನು ತೆರೆಯಲಾಗಿದೆ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index ffd67a934..bc648702 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">텍스트</translation> <translation id="2162620598375156287">이제 <ph name="SOURCE_WEBSITE" />에서 <ph name="CURRENT_PRICE" />에 판매됨</translation> <translation id="2164510882479075877"><ph name="HOST_NAME" />에 오타가 있는지 확인하세요.</translation> -<translation id="2165700285977947082">Google 월렛에서 포인트 카드 자동 완성</translation> <translation id="2166049586286450108">전체 관리자 액세스</translation> <translation id="2166378884831602661">사이트에 보안 연결할 수 없음</translation> <translation id="2168151236314517198">관리자 정책에서 이 콘텐츠 인쇄를 차단했습니다.</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google 업데이트</translation> <translation id="6278015583149890680">Google Drive 및 OneDrive</translation> <translation id="6280223929691119688">이 주소로 배달할 수 없습니다. 다른 주소를 선택하세요.</translation> -<translation id="628324801501145855">결제 수단 설정에서 관리</translation> <translation id="6284292079994426700">26x38인치</translation> <translation id="6284449872909111707">문자 메시지 및 채팅</translation> <translation id="6284517535531159884">버전 시드 유형</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">강조표시</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" />로 된 페이지를 번역하지 않습니다.</translation> <translation id="8339275256517065202">Touch ID를 사용하여 구매를 완료하세요.</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, 필수</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_YEAR" />/<ph name="EXPIRATION_MONTH" /></translation> <translation id="8344776605855290140">가상 카드 등록이 전체 높이로 열림</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index b8e1bce..10714a53 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Текст</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> сайтында эми <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> туура жазылганын текшериңиз.</translation> -<translation id="2165700285977947082">Google Капчыктагы туруктуу кардардын карталарынын маалыматын автоматтык түрдө толтуруңуз</translation> <translation id="2166049586286450108">Толугу менен администратордун уруксаты</translation> <translation id="2166378884831602661">Бул сайт коопсуз туташуу камсыздай албайт</translation> <translation id="2168151236314517198">Бул нерсени басып чыгаруу аракети администраторуңуздун саясаты менен бөгөттөлгөн</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive жана OneDrive</translation> <translation id="6280223929691119688">Бул дарекке жеткирүү мүмкүн эмес. Башка дарек тандаңыз.</translation> -<translation id="628324801501145855">Төлөм ыкмаларынын параметрлеринде тескеңиз</translation> <translation id="6284292079994426700">26 x 38 дюйм</translation> <translation id="6284449872909111707">SMS жөнөтүү жана ыкчам жазышуу</translation> <translation id="6284517535531159884">Модификациялар булагынын түрү</translation> @@ -4254,6 +4252,7 @@ <translation id="833262891116910667">Бөлүп көрсөтүү</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> тилиндеги барактар которулбайт</translation> <translation id="8339275256517065202">Бул нерсени Touch ID аркылуу сатып алыңыз</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" /> талаасын толтуруңуз</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Виртуалдык картаны каттоо диалогу толук экранда ачылды</translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index d16a4a6..463fe7e 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">ຂໍ້ຄວາມ</translation> <translation id="2162620598375156287">ຕອນນີ້ <ph name="CURRENT_PRICE" /> ຢູ່ <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">ກວດເບິ່ງວ່າມີການພິມຜິດໃນ <ph name="HOST_NAME" /> ຫຼືບໍ່.</translation> -<translation id="2165700285977947082">ຕື່ມຂໍ້ມູນບັດສະມາຊິກຈາກ Google Wallet ໂດຍອັດຕະໂນມັດ</translation> <translation id="2166049586286450108">ການເຂົ້າເຖິງແບບເຕັມຮູບແບບສຳລັບຜູ້ເບິ່ງແຍງ</translation> <translation id="2166378884831602661">ເວັບໄຊນີ້ບໍ່ສາມາດສະໜອງການເຊື່ອມຕໍ່ທີ່ປອດໄພໄດ້</translation> <translation id="2168151236314517198">ນະໂຍບາຍຄວາມເປັນສ່ວນຕົວບລັອກການພິມເນື້ອຫານີ້ໄວ້</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive ແລະ OneDrive</translation> <translation id="6280223929691119688">ບໍ່ສາມາດສົ່ງຫາທີ່ຢູ່ນີ້ໄດ້. ກະລຸນາເລືອກທີ່ຢູ່ອື່ນ.</translation> -<translation id="628324801501145855">ຈັດການໃນການຕັ້ງຄ່າວິທີການຈ່າຍເງິນ</translation> <translation id="6284292079994426700">26 x 38 ນິ້ວ</translation> <translation id="6284449872909111707">ຂໍ້ຄວາມ ແລະ ຂໍ້ຄວາມດ່ວນ</translation> <translation id="6284517535531159884">ປະເພດຂອງເມັດຮູບແບບ</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">ໄຮໄລ</translation> <translation id="8339163506404995330">ໜ້າຕ່າງໆໃນ <ph name="LANGUAGE" /> ຈະບໍ່ຖືກແປ</translation> <translation id="8339275256517065202">ດຳເນີນການຊື້ຂອງທ່ານໃຫ້ສຳເລັດໂດຍໃຊ້ Touch ID</translation> +<translation id="833935588477667012">ຕ້ອງລະບຸ <ph name="FIELD_LABEL" /></translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">ເປີດການລົງທະບຽນບັດສະເໝືອນແບບເຕັມຄວາມສູງແລ້ວ</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 187005a..92074ad 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekstas</translation> <translation id="2162620598375156287">Dabar <ph name="CURRENT_PRICE" /> svetainėje <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Patikrinkite, ar pavadinime <ph name="HOST_NAME" /> nėra klaidos.</translation> -<translation id="2165700285977947082">Automatiškai pildyti lojalumo korteles iš „Google Wallet“</translation> <translation id="2166049586286450108">Visateisė administratoriaus prieiga</translation> <translation id="2166378884831602661">Ši svetainė negali užtikrinti saugaus ryšio</translation> <translation id="2168151236314517198">Šio turinio spausdinimas yra blokuojamas remiantis administratoriaus politika</translation> @@ -3054,7 +3053,6 @@ <translation id="6272383483618007430">„Google“ naujinys</translation> <translation id="6278015583149890680">„Google“ disko ir „OneDrive“</translation> <translation id="6280223929691119688">Negalima pristatyti šiuo adresu. Pasirinkite kitą adresą.</translation> -<translation id="628324801501145855">Tvarkykite mokėjimo metodų nustatymuose</translation> <translation id="6284292079994426700">26 x 38 col.</translation> <translation id="6284449872909111707">Teksto ir tikralaikio pokalbio žinutės</translation> <translation id="6284517535531159884">Variantų šaltinio tipas</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 4de1800..65d5e11 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Teksts</translation> <translation id="2162620598375156287">Tagad cena vietnē <ph name="SOURCE_WEBSITE" /> ir <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877">Pārbaudiet, vai adresē <ph name="HOST_NAME" /> nav pareizrakstības kļūdas.</translation> -<translation id="2165700285977947082">Automātiski aizpildīt lojalitātes karšu datus no lietotnes Google maks</translation> <translation id="2166049586286450108">Pilna administratora piekļuve</translation> <translation id="2166378884831602661">Šī vietne nevar garantēt drošu savienojumu</translation> <translation id="2168151236314517198">Administratora politika bloķē šī satura drukāšanu</translation> @@ -3051,7 +3050,6 @@ <translation id="6272383483618007430">Google atjauninājums</translation> <translation id="6278015583149890680">Google diska un OneDrive</translation> <translation id="6280223929691119688">Nevar piegādāt uz šo adresi. Atlasiet citu adresi.</translation> -<translation id="628324801501145855">Pārvaldīt maksājuma veidus iestatījumos</translation> <translation id="6284292079994426700">26 x 38 collas</translation> <translation id="6284449872909111707">Īsziņas un tūlītējā ziņojumapmaiņa</translation> <translation id="6284517535531159884">Variantu izplatīšanas veids</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index e18cd4b..5a4fd9e4 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Текст</translation> <translation id="2162620598375156287">Сега <ph name="CURRENT_PRICE" /> на <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Проверете дали има печатна грешка во <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Пополнувајте ги картичките за лојалност автоматски од Google Wallet</translation> <translation id="2166049586286450108">Целосен пристап на администраторот</translation> <translation id="2166378884831602661">Сајтот не може да даде безбедна врска</translation> <translation id="2168151236314517198">Администраторското правило го блокира печатењето на содржиниве</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Ажурирање од Google</translation> <translation id="6278015583149890680">Google Drive и OneDrive</translation> <translation id="6280223929691119688">Не може да се достави на оваа адреса. Изберете друга.</translation> -<translation id="628324801501145855">Управувајте во поставките за начините на плаќање</translation> <translation id="6284292079994426700">26 x 38 инчи</translation> <translation id="6284449872909111707">Размена на SMS и инстант пораки</translation> <translation id="6284517535531159884">Тип извори на варијации</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index 17c0ec5..02e7172 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">വാചകം</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> -ൽ ഇപ്പോൾ <ph name="CURRENT_PRICE" />-ന് ലഭ്യം</translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> എന്നതിൽ അക്ഷരത്തെറ്റ് ഉണ്ടോ എന്ന് പരിശോധിക്കുക.</translation> -<translation id="2165700285977947082">Google Wallet-ൽ നിന്നുള്ള ലോയൽറ്റി കാർഡുകൾ സ്വയമേവ പൂരിപ്പിക്കുക</translation> <translation id="2166049586286450108">പൂർണ്ണമായ അഡ്മിൻ ആക്സസ്</translation> <translation id="2166378884831602661">ഈ സൈറ്റിന് സുരക്ഷിതമായ കണക്ഷൻ നൽകാനാകില്ല</translation> <translation id="2168151236314517198">ഈ ഉള്ളടക്കം പ്രിന്റ് ചെയ്യുന്നത് അഡ്മിൻ നയം ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google അപ്ഡേറ്റ്</translation> <translation id="6278015583149890680">Google Drive, OneDrive</translation> <translation id="6280223929691119688">ഈ വിലാസത്തിലേക്ക് ഡെലിവറി ചെയ്യാൻ കഴിയില്ല. മറ്റൊരു വിലാസം തിരഞ്ഞെടുക്കുക.</translation> -<translation id="628324801501145855">പേയ്മെന്റ് രീതികളുടെ ക്രമീകരണത്തിൽ മാനേജ് ചെയ്യുക</translation> <translation id="6284292079994426700">26 x 38 ഇഞ്ച്</translation> <translation id="6284449872909111707">ടെക്സ്റ്റ് ചെയ്യലും തൽക്ഷണ സന്ദേശമയയ്ക്കലും</translation> <translation id="6284517535531159884">വകഭേദങ്ങളുടെ സീഡ് തരം</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 85e4bc4..48b78e2 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Текст</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> дээр одоо <ph name="CURRENT_PRICE" /> байна</translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> үг үсгийн алдаатай бичигдсэн эсэхийг шалгана уу.</translation> -<translation id="2165700285977947082">Google Wallet-с лояалти картыг автоматаар бөглөнө үү</translation> <translation id="2166049586286450108">Админы бүрэн хандалт</translation> <translation id="2166378884831602661">Энэ сайтад холбогдоход аюултай</translation> <translation id="2168151236314517198">Энэ контентыг хэвлэх сонголтыг администраторын бодлогоор блоклосон байна</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Шинэчлэл</translation> <translation id="6278015583149890680">Google Драйв болон OneDrive</translation> <translation id="6280223929691119688">Энэ хаяг руу хүргэх боломжгүй тул өөр хаяг сонгоно уу.</translation> -<translation id="628324801501145855">Төлбөрийн хэрэгслийн тохиргооноос удирдах</translation> <translation id="6284292079994426700">26 x 38 инч</translation> <translation id="6284449872909111707">Мессеж, шуурхай мессеж</translation> <translation id="6284517535531159884">Хувилбарын үрийн төрөл</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">Тодруулах</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> хэл дээрх хуудсыг орчуулахгүй</translation> <translation id="8339275256517065202">Хүрэлтийн ID-г ашиглан худалдан авалтаа дуусгана уу</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, шаардлагатай</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Виртуал картын бүртгэлийг бүтэн өндрөөр нь нээсэн</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 5f557c16..3af0d43 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">मजकूर</translation> <translation id="2162620598375156287">आता <ph name="SOURCE_WEBSITE" /> वर <ph name="CURRENT_PRICE" /> मध्ये आहे</translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> मध्ये टायपो आहे का ते तपासा.</translation> -<translation id="2165700285977947082">Google Wallet मधून लॉयल्टी कार्ड ऑटोफिल करा</translation> <translation id="2166049586286450108">पूर्ण ॲडमिन ॲक्सेस</translation> <translation id="2166378884831602661">ही साइट सुरक्षित कनेक्शन प्रदान करू शकत नाही</translation> <translation id="2168151236314517198">अॅडमिनिस्ट्रेटर धोरणाद्वारे हा आशय प्रिंट करणे ब्लॉक केले आहे</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive आणि OneDrive</translation> <translation id="6280223929691119688">या पत्त्यावर देऊ शकत नाही. वेगळा पत्ता निवडा.</translation> -<translation id="628324801501145855">सेटिंग्जमध्ये पेमेंट पद्धती व्यवस्थापित करा</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6284449872909111707">एसएमएस आणि झटपट मेसेजिंग</translation> <translation id="6284517535531159884">व्हेरिएशन सीड प्रकार</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">हायलाइट</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" />मधील पेज भाषांतरीत केले जाणार नाही</translation> <translation id="8339275256517065202">टच आयडी वापरून तुमची खरेदी पूर्ण करा</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, आवश्यक आहे</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">व्हर्च्युअल कार्डची नोंदणी पूर्ण उंचीवर उघडली आहे</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index def9d08ad..467d64b 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Teks</translation> <translation id="2162620598375156287">Sekarang <ph name="CURRENT_PRICE" /> pada <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Semak jika terdapat kesilapan ejaan dalam <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Autolengkap kad kesetiaan daripada Google Wallet</translation> <translation id="2166049586286450108">Akses Penuh Pentadbir</translation> <translation id="2166378884831602661">Tapak ini tidak dapat menyediakan sambungan yang selamat</translation> <translation id="2168151236314517198">Pencetakan kandungan ini disekat oleh dasar pentadbir anda</translation> @@ -3054,7 +3053,6 @@ <translation id="6272383483618007430">Kemas Kini Google</translation> <translation id="6278015583149890680">Google Drive dan OneDrive</translation> <translation id="6280223929691119688">Tidak dapat menghantar ke alamat ini. Pilih alamat lain.</translation> -<translation id="628324801501145855">Urus dalam tetapan kaedah pembayaran</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6284449872909111707">Teks & Pemesejan Segera</translation> <translation id="6284517535531159884">Jenis Benih Variasi</translation> @@ -4257,6 +4255,7 @@ <translation id="833262891116910667">Serlahkan</translation> <translation id="8339163506404995330">Halaman dalam <ph name="LANGUAGE" /> tidak akan diterjemahkan</translation> <translation id="8339275256517065202">Lengkapkan pembelian anda menggunakan Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, diperlukan</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Pendaftaran kad maya dibuka pada ketinggian penuh</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 9f0ec1d..019613af 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -680,7 +680,6 @@ <translation id="2161656808144014275">စာသား</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> တွင်ယခု <ph name="CURRENT_PRICE" /> ဖြစ်သည်</translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> တွင် စာလုံးပေါင်းအမှား ရှိမရှိ စစ်ဆေးရန်။</translation> -<translation id="2165700285977947082">Google Wallet မှ အော်တိုဖြည့် ဖောက်သည်ကတ်များ</translation> <translation id="2166049586286450108">စီမံသူအပြည့်အဝ အသုံးပြုခွင့်</translation> <translation id="2166378884831602661">ဤဆိုက်သည် လုံခြုံသည့်ချိတ်ဆက်မှုကို စီစဉ်မပေးနိုင်ပါ</translation> <translation id="2168151236314517198">ဤအကြောင်းအရာ ပုံနှိပ်ထုတ်ယူခြင်းကို စီမံခန့်ခွဲသူမူဝါဒက ပိတ်ထားသည်</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive၊ OneDrive</translation> <translation id="6280223929691119688">ဤလိပ်စာသို့ ပို့၍မရပါ။ အခြားလိပ်စာတစ်ခုကို ရွေးပါ။</translation> -<translation id="628324801501145855">ငွေပေးချေနည်းလမ်း ဆက်တင်များတွင် စီမံရန်</translation> <translation id="6284292079994426700">၂၆ x ၃၈ လက်မ</translation> <translation id="6284449872909111707">စာတို၊ အမြန်မက်ဆေ့ဂျ်ပို့ခြင်း</translation> <translation id="6284517535531159884">မူကွဲရင်းမြစ်အမျိုးအစား</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index 0fc09e7..50148f63 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">पाठ</translation> <translation id="2162620598375156287">अहिले <ph name="SOURCE_WEBSITE" /> मा <ph name="CURRENT_PRICE" /> मा उपलब्ध छ</translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> मा कुनै हिज्जे गलत छ कि छैन भन्ने कुरा जाँच्नुहोस्।</translation> -<translation id="2165700285977947082">Google Wallet बाट लोयल्टी कार्डहरू अटोफिल गर्नुहोस्</translation> <translation id="2166049586286450108">पूर्ण प्रशासक पहुँच</translation> <translation id="2166378884831602661">यो साइटले सुरक्षित जडान प्रदान गर्न सक्दैन</translation> <translation id="2168151236314517198">एड्मिनले तोक्नुभएको नीतिअनुसार यो सामग्री प्रिन्ट गर्ने सुविधा ब्लक गरिएको छ</translation> @@ -3051,7 +3050,6 @@ <translation id="6272383483618007430">Google अपडेट</translation> <translation id="6278015583149890680">Google Drive र OneDrive</translation> <translation id="6280223929691119688">यो ठेगानामा डेलिभर गर्न सकिँदैन। कुनै अर्को ठेगाना चयन गर्नुहोस्।</translation> -<translation id="628324801501145855">भुक्तानी विधिसम्बन्धी सेटिङमा गई व्यवस्थापन गर्नुहोस्</translation> <translation id="6284292079994426700">२६ x ३८ इन्च</translation> <translation id="6284449872909111707">टेक्स्ट तथा इन्स्ट्यान्ट म्यासेजिङ</translation> <translation id="6284517535531159884">भेरिएसन सिडको प्रकार</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 5968851..f02b0e0 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekst</translation> <translation id="2162620598375156287">Nu <ph name="CURRENT_PRICE" /> op <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Check of <ph name="HOST_NAME" /> een typfout bevat.</translation> -<translation id="2165700285977947082">Klantenkaarten automatisch invullen vanuit Google Wallet</translation> <translation id="2166049586286450108">Volledige beheerderstoegang</translation> <translation id="2166378884831602661">Deze site kan geen beveiligde verbinding leveren</translation> <translation id="2168151236314517198">Het afdrukken van deze content is geblokkeerd op basis van het beheerdersbeleid</translation> @@ -3046,7 +3045,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive en OneDrive</translation> <translation id="6280223929691119688">Kan niet bezorgen op dit adres. Selecteer een ander adres.</translation> -<translation id="628324801501145855">Beheren in instellingen voor betaalmethoden</translation> <translation id="6284292079994426700">26 x 38 inch</translation> <translation id="6284449872909111707">Sms en chatten</translation> <translation id="6284517535531159884">Type variantseed</translation> @@ -4249,6 +4247,7 @@ <translation id="833262891116910667">Markeren</translation> <translation id="8339163506404995330">Pagina's in het <ph name="LANGUAGE" /> worden niet vertaald</translation> <translation id="8339275256517065202">Rond je aankoop af met Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, vereist</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Inschrijving via virtuele kaart is op volledige hoogte geopend</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index 5fc7932..bf34a36 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekst</translation> <translation id="2162620598375156287">Nå <ph name="CURRENT_PRICE" /> på <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Sjekk om det er en skrivefeil i <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Fyll ut stamkundekort fra Google Wallet automatisk</translation> <translation id="2166049586286450108">Full administratortilgang</translation> <translation id="2166378884831602661">Dette nettstedet tilbyr ikke sikre tilkoblinger</translation> <translation id="2168151236314517198">Utskrift av dette innholdet er blokkert på grunn av en administratorregel</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Oppdatering</translation> <translation id="6278015583149890680">Google Disk og OneDrive</translation> <translation id="6280223929691119688">Kan ikke levere til denne adressen. Velg en annen adresse.</translation> -<translation id="628324801501145855">Administrer i innstillingene for betalingsmåter</translation> <translation id="6284292079994426700">26 x 38 tommer</translation> <translation id="6284449872909111707">Tekstmeldinger og chat</translation> <translation id="6284517535531159884">Typer frøvarianter</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">Fremhev</translation> <translation id="8339163506404995330">Sider på <ph name="LANGUAGE" /> oversettes ikke</translation> <translation id="8339275256517065202">Fullfør kjøpet med Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, obligatorisk</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Registrering med virtuelt kort er åpnet i full høyde</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 3321fc7f..d329df7d 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">ଟେକ୍ସଟ୍</translation> <translation id="2162620598375156287">ବର୍ତ୍ତମାନ <ph name="SOURCE_WEBSITE" />ରେ <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" />ରେ ଟାଇପିଂ ତ୍ରୁଟି ଅଛି କି ନାହିଁ ଯାଞ୍ଚ କରନ୍ତୁ।</translation> -<translation id="2165700285977947082">Google Walletରୁ ଲୟାଲ୍ଟି କାର୍ଡଗୁଡ଼ିକୁ ଅଟୋଫିଲ କରନ୍ତୁ</translation> <translation id="2166049586286450108">ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟବସ୍ଥାପକ ଆକ୍ସେସ୍</translation> <translation id="2166378884831602661">ଏହି ସାଇଟ୍ ଏକ ସୁରକ୍ଷିତ ସଂଯୋଗ ପ୍ରଦାନ କରିପାରିବ ନାହିଁ</translation> <translation id="2168151236314517198">ଏହି ବିଷୟବସ୍ତୁକୁ ପ୍ରିଣ୍ଟ କରିବା ଆଡମିନିଷ୍ଟ୍ରେଟର୍ ନୀତି ଦ୍ୱାରା ବ୍ଲକ୍ କରାଯାଇଛି</translation> @@ -3049,7 +3048,6 @@ <translation id="6272383483618007430">Google ଅପଡେଟ୍</translation> <translation id="6278015583149890680">Google Drive ଏବଂ OneDrive</translation> <translation id="6280223929691119688">ଏହି ଠିକଣାକୁ ପହଞ୍ଚାଇପାରିବ ନାହିଁ। ଏକ ଭିନ୍ନ ଠିକଣା ଚୟନ କରନ୍ତୁ।</translation> -<translation id="628324801501145855">ପେମେଣ୍ଟ ପଦ୍ଧତି ସେଟିଂସରେ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="6284292079994426700">26 x 38 ଇଞ୍ଚ</translation> <translation id="6284449872909111707">ଟେକ୍ସଟ ଏବଂ ଇନଷ୍ଟାଣ୍ଟ ମେସେଜିଂ</translation> <translation id="6284517535531159884">ଭେରିଏସନ ସିଡ ପ୍ରକାର</translation> @@ -3856,6 +3854,7 @@ <translation id="7639968568612851608">ଗାଢ଼ ଧୂସର</translation> <translation id="7646681339175747202">ଆପଣ ଏବେ ବ୍ୟବହାର କରିଥିବା ପାସୱାର୍ଡ ଏକ ଡାଟା ଉଲ୍ଲଙ୍ଘନରେ ମିଳିଛି। Google Password Manager ବର୍ତ୍ତମାନ ଆପଣଙ୍କ ପାସୱାର୍ଡକୁ ପରିବର୍ତ୍ତନ କରିବା ପାଇଁ ସୁପାରିଶ କରେ।</translation> <translation id="7647206758853451655">ପ୍ରିଣ୍ଟ ଗୁଣବତ୍ତା</translation> +<translation id="7648527891719919697">ଆପଣ <ph name="BEGIN_ANDROID_SETTINGS_LINK" />Android ସେଟିଂସ<ph name="END_ANDROID_SETTINGS_LINK" />ରେ ଆଡଭାନ୍ସଡ ପ୍ରୋଟେକସନ ଚାଲୁ କରିଥିବା ଯୋଗୁଁ ଏହି ସାଇଟ ବ୍ଲକ ହୋଇ ରହିବ। <ph name="BEGIN_LEARN_MORE_LINK" />ଏହି ଚେତାବନୀ ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7648992873808071793">ଏହି ଡିଭାଇସ୍ରେ ଫାଇଲ୍ ଷ୍ଟୋର୍ କରନ୍ତୁ</translation> <translation id="7653957176542370971">ପେମେଣ୍ଟ ହ୍ୟାଣ୍ଡଲର୍ ସିଟ୍ ବନ୍ଦ ଅଛି</translation> <translation id="7654909834015434372">ଆପଣ ଏନୋଟେସନଗୁଡ଼ିକୁ ଏଡିଟ୍ କଲେ, ଏହି ଡକ୍ୟୁମେଣ୍ଟ ଏହାର ମୂଳ ରୋଟେସନକୁ ଫେରି ଆସିବ</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index e95a795..c8b50e7 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">ਲਿਖਤ</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> 'ਤੇ ਹੁਣ <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877">ਜਾਂਚ ਕਰੋ ਕਿ <ph name="HOST_NAME" /> ਵਿੱਚ ਕੋਈ ਟਾਈਪਿੰਗ ਸੰਬੰਧੀ ਗੜਬੜ ਤਾਂ ਨਹੀਂ ਹੈ।</translation> -<translation id="2165700285977947082">Google Wallet ਤੋਂ ਵਫ਼ਾਦਾਰੀ ਕਾਰਡ ਆਟੋਫਿਲ ਕਰੋ</translation> <translation id="2166049586286450108">ਪੂਰੀ ਪ੍ਰਸ਼ਾਸਕ ਪਹੁੰਚ</translation> <translation id="2166378884831602661">ਇਹ ਸਾਈਟ ਇੱਕ ਸੁਰੱਖਿਅਤ ਕਨੈਕਸ਼ਨ ਨਹੀਂ ਮੁਹੱਈਆ ਕਰਵਾ ਸਕਦੀ।</translation> <translation id="2168151236314517198">ਪ੍ਰਸ਼ਾਸਕ ਨੀਤੀ ਵੱਲੋਂ ਇਸ ਸਮੱਗਰੀ ਨੂੰ ਪ੍ਰਿੰਟ ਕਰਨਾ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ</translation> @@ -3049,7 +3048,6 @@ <translation id="6272383483618007430">Google ਅੱਪਡੇਟ</translation> <translation id="6278015583149890680">Google Drive ਅਤੇ OneDrive</translation> <translation id="6280223929691119688">ਇਸ ਪਤੇ 'ਤੇ ਅਦਾਇਗੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਕੋਈ ਵੱਖਰਾ ਪਤਾ ਚੁਣੋ।</translation> -<translation id="628324801501145855">ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਦੀਆਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="6284292079994426700">26 x 38 ਇੰਚ</translation> <translation id="6284449872909111707">ਲਿਖਤ ਅਤੇ ਤਤਕਾਲ ਸੁਨੇਹਾ ਭੇਜਣਾ</translation> <translation id="6284517535531159884">ਵਖਰੇਂਵੇ ਸੀਡ ਦੀ ਕਿਸਮ</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 6d8559b..5c834fe 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekstowe</translation> <translation id="2162620598375156287">Teraz za <ph name="CURRENT_PRICE" /> na <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Sprawdź, czy w adresie <ph name="HOST_NAME" /> nie ma błędu.</translation> -<translation id="2165700285977947082">Autouzupełnianie kart lojalnościowych z Portfela Google</translation> <translation id="2166049586286450108">Pełny dostęp administratora</translation> <translation id="2166378884831602661">Ta witryna nie umożliwia bezpiecznego połączenia</translation> <translation id="2168151236314517198">Drukowanie tej treści jest zablokowane przez zasadę administratora</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">na Dysku Google i w usłudze OneDrive</translation> <translation id="6280223929691119688">Nie można dostarczyć pod ten adres. Wybierz inny.</translation> -<translation id="628324801501145855">Zarządzaj w ustawieniach form płatności</translation> <translation id="6284292079994426700">26 x 38 cali</translation> <translation id="6284449872909111707">Wiadomości tekstowe i czat</translation> <translation id="6284517535531159884">Typ materiału wyjściowego dla odmian</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">Podświetlenie</translation> <translation id="8339163506404995330">Strony, których językiem jest <ph name="LANGUAGE" />, nie będą tłumaczone</translation> <translation id="8339275256517065202">Dokończ zakupy za pomocą Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, wymagane</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Rejestracja karty wirtualnej jest otwarta na całą wysokość</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index fdf61b1..d11262e 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Texto</translation> <translation id="2162620598375156287">Agora por <ph name="CURRENT_PRICE" /> nesta loja: <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Verifique se há um erro de digitação em <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Preencher automaticamente cartões fidelidade da Carteira do Google</translation> <translation id="2166049586286450108">Acesso completo de administrador</translation> <translation id="2166378884831602661">Não foi possível estabelecer uma conexão segura com este site</translation> <translation id="2168151236314517198">A impressão desse conteúdo está bloqueada pela política do administrador</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive e OneDrive</translation> <translation id="6280223929691119688">Não é possível entregar nesse endereço. Selecione um endereço diferente.</translation> -<translation id="628324801501145855">Gerenciar nas configurações de formas de pagamento</translation> <translation id="6284292079994426700">26 x 38 pol.</translation> <translation id="6284449872909111707">Mensagens de texto e instantâneas</translation> <translation id="6284517535531159884">Tipo de semente de variações</translation> @@ -3861,6 +3859,7 @@ <translation id="7639968568612851608">Cinza-escuro</translation> <translation id="7646681339175747202">A senha que você usou foi encontrada em um vazamento de dados. O Gerenciador de senhas do Google recomenda que você mude essa senha imediatamente.</translation> <translation id="7647206758853451655">Qualidade de impressão</translation> +<translation id="7648527891719919697">Este site vai continuar bloqueado porque a Proteção Avançada está ativada nas suas <ph name="BEGIN_ANDROID_SETTINGS_LINK" />configurações do Android<ph name="END_ANDROID_SETTINGS_LINK" />. <ph name="BEGIN_LEARN_MORE_LINK" />Saiba mais sobre este aviso<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7648992873808071793">Armazenar arquivos neste dispositivo</translation> <translation id="7653957176542370971">A página do gerenciador de pagamento está fechada</translation> <translation id="7654909834015434372">Quando você editar as anotações, este documento voltará à rotação original</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index fa1f3f0..bad7112ed 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Texto</translation> <translation id="2162620598375156287">Agora a <ph name="CURRENT_PRICE" /> em <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Verifique se existe algum erro ortográfico em <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Preencha automaticamente cartões de fidelidade da Carteira do Google</translation> <translation id="2166049586286450108">Acesso de gestor total</translation> <translation id="2166378884831602661">Este site não consegue fornecer uma ligação segura</translation> <translation id="2168151236314517198">A impressão deste conteúdo está bloqueada pela política do administrador.</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive e OneDrive</translation> <translation id="6280223929691119688">Não é possível entregar neste endereço. Selecione um diferente.</translation> -<translation id="628324801501145855">Faça a gestão nas definições de métodos de pagamento</translation> <translation id="6284292079994426700">26 x 38 pol.</translation> <translation id="6284449872909111707">Mensagens de texto e instantâneas</translation> <translation id="6284517535531159884">Tipo de semente das variações</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index fa82628..4f68b6e 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Text</translation> <translation id="2162620598375156287">Acum la <ph name="CURRENT_PRICE" /> pe <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Verifică dacă există vreo greșeală de scriere în <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Completează automat cardurile de fidelitate din Portofelul Google</translation> <translation id="2166049586286450108">Acces complet de administrare</translation> <translation id="2166378884831602661">Acest site nu poate oferi o conexiune sigură</translation> <translation id="2168151236314517198">Printarea acestui conținut este blocată de politica implementată de administrator</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Actualizare Google</translation> <translation id="6278015583149890680">Google Drive și OneDrive</translation> <translation id="6280223929691119688">Nu se poate livra la această adresă. Selectează altă adresă.</translation> -<translation id="628324801501145855">Gestionează în setările metodelor de plată</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6284449872909111707">Mesaje text și instantanee</translation> <translation id="6284517535531159884">Tipul valorii de bază pentru variante</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">Evidențiază</translation> <translation id="8339163506404995330">Paginile în <ph name="LANGUAGE" /> nu vor fi traduse</translation> <translation id="8339275256517065202">Finalizează achiziția folosind Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, obligatoriu</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Înregistrarea cardului virtual s-a deschis la înălțimea completă</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index fb9ffb88..89fc828 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Текст</translation> <translation id="2162620598375156287"><ph name="CURRENT_PRICE" /> на сайте <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Проверьте, нет ли опечаток в имени хоста <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Автоматически заполняйте данные карт постоянного клиента из Google Кошелька.</translation> <translation id="2166049586286450108">Доступ администратора ко всем данным</translation> <translation id="2166378884831602661">Этот сайт не может обеспечить безопасное подключение</translation> <translation id="2168151236314517198">Администратор запретил печатать этот контент.</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Диск и OneDrive</translation> <translation id="6280223929691119688">Невозможно доставить заказ по этому адресу. Выберите другой вариант.</translation> -<translation id="628324801501145855">Управляйте настройками способов оплаты.</translation> <translation id="6284292079994426700">26 x 38 дюймов</translation> <translation id="6284449872909111707">Текстовые и мгновенные сообщения</translation> <translation id="6284517535531159884">Тип файла конфигурации для модификации</translation> @@ -3611,7 +3609,7 @@ <translation id="7234585564776614047">Автозаполнение с помощью другого сервиса</translation> <translation id="7236417832106250253">Выполнено <ph name="PROGRESS_PERCENT" /> % | <ph name="ESTIMATED_REMAINING_TIME" /></translation> <translation id="7237166092326447040">Подарки и товары для особых случаев</translation> -<translation id="7237454422623102448">Открыть настройки системы</translation> +<translation id="7237454422623102448">Настройки системы</translation> <translation id="7237492777898608035">Больше не показывать такое сообщение для этого сайта</translation> <translation id="7240120331469437312">Альтернативное имя субъекта сертификата</translation> <translation id="7241863998525879494">Что изменится</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">Выделить</translation> <translation id="8339163506404995330">Страницы на этом языке (<ph name="LANGUAGE" />) не будут переводиться автоматически</translation> <translation id="8339275256517065202">Завершите покупку с помощью Touch ID.</translation> +<translation id="833935588477667012">Поле "<ph name="FIELD_LABEL" />". Его необходимо заполнить.</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Диалоговое окно создания виртуальной карты открыто на весь экран</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index 67c80f5..623989af 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">පාඨය</translation> <translation id="2162620598375156287">දැන් <ph name="SOURCE_WEBSITE" /> හි <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> හි ටයිප් කිරීමේ වරදක් තිබේදැයි බලන්න.</translation> -<translation id="2165700285977947082">Google Wallet වෙතින් ලැදියා කාඩ්පත් ස්වයංව පුරවන්න</translation> <translation id="2166049586286450108">පූර්ණ පරිපාලක ප්රවේශය</translation> <translation id="2166378884831602661">මෙම අඩවියට සුරක්ෂිත සබැඳුමක් සැපයීමට නොහැකිය</translation> <translation id="2168151236314517198">මෙම අන්තර්ගත මුද්රණය කිරීම පරිපාලක ප්රතිපත්තිය මගින් අබල කර ඇත</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google යාවත්කාලීන</translation> <translation id="6278015583149890680">Google Drive සහ OneDrive</translation> <translation id="6280223929691119688">මෙම ලිපිනයට බෙදා හැරීමට නොහැකිය. වෙනත් ලිපිනයක් තෝරන්න.</translation> -<translation id="628324801501145855">ගෙවීම් ක්රම සැකසීම් තුළ කළමනාකරණය කරන්න</translation> <translation id="6284292079994426700">අඟ 26 x 38</translation> <translation id="6284449872909111707">පාඨ සහ ක්ෂණික පණිවුඩ යැවීම</translation> <translation id="6284517535531159884">ප්රභේදන බිජ වර්ගය</translation> @@ -3860,6 +3858,7 @@ <translation id="7639968568612851608">තද අළු</translation> <translation id="7646681339175747202">ඔබ මේ දැන් භාවිතා කළ මුරපදය දත්ත කඩ කිරීමකින් සොයා ගන්නා ලදි. Google මුරපද කළමනාකරු ඔබේ මුරපදය දැන් වෙනස් කිරීම නිර්දේශ කරයි.</translation> <translation id="7647206758853451655">මුද්රණ ගුණත්වය</translation> +<translation id="7648527891719919697">ඔබ <ph name="BEGIN_ANDROID_SETTINGS_LINK" />Android සැකසීම්<ph name="END_ANDROID_SETTINGS_LINK" /> තුළ උසස් ආරක්ෂණය ක්රියාත්මක කර ඇති නිසා මෙම අඩවිය අවහිරව පවතිනු ඇත. <ph name="BEGIN_LEARN_MORE_LINK" />මෙම අනතුරු ඇඟවීම ගැන තව දැන ගන්න<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7648992873808071793">මෙම උපාංගය මත ගොනු ගබඩා කරන්න</translation> <translation id="7653957176542370971">ගෙවීම් හසුරුවන පත්රය වසා ඇත</translation> <translation id="7654909834015434372">ඔබ අනුසටහන් සංස්කරණය කරන විට, මෙම ලේඛනය එහි මුල් කරකැවීමට ආපසු යනු ඇත</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 52a78c9..853a953 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Text</translation> <translation id="2162620598375156287">Teraz <ph name="CURRENT_PRICE" /> na <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Skontrolujte, či nie je v názve <ph name="HOST_NAME" /> preklep.</translation> -<translation id="2165700285977947082">Automaticky dopĺňajte vernostné karty z Peňaženky Google</translation> <translation id="2166049586286450108">Úplný správcovský prístup</translation> <translation id="2166378884831602661">Tento web nedokáže poskytnúť zabezpečené pripojenie</translation> <translation id="2168151236314517198">Tlač tohto obsahu je zablokovaná pravidlom správcu</translation> @@ -3048,7 +3047,6 @@ <translation id="6272383483618007430">Aktualizácie Google</translation> <translation id="6278015583149890680">Disk Google a OneDrive</translation> <translation id="6280223929691119688">Doručenie na túto adresu nie je možné. Vyberte inú adresu.</translation> -<translation id="628324801501145855">Spravujte v nastaveniach spôsobov platby</translation> <translation id="6284292079994426700">26 × 38 palcov</translation> <translation id="6284449872909111707">Textové a četové správy</translation> <translation id="6284517535531159884">Typ zdroja variácií</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 6086b2c..11b71ca 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Besedilo</translation> <translation id="2162620598375156287">Zdaj <ph name="CURRENT_PRICE" /> na <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Preverite, ali so v <ph name="HOST_NAME" /> tipkarske napake.</translation> -<translation id="2165700285977947082">Samodejno izpolnjevanje kartic zvestobe iz Google Denarnice</translation> <translation id="2166049586286450108">Polni skrbniški dostop</translation> <translation id="2166378884831602661">To spletno mesto ne more zagotoviti varne povezave</translation> <translation id="2168151236314517198">Tiskanje te vsebine je blokiral pravilnik skrbnika.</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Posodobitve</translation> <translation id="6278015583149890680">Google Drive in OneDrive</translation> <translation id="6280223929691119688">Dostava na ta naslov ni mogoča. Izberite drugega.</translation> -<translation id="628324801501145855">Upravljajte v nastavitvah plačilnih sredstev</translation> <translation id="6284292079994426700">26 x 38 palcev</translation> <translation id="6284449872909111707">Pošiljanje sporočil SMS in neposredno sporočanje</translation> <translation id="6284517535531159884">Vrsta semen podrazličic</translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 3c7b90ac..08bc2552c 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Teksti</translation> <translation id="2162620598375156287">Tani <ph name="CURRENT_PRICE" /> te <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Kontrollo nëse ka ndonjë gabim drejtshkrimor në <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Plotëso automatikisht kartat e besnikërisë nga "Portofoli i Google"</translation> <translation id="2166049586286450108">Qasja e plotë e administratorit</translation> <translation id="2166378884831602661">Ky sajt nuk mund të ofrojë një lidhje të sigurt</translation> <translation id="2168151236314517198">Printimi i kësaj përmbajtjeje është bllokuar nga politika e administratorit</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Përditësimi i Google</translation> <translation id="6278015583149890680">"Diskut të Google" dhe OneDrive</translation> <translation id="6280223929691119688">Nuk mund të dorëzohet në këtë adresë. Zgjidh një adresë tjetër.</translation> -<translation id="628324801501145855">Menaxho te cilësimet e mënyrave të pagesës</translation> <translation id="6284292079994426700">26 x 38 inç</translation> <translation id="6284449872909111707">Mesazhe me tekst dhe të çastit</translation> <translation id="6284517535531159884">Lloji i burimit të varianteve</translation> @@ -3859,6 +3857,7 @@ <translation id="7639968568612851608">Gri e errët</translation> <translation id="7646681339175747202">Fjalëkalimi që sapo përdore u gjet në një nxjerrje të paautorizuar të të dhënave. "Menaxheri i fjalëkalimeve i Google" rekomandon që ta ndryshosh fjalëkalimin tënd tani.</translation> <translation id="7647206758853451655">Cilësia e printimit</translation> +<translation id="7648527891719919697">Ky sajt do të qëndrojë i bllokuar sepse ke të aktivizuar "Mbrojtjen e përparuar" te <ph name="BEGIN_ANDROID_SETTINGS_LINK" />Cilësimet e Android<ph name="END_ANDROID_SETTINGS_LINK" />. <ph name="BEGIN_LEARN_MORE_LINK" />Mëso më shumë për këtë paralajmërim<ph name="END_LEARN_MORE_LINK" /></translation> <translation id="7648992873808071793">Ruaji skedarët në këtë pajisje</translation> <translation id="7653957176542370971">Fleta e përpunuesit të pagesës është mbyllur</translation> <translation id="7654909834015434372">Kur redakton shënimet, ky dokument do të kthehet te rrotullimi i vet fillestar</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 932f600..6c86a8d 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Tekst</translation> <translation id="2162620598375156287">Cena je sada <ph name="CURRENT_PRICE" /> na <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Uverite se da <ph name="HOST_NAME" /> ne sadrži slovne greške.</translation> -<translation id="2165700285977947082">Automatsko popunjavanje kartica lojalnosti iz Google novčanika</translation> <translation id="2166049586286450108">Potpuni administratorski pristup</translation> <translation id="2166378884831602661">Ovaj sajt ne može da pruži bezbednu vezu</translation> <translation id="2168151236314517198">Smernice administratora blokiraju štampanje ovog sadržaja</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google ažuriranje</translation> <translation id="6278015583149890680">Google disk i OneDrive</translation> <translation id="6280223929691119688">Isporuka na ovu adresu nije moguća. Izaberite drugu adresu.</translation> -<translation id="628324801501145855">Upravljajte u podešavanjima načina plaćanja</translation> <translation id="6284292079994426700">26×38 in</translation> <translation id="6284449872909111707">Razmena tekstualnih i trenutnih poruka</translation> <translation id="6284517535531159884">Tip početne vrednosti varijacija</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 9e55cc7..0f3f8de7 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Текст</translation> <translation id="2162620598375156287">Цена је сада <ph name="CURRENT_PRICE" /> на <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Уверите се да <ph name="HOST_NAME" /> не садржи словне грешке.</translation> -<translation id="2165700285977947082">Аутоматско попуњавање картица лојалности из Google новчаника</translation> <translation id="2166049586286450108">Потпуни администраторски приступ</translation> <translation id="2166378884831602661">Овај сајт не може да пружи безбедну везу</translation> <translation id="2168151236314517198">Смернице администратора блокирају штампање овог садржаја</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google ажурирање</translation> <translation id="6278015583149890680">Google диск и OneDrive</translation> <translation id="6280223929691119688">Испорука на ову адресу није могућа. Изаберите другу адресу.</translation> -<translation id="628324801501145855">Управљајте у подешавањима начина плаћања</translation> <translation id="6284292079994426700">26×38 in</translation> <translation id="6284449872909111707">Размена текстуалних и тренутних порука</translation> <translation id="6284517535531159884">Тип почетне вредности варијација</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index cd19c2c..ca47c34 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Text</translation> <translation id="2162620598375156287">Nu <ph name="CURRENT_PRICE" /> på <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Kontrollera om det finns ett stavfel i <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Autofyll stamkundskort från Google Wallet</translation> <translation id="2166049586286450108">Fullständig administrativ åtkomst</translation> <translation id="2166378884831602661">Webbplatsen kan inte tillhandahålla en säker anslutning</translation> <translation id="2168151236314517198">Utskrift av detta innehåll blockeras av en administratörspolicy</translation> @@ -2354,7 +2353,7 @@ <translation id="5052517576853118371">Aktiva ämnen</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Om du vill skicka den här filen med Närdelning ska du frigöra utrymme (<ph name="DISK_SPACE_SIZE" />) på enheten}other{Om du vill skicka de här filerna med Närdelning ska du frigöra utrymme (<ph name="DISK_SPACE_SIZE" />) på enheten}}</translation> <translation id="505757197798929356">Ange anledning till att den öppnas (obligatoriskt)</translation> -<translation id="5060419232449737386">Bildtextinställningar</translation> +<translation id="5060419232449737386">Textningsinställningar</translation> <translation id="5060483733937416656">Du har valt att verifiera dig med Windows Hello på webbplatser där <ph name="PROVIDER_ORIGIN" /> används. Den här leverantören kan ha lagrat uppgifter om din betalningsmetod som du kan <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Menade du <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Utskriftshistorik</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive och OneDrive</translation> <translation id="6280223929691119688">Det går inte att leverera till den här adressen. Välj en annan adress.</translation> -<translation id="628324801501145855">Hantera i inställningarna för betalningsmetoder</translation> <translation id="6284292079994426700">26 x 38 tum</translation> <translation id="6284449872909111707">Sms och snabbmeddelanden</translation> <translation id="6284517535531159884">Typ av variantkälla</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">Markera</translation> <translation id="8339163506404995330">Sidor på <ph name="LANGUAGE" /> översätts inte</translation> <translation id="8339275256517065202">Slutför köpet med Touch ID</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, obligatoriskt</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Registreringen av virtuella kort har öppnats över hela skärmen</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 5ec1f91..4b63cab1 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Maandishi</translation> <translation id="2162620598375156287">Bei ya sasa ni <ph name="CURRENT_PRICE" /> kwenye <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Angalia iwapo kuna kosa la hijai kwenye <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Jaza kiotomatiki kadi za kutuza uaminifu kwenye Pochi ya Google</translation> <translation id="2166049586286450108">Idhini Kamili ya Kufikia ya Msimamizi</translation> <translation id="2166378884831602661">Tovuti hii haiwezi kutoa muunganisho salama</translation> <translation id="2168151236314517198">Kuchapisha maudhui haya kumezuiwa na sera ya msimamizi</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Sasisho kwa Google</translation> <translation id="6278015583149890680">Hifadhi ya Google na OneDrive</translation> <translation id="6280223929691119688">Haiwezi kuwasilisha kwenye anwani hii. Chagua anwani tofauti.</translation> -<translation id="628324801501145855">Dhibiti katika mipangilio ya njia za kulipa</translation> <translation id="6284292079994426700">Inchi 26 x 38</translation> <translation id="6284449872909111707">Ujumbe wa Papo Hapo na wa Maandishi</translation> <translation id="6284517535531159884">Variations Seed Type</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index 1895639..ae03a0c2a 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">உரை</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> தளத்தில் தற்போதைய விலை: <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> என்பதில் எழுத்துப்பிழை உள்ளதா எனப் பார்க்கவும்.</translation> -<translation id="2165700285977947082">Google Walletடில் உள்ள லாயல்டி கார்டுகளைத் தானாக நிரப்புங்கள்</translation> <translation id="2166049586286450108">முழு நிர்வாகி அணுகல்</translation> <translation id="2166378884831602661">இந்தத் தளத்தால் பாதுகாப்பான இணைப்பை வழங்க முடியவில்லை</translation> <translation id="2168151236314517198">இந்த உள்ளடக்கத்தை அச்சிடுவது நிர்வாகக் கொள்கையின்படி தடுக்கப்பட்டுள்ளது</translation> @@ -3048,7 +3047,6 @@ <translation id="6272383483618007430">Google புதுப்பிப்பு</translation> <translation id="6278015583149890680">Google Drive மற்றும் OneDrive</translation> <translation id="6280223929691119688">இந்த முகவரிக்கு டெலிவரி செய்ய முடியாது. வேறு முகவரியைத் தேர்ந்தெடுக்கவும்.</translation> -<translation id="628324801501145855">பேமெண்ட் முறைக்கான அமைப்புகளில் நிர்வகியுங்கள்</translation> <translation id="6284292079994426700">26 x 38 இன்ச்</translation> <translation id="6284449872909111707">மெசேஜ் மற்றும் உடனடி மெசேஜிங்</translation> <translation id="6284517535531159884">வேரியேஷன் சீடு வகை</translation> @@ -4251,6 +4249,7 @@ <translation id="833262891116910667">தனிப்படுத்தும்</translation> <translation id="8339163506404995330"><ph name="LANGUAGE" /> மொழியில் உள்ள பக்கங்கள் மொழிபெயர்க்கப்படாது</translation> <translation id="8339275256517065202">Touch ID மூலம் பர்ச்சேஸை நிறைவுசெய்யுங்கள்</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />, தேவை</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">விர்ச்சுவல் கார்டைப் பதிவுசெய்யும் உரையாடல் முழுத் திரையில் திறக்கப்பட்டது</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 164938c..ad16678 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -674,7 +674,6 @@ <translation id="2161656808144014275">వచనం</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" />లోని ప్రస్తుత ధర <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" />లో అక్షర దోషం ఉందేమో చెక్ చేయండి.</translation> -<translation id="2165700285977947082">Google Wallet నుండి లాయల్టీ కార్డ్లను ఆటోఫిల్ చేయండి</translation> <translation id="2166049586286450108">పూర్తి నిర్వాహక యాక్సెస్</translation> <translation id="2166378884831602661">ఈ సైట్ సురక్షితమైన కనెక్షన్ను అందించలేకపోయింది</translation> <translation id="2168151236314517198">ఈ కంటెంట్ ప్రింట్ చేయడాన్ని అడ్మినిస్ట్రేటర్ పాలసీ బ్లాక్ చేసింది</translation> @@ -3048,7 +3047,6 @@ <translation id="6272383483618007430">Google అప్డేట్</translation> <translation id="6278015583149890680">Google Drive, OneDrive</translation> <translation id="6280223929691119688">ఈ అడ్రస్కు డెలివరీ చేయడం సాధ్యం కాదు. వేరే అడ్రస్ను ఎంచుకోండి.</translation> -<translation id="628324801501145855">పేమెంట్ ఆప్షన్ల సెట్టింగ్లను మేనేజ్ చేయండి</translation> <translation id="6284292079994426700">26 x 38 అంగుళాలు</translation> <translation id="6284449872909111707">టెక్స్ట్ & ఇన్స్టంట్ మెసేజింగ్</translation> <translation id="6284517535531159884">వేరియేషన్ల సీడ్ రకం</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index 82da72f9..d00fab3e 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">ข้อความ</translation> <translation id="2162620598375156287">ตอนนี้ราคา <ph name="CURRENT_PRICE" /> ใน <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">ตรวจสอบว่ามีการพิมพ์ผิดใน <ph name="HOST_NAME" /> ไหม</translation> -<translation id="2165700285977947082">ป้อนข้อมูลบัตรสะสมคะแนนจาก Google Wallet โดยอัตโนมัติ</translation> <translation id="2166049586286450108">การเข้าถึงระดับผู้ดูแลระบบโดยสมบูรณ์</translation> <translation id="2166378884831602661">เว็บไซต์นี้ไม่สามารถให้การเชื่อมต่อที่ปลอดภัย</translation> <translation id="2168151236314517198">นโยบายของผู้ดูแลระบบบล็อกการพิมพ์เนื้อหานี้ไว้</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google อัปเดต</translation> <translation id="6278015583149890680">Google ไดรฟ์และ OneDrive</translation> <translation id="6280223929691119688">ไม่สามารถนำส่งสินค้าไปยังที่อยู่นี้ โปรดเลือกที่อยู่อื่น</translation> -<translation id="628324801501145855">จัดการในการตั้งค่าวิธีการชำระเงิน</translation> <translation id="6284292079994426700">26 x 38 นิ้ว</translation> <translation id="6284449872909111707">การส่ง SMS และการรับส่งข้อความโต้ตอบแบบทันที</translation> <translation id="6284517535531159884">ประเภท Seed ของรูปแบบ</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 1d6e538b..645b454 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Metin</translation> <translation id="2162620598375156287">Şimdi <ph name="SOURCE_WEBSITE" /> sitesinde <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> yazımında hata olup olmadığını kontrol edin.</translation> -<translation id="2165700285977947082">Google Cüzdan'daki bağlılık kartlarını otomatik doldurun</translation> <translation id="2166049586286450108">Tam Yönetici Erişimi</translation> <translation id="2166378884831602661">Bu site güvenli bağlantı sağlayamıyor</translation> <translation id="2168151236314517198">Bu içeriğin yazdırılması yönetici politikası tarafından engellendi</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Güncelleme</translation> <translation id="6278015583149890680">Google Drive ve OneDrive</translation> <translation id="6280223929691119688">Bu adrese teslimat yapılamıyor. Farklı bir adres seçin.</translation> -<translation id="628324801501145855">Ödeme yöntemleri ayarlarında yönetin</translation> <translation id="6284292079994426700">26 x 38 inç</translation> <translation id="6284449872909111707">Metin Mesajlar ve Anlık Mesajlaşma</translation> <translation id="6284517535531159884">Varyasyon Çekirdek Türü</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index fd87c6a..4795f2e8 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Текст</translation> <translation id="2162620598375156287">Поточна ціна на сайті <ph name="SOURCE_WEBSITE" /> – <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877">Перевірте, чи немає описки в імені хосту <ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Автоматично заповнюйте форми даними карток постійного покупця з Google Гаманця</translation> <translation id="2166049586286450108">Повний адміністративний доступ</translation> <translation id="2166378884831602661">Цей сайт не може забезпечити захищене з’єднання</translation> <translation id="2168151236314517198">Адміністратор заборонив друкувати цей контент</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Оновлення Google</translation> <translation id="6278015583149890680">Google Диск і OneDrive</translation> <translation id="6280223929691119688">Неможливо доставити замовлення за цією адресою. Укажіть іншу адресу.</translation> -<translation id="628324801501145855">Керуйте в налаштуваннях способів оплати</translation> <translation id="6284292079994426700">26 x 38 дюйм.</translation> <translation id="6284449872909111707">Обмін текстовими повідомленнями й чати</translation> <translation id="6284517535531159884">Тип вихідного варіанта</translation> @@ -4256,6 +4254,7 @@ <translation id="833262891116910667">Виділити</translation> <translation id="8339163506404995330">Сторінки цією мовою (<ph name="LANGUAGE" />) не перекладатимуться</translation> <translation id="8339275256517065202">Завершіть покупку за допомогою Touch ID</translation> +<translation id="833935588477667012">Обов’язкове поле "<ph name="FIELD_LABEL" />"</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">Вікно реєстрації віртуальної картки відкрито на всю висоту</translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 4a9bc6a4..dee72d8 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">متن</translation> <translation id="2162620598375156287">اب <ph name="CURRENT_PRICE" /><ph name="SOURCE_WEBSITE" /> پر</translation> <translation id="2164510882479075877">چیک کریں کہ آیا <ph name="HOST_NAME" /> میں کوئی ہجوں کی کوئی غلطی تو نہیں۔</translation> -<translation id="2165700285977947082">Google والٹ سے لائلٹی کارڈز کو آٹو فل کریں</translation> <translation id="2166049586286450108">منتظم کیلئے مکمل رسائی</translation> <translation id="2166378884831602661">یہ سائٹ ایک محفوظ کنکشن فراہم نہیں کر سکتی ہے</translation> <translation id="2168151236314517198">منتظم کی پالیسی کے تحت، اس مواد کی پرنٹنگ مسدود ہے</translation> @@ -3055,7 +3054,6 @@ <translation id="6272383483618007430">Google اپ ڈیٹ</translation> <translation id="6278015583149890680">Google Drive اور OneDrive</translation> <translation id="6280223929691119688">اس پتے پر ڈیلیوری نہیں ہو سکتی۔ کوئی مختلف پتہ منتخب کریں۔</translation> -<translation id="628324801501145855">ادائیگی کے طریقوں کی ترتیبات میں نظم کریں</translation> <translation id="6284292079994426700">26 x 38 انچ</translation> <translation id="6284449872909111707">ٹیکسٹ اور فوری پیغام رسانی</translation> <translation id="6284517535531159884">تغیرات سیڈ کی قسم</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 11303eb..38fe34c 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -678,7 +678,6 @@ <translation id="2161656808144014275">Matn</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> saytidagi joriy narxi: <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877"><ph name="HOST_NAME" /> xatosiz kiritilganini tekshiring.</translation> -<translation id="2165700285977947082">Google Walletdagi sodiq mijoz kartalarini avtomatik kiritish</translation> <translation id="2166049586286450108">Administratorning barcha ma’lumotlarga to‘liq ruxsati</translation> <translation id="2166378884831602661">Bu sayt bilan xavfsiz aloqa o‘rnatib bo‘lmaydi</translation> <translation id="2168151236314517198">Bu kontentni chop etishni administrator taqiqlagan</translation> @@ -3047,7 +3046,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive va OneDrive</translation> <translation id="6280223929691119688">Bu manzilga yetkazib bera olmaymiz. Boshqa manzilni tanlang.</translation> -<translation id="628324801501145855">Toʻlov usullari sozlamalarida boshqarish</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6284449872909111707">Matnli va tezkor xabar almashish</translation> <translation id="6284517535531159884">Talqin turlari</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index efe7606..20ec9e7 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Văn bản</translation> <translation id="2162620598375156287">Hiện có giá <ph name="CURRENT_PRICE" /> trên <ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Kiểm tra xem có lỗi chính tả trong <ph name="HOST_NAME" /> hay không.</translation> -<translation id="2165700285977947082">Tự động điền thẻ khách hàng thân thiết từ Google Wallet</translation> <translation id="2166049586286450108">Quyền truy cập quản trị đầy đủ</translation> <translation id="2166378884831602661">Trang web này không thể cung cấp kết nối an toàn</translation> <translation id="2168151236314517198">Chính sách của quản trị viên không cho phép in nội dung này</translation> @@ -3053,7 +3052,6 @@ <translation id="6272383483618007430">Google Update</translation> <translation id="6278015583149890680">Google Drive và OneDrive</translation> <translation id="6280223929691119688">Không thể phân phối đến địa chỉ này. Chọn một địa chỉ khác.</translation> -<translation id="628324801501145855">Quản lý trong phần cài đặt phương thức thanh toán</translation> <translation id="6284292079994426700">26 x 38 inch</translation> <translation id="6284449872909111707">Nhắn tin văn bản và nhắn tin nhanh</translation> <translation id="6284517535531159884">Loại khởi đầu biến thể</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 50e7853..d44952a4 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">文字</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> 上的现价为 <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877">检查 <ph name="HOST_NAME" /> 中是否有拼写错误。</translation> -<translation id="2165700285977947082">自动填充 Google 钱包中的会员卡</translation> <translation id="2166049586286450108">完全的管理员访问权限</translation> <translation id="2166378884831602661">此网站无法提供安全连接</translation> <translation id="2168151236314517198">管理员政策禁止打印此内容</translation> @@ -3048,7 +3047,6 @@ <translation id="6272383483618007430">Google 更新</translation> <translation id="6278015583149890680">Google 云端硬盘和 OneDrive</translation> <translation id="6280223929691119688">无法递送到此地址。请另选一个地址。</translation> -<translation id="628324801501145855">在支付方式设置中管理</translation> <translation id="6284292079994426700">26 x 38 英寸</translation> <translation id="6284449872909111707">短信与即时通讯</translation> <translation id="6284517535531159884">变体版本种子类型</translation> @@ -4251,6 +4249,7 @@ <translation id="833262891116910667">突出显示</translation> <translation id="8339163506404995330">系统不会自动翻译源语言为<ph name="LANGUAGE" />的网页</translation> <translation id="8339275256517065202">请使用触控 ID 完成购买交易</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />(必填)</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">虚拟卡注册对话框已全屏打开</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 54003009..6f0f7cf6 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">文字</translation> <translation id="2162620598375156287">在 <ph name="SOURCE_WEBSITE" /> 上現售 <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877">請檢查 <ph name="HOST_NAME" /> 中是否有錯字。</translation> -<translation id="2165700285977947082">自動填入「Google 錢包」中的會員卡</translation> <translation id="2166049586286450108">完整管理存取權</translation> <translation id="2166378884831602661">這個網站無法提供安全連線</translation> <translation id="2168151236314517198">管理員政策禁止列印此內容</translation> @@ -3052,7 +3051,6 @@ <translation id="6272383483618007430">Google 更新</translation> <translation id="6278015583149890680">「Google 雲端硬碟」和 OneDrive</translation> <translation id="6280223929691119688">無法送貨至此地址,請選取其他地址。</translation> -<translation id="628324801501145855">在付款方法設定中管理</translation> <translation id="6284292079994426700">26 x 38 吋</translation> <translation id="6284449872909111707">短訊和即時通訊</translation> <translation id="6284517535531159884">種子類型變化版本</translation> @@ -4255,6 +4253,7 @@ <translation id="833262891116910667">突顯嘅內容</translation> <translation id="8339163506404995330">系統將不會自動翻譯來源語言為<ph name="LANGUAGE" />的網頁</translation> <translation id="8339275256517065202">使用 Touch ID 完成購買交易</translation> +<translation id="833935588477667012"><ph name="FIELD_LABEL" />,必填</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">虛擬卡註冊宜家顯示喺成個畫面</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index a1561a43..f2d8563 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -678,7 +678,6 @@ <translation id="2161656808144014275">文字</translation> <translation id="2162620598375156287">「<ph name="SOURCE_WEBSITE" />」目前售價 <ph name="CURRENT_PRICE" /></translation> <translation id="2164510882479075877">請檢查 <ph name="HOST_NAME" /> 中是否有錯字。</translation> -<translation id="2165700285977947082">自動填入 Google 錢包中的會員卡</translation> <translation id="2166049586286450108">完整管理員存取權</translation> <translation id="2166378884831602661">這個網站無法提供安全連線</translation> <translation id="2168151236314517198">系統管理員政策禁止列印此內容</translation> @@ -3051,7 +3050,6 @@ <translation id="6272383483618007430">Google 更新</translation> <translation id="6278015583149890680">Google 雲端硬碟和 OneDrive</translation> <translation id="6280223929691119688">快遞無法送貨到這個地址,請改用其他地址。</translation> -<translation id="628324801501145855">在付款方式設定中管理</translation> <translation id="6284292079994426700">26 x 38 吋</translation> <translation id="6284449872909111707">文字與即時通訊</translation> <translation id="6284517535531159884">種子類型變化版本</translation> @@ -4254,6 +4252,7 @@ <translation id="833262891116910667">醒目顯示</translation> <translation id="8339163506404995330">系統將不會翻譯<ph name="LANGUAGE" />網頁</translation> <translation id="8339275256517065202">使用 Touch ID 完成購買交易</translation> +<translation id="833935588477667012">「<ph name="FIELD_LABEL" />」為必填欄位</translation> <translation id="8339463238135163999"><ph name="DESCRIPTION" /><ph name="SEPARATOR" /><ph name="TIMESTMAP" /></translation> <translation id="8340095855084055290"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation> <translation id="8344776605855290140">虛擬卡片註冊對話方塊已開啟,並顯示在整個畫面上</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 7a91e20..4337d38 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -679,7 +679,6 @@ <translation id="2161656808144014275">Umbhalo</translation> <translation id="2162620598375156287">Manje ngu-<ph name="CURRENT_PRICE" /> ku-<ph name="SOURCE_WEBSITE" /></translation> <translation id="2164510882479075877">Hlola uma kunephutha lokuthayipha ku-<ph name="HOST_NAME" />.</translation> -<translation id="2165700285977947082">Gcwalisa ngokuzenzakalela amakhadi obuqotho kusukela kuGoogle Wallet</translation> <translation id="2166049586286450108">Ukufinyelela okugcwele komqondisi</translation> <translation id="2166378884831602661">Leli sayithi alikwazi ukunikeza ukuxhumeka okuvikelekile</translation> <translation id="2168151236314517198">Ukuphrinta lokhu okuqukethwe kuvinjelwe inqubomgomo yomlawuli</translation> @@ -3050,7 +3049,6 @@ <translation id="6272383483618007430">Isibuyekezo se-Google</translation> <translation id="6278015583149890680">IGoogle Drive ne-OneDrive</translation> <translation id="6280223929691119688">Ayikwazi ukuletha kuleli kheli. Khetha ikheli elihlukile.</translation> -<translation id="628324801501145855">Lawula amasethingi ezindlela zokukhokha</translation> <translation id="6284292079994426700">U-26 x 38 phakathi</translation> <translation id="6284449872909111707">Umbhalo kanye Nemiyalezo Esheshayo</translation> <translation id="6284517535531159884">Ukuhlukahluka Kohlobo Lwembewu</translation>
diff --git a/components/supervised_user/core/browser/remote_web_approvals_manager_unittest.cc b/components/supervised_user/core/browser/remote_web_approvals_manager_unittest.cc index a7a54e5..6c112ae0 100644 --- a/components/supervised_user/core/browser/remote_web_approvals_manager_unittest.cc +++ b/components/supervised_user/core/browser/remote_web_approvals_manager_unittest.cc
@@ -17,7 +17,9 @@ #include "components/prefs/testing_pref_service.h" #include "components/safe_search_api/fake_url_checker_client.h" #include "components/supervised_user/core/browser/permission_request_creator.h" +#include "components/supervised_user/core/browser/supervised_user_preferences.h" #include "components/supervised_user/core/browser/supervised_user_settings_service.h" +#include "components/supervised_user/core/browser/supervised_user_sync_data_fake.h" #include "components/supervised_user/core/browser/supervised_user_url_filter.h" #include "components/supervised_user/core/browser/supervised_user_utils.h" #include "components/supervised_user/test_support/supervised_user_url_filter_test_utils.h" @@ -25,8 +27,11 @@ #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" +namespace supervised_user { namespace { +using test::UrlStatus; + class AsyncResultHolder { public: AsyncResultHolder() = default; @@ -53,8 +58,7 @@ // TODO(agawronska): Check if this can be a real mock. // Mocks PermissionRequestCreator to test the async responses. -class MockPermissionRequestCreator - : public supervised_user::PermissionRequestCreator { +class MockPermissionRequestCreator : public PermissionRequestCreator { public: MockPermissionRequestCreator() = default; @@ -91,11 +95,11 @@ std::vector<SuccessCallback> callbacks_; }; -} // namespace - class RemoteWebApprovalsManagerTest : public ::testing::Test { protected: RemoteWebApprovalsManagerTest() { + RegisterProfilePrefs(pref_service_.registry()); + sync_data_fake_.Init(); filter_.SetURLCheckerClient( std::make_unique<safe_search_api::FakeURLCheckerClient>()); } @@ -106,32 +110,37 @@ ~RemoteWebApprovalsManagerTest() override = default; - supervised_user::RemoteWebApprovalsManager& remote_web_approvals_manager() { + RemoteWebApprovalsManager& remote_web_approvals_manager() { return remote_web_approvals_manager_; } - void RequestApproval(const GURL& url, - AsyncResultHolder* result_holder, - supervised_user::FilteringBehaviorReason reason = - supervised_user::FilteringBehaviorReason::DEFAULT) { - supervised_user::UrlFormatter url_formatter(filter_, reason); + void RequestApproval( + const GURL& url, + AsyncResultHolder* result_holder, + FilteringBehaviorReason reason = FilteringBehaviorReason::DEFAULT) { + UrlFormatter url_formatter(filter_, reason); remote_web_approvals_manager_.RequestApproval( url, url_formatter, base::BindOnce(&AsyncResultHolder::SetResult, base::Unretained(result_holder))); } - supervised_user::SupervisedUserURLFilter& filter() { return filter_; } + SupervisedUserURLFilter& filter() { return filter_; } + + test::SupervisedUserSyncDataFake<TestingPrefServiceSimple>& sync_data_fake() { + return sync_data_fake_; + } private: base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; TestingPrefServiceSimple pref_service_; - supervised_user::SupervisedUserURLFilter filter_ = - supervised_user::SupervisedUserURLFilter( - pref_service_, - std::make_unique<supervised_user::FakeURLFilterDelegate>()); - supervised_user::RemoteWebApprovalsManager remote_web_approvals_manager_; + test::SupervisedUserSyncDataFake<TestingPrefServiceSimple> sync_data_fake_{ + pref_service_}; + SupervisedUserURLFilter filter_ = + SupervisedUserURLFilter(pref_service_, + std::make_unique<FakeURLFilterDelegate>()); + RemoteWebApprovalsManager remote_web_approvals_manager_; }; TEST_F(RemoteWebApprovalsManagerTest, CreatePermissionRequest) { @@ -192,13 +201,12 @@ // Add an entry in for the test url in the blocklist in order to get the // unstriped url in the approval. - std::map<std::string, bool> url_map; - url_map.emplace(url.host(), false); - filter().SetManualHosts(url_map); + sync_data_fake().SetManualHosts({{url.host(), UrlStatus::kBlocked}}); + filter().UpdateManualHosts(); + { AsyncResultHolder result_holder; - RequestApproval(url, &result_holder, - supervised_user::FilteringBehaviorReason::MANUAL); + RequestApproval(url, &result_holder, FilteringBehaviorReason::MANUAL); ASSERT_EQ(1u, creator->requested_urls().size()); EXPECT_EQ(url.spec(), creator->requested_urls()[0].spec()); @@ -209,8 +217,7 @@ { AsyncResultHolder result_holder; - RequestApproval(url, &result_holder, - supervised_user::FilteringBehaviorReason::MANUAL); + RequestApproval(url, &result_holder, FilteringBehaviorReason::MANUAL); ASSERT_EQ(1u, creator->requested_urls().size()); EXPECT_EQ(url.spec(), creator->requested_urls()[0].spec()); @@ -224,3 +231,6 @@ EXPECT_TRUE(result_holder.GetResult()); } } + +} // namespace +} // namespace supervised_user
diff --git a/components/supervised_user/core/browser/supervised_user_service.cc b/components/supervised_user/core/browser/supervised_user_service.cc index b2407b3..b8f4392 100644 --- a/components/supervised_user/core/browser/supervised_user_service.cc +++ b/components/supervised_user/core/browser/supervised_user_service.cc
@@ -301,15 +301,7 @@ } void SupervisedUserService::UpdateManualHosts() { - const base::Value::Dict& dict = - user_prefs_->GetDict(prefs::kSupervisedUserManualHosts); - std::map<std::string, bool> host_map; - for (auto&& [host, value] : dict) { - DCHECK(value.is_bool()); - host_map[host] = value.GetIfBool().value_or(false); - } - - url_filter_->SetManualHosts(std::move(host_map)); + url_filter_->UpdateManualHosts(); for (SupervisedUserServiceObserver& observer : observer_list_) { observer.OnURLFilterChanged(); }
diff --git a/components/supervised_user/core/browser/supervised_user_sync_data_fake.h b/components/supervised_user/core/browser/supervised_user_sync_data_fake.h index d0e9d89..a0bd6180 100644 --- a/components/supervised_user/core/browser/supervised_user_sync_data_fake.h +++ b/components/supervised_user/core/browser/supervised_user_sync_data_fake.h
@@ -108,17 +108,27 @@ } } + // Updates manual host list of a url filter. + void SetManualHosts( + const std::map<std::string, test::UrlStatus>& exceptions) { + SetManualList(exceptions, prefs::kSupervisedUserManualHosts); + } + // Updates manual url list of a url filter. void SetManualUrls(const std::map<std::string, test::UrlStatus>& exceptions) { + SetManualList(exceptions, prefs::kSupervisedUserManualURLs); + } + + private: + void SetManualList(const std::map<std::string, test::UrlStatus>& exceptions, + std::string_view list_name) { base::Value::Dict dict; for (auto& [url, status] : exceptions) { dict.Set(url, base::Value(static_cast<bool>(status))); } - pref_service_->SetSupervisedUserPref(prefs::kSupervisedUserManualURLs, - dict.Clone()); + pref_service_->SetSupervisedUserPref(std::string(list_name), dict.Clone()); } - private: raw_ptr<TestingPrefService> pref_service_; PrefChangeRegistrar registrar_; };
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter.cc b/components/supervised_user/core/browser/supervised_user_url_filter.cc index e6a18d1..58acb3e 100644 --- a/components/supervised_user/core/browser/supervised_user_url_filter.cc +++ b/components/supervised_user/core/browser/supervised_user_url_filter.cc
@@ -606,26 +606,23 @@ return RunAsyncChecker(url, std::move(callback)); } -void SupervisedUserURLFilter::SetManualHosts( - std::map<std::string, bool> host_map) { - // TODO(b/305229682): Update this method to received the two +void SupervisedUserURLFilter::UpdateManualHosts() { + // TODO(crbug.com/305229682): Update this method to handle the two // parental lists. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + blocked_host_list_.clear(); + allowed_host_list_.clear(); - std::set<std::string> new_blocked_host_list; - std::set<std::string> new_allowed_host_list; - - for (const auto& host_entry : host_map) { - if (host_entry.second) { - new_allowed_host_list.emplace(host_entry.first); + for (auto&& [host, value] : + user_prefs_->GetDict(prefs::kSupervisedUserManualHosts)) { + DCHECK(value.is_bool()); + if (value.GetIfBool().value_or(false)) { + allowed_host_list_.emplace(host); } else { - new_blocked_host_list.emplace(host_entry.first); + blocked_host_list_.emplace(host); } } - blocked_host_list_ = std::move(new_blocked_host_list); - allowed_host_list_ = std::move(new_allowed_host_list); - statistics_.blocked_hosts_count = blocked_host_list_.size(); statistics_.allowed_hosts_count = allowed_host_list_.size(); }
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter.h b/components/supervised_user/core/browser/supervised_user_url_filter.h index 84aaf288..90ff9a5 100644 --- a/components/supervised_user/core/browser/supervised_user_url_filter.h +++ b/components/supervised_user/core/browser/supervised_user_url_filter.h
@@ -206,10 +206,9 @@ FilteringContext filtering_context = FilteringContext::kDefault, std::optional<ui::PageTransition> transition_type = std::nullopt); - // Sets the set of manually allowed or blocked hosts. - void SetManualHosts(std::map<std::string, bool> host_map); - - // Refreshes data structures that hold manually configured url exceptions. + // Refreshes data structures that hold manually configured url and host + // exceptions. + void UpdateManualHosts(); void UpdateManualUrls(); // Returns summary of url filtering settings.
diff --git a/components/supervised_user/core/browser/supervised_user_url_filter_unittest.cc b/components/supervised_user/core/browser/supervised_user_url_filter_unittest.cc index fcbff73..ca18ede 100644 --- a/components/supervised_user/core/browser/supervised_user_url_filter_unittest.cc +++ b/components/supervised_user/core/browser/supervised_user_url_filter_unittest.cc
@@ -102,10 +102,9 @@ }; TEST_F(SupervisedUserURLFilterTest, Basic) { - std::map<std::string, bool> hosts; - hosts["*.google.com"] = true; + sync_data_fake_.SetManualHosts({{"*.google.com", UrlStatus::kAllowed}}); + filter_.UpdateManualHosts(); - filter_.SetManualHosts(std::move(hosts)); sync_data_fake_.SetWebFilterType(WebFilterType::kCertainSites); EXPECT_TRUE(IsURLAllowlisted("http://google.com")); @@ -128,10 +127,9 @@ } TEST_F(SupervisedUserURLFilterTest, EffectiveURL) { - std::map<std::string, bool> hosts; - hosts["example.com"] = true; + sync_data_fake_.SetManualHosts({{"example.com", UrlStatus::kAllowed}}); + filter_.UpdateManualHosts(); - filter_.SetManualHosts(std::move(hosts)); sync_data_fake_.SetWebFilterType(WebFilterType::kCertainSites); ASSERT_TRUE(IsURLAllowlisted("http://example.com")); @@ -205,11 +203,10 @@ } TEST_F(SupervisedUserURLFilterTest, Inactive) { - sync_data_fake_.SetWebFilterType(WebFilterType::kAllowAllSites); - std::map<std::string, bool> hosts; - hosts["google.com"] = true; + sync_data_fake_.SetManualHosts({{"google.com", UrlStatus::kAllowed}}); + filter_.UpdateManualHosts(); - filter_.SetManualHosts(std::move(hosts)); + sync_data_fake_.SetWebFilterType(WebFilterType::kAllowAllSites); // If the filter is inactive, every URL should be allowed. EXPECT_TRUE(IsURLAllowlisted("http://google.com")); @@ -217,22 +214,21 @@ } TEST_F(SupervisedUserURLFilterTest, IPAddress) { - std::map<std::string, bool> hosts; - hosts["123.123.123.123"] = true; - - filter_.SetManualHosts(std::move(hosts)); sync_data_fake_.SetWebFilterType(WebFilterType::kCertainSites); + sync_data_fake_.SetManualHosts({{"123.123.123.123", UrlStatus::kAllowed}}); + filter_.UpdateManualHosts(); + EXPECT_TRUE(IsURLAllowlisted("http://123.123.123.123/")); EXPECT_FALSE(IsURLAllowlisted("http://123.123.123.124/")); } TEST_F(SupervisedUserURLFilterTest, Canonicalization) { // We assume that the hosts and URLs are already canonicalized. - std::map<std::string, bool> hosts; - hosts["www.moose.org"] = true; - hosts["www.xn--n3h.net"] = true; - filter_.SetManualHosts(std::move(hosts)); + sync_data_fake_.SetManualHosts({{"www.moose.org", UrlStatus::kAllowed}, + {"www.xn--n3h.net", UrlStatus::kAllowed}}); + filter_.UpdateManualHosts(); + sync_data_fake_.SetManualUrls( {{"http://www.example.com/foo/", UrlStatus::kAllowed}, {"http://www.example.com/%C3%85t%C3%B8mstr%C3%B6m", @@ -363,15 +359,13 @@ } TEST_F(SupervisedUserURLFilterTest, PatternsWithoutConflicts) { - std::map<std::string, bool> hosts; - // The third rule is redundant with the first, but it's not a conflict // since they have the same value (allow). - hosts["*.google.com"] = true; - hosts["calendar.google.com"] = false; - hosts["mail.google.com"] = true; + sync_data_fake_.SetManualHosts({{"*.google.com", UrlStatus::kAllowed}, + {"calendar.google.com", UrlStatus::kBlocked}, + {"mail.google.com", UrlStatus::kAllowed}}); + filter_.UpdateManualHosts(); - filter_.SetManualHosts(std::move(hosts)); sync_data_fake_.SetWebFilterType(WebFilterType::kCertainSites); EXPECT_TRUE(IsURLAllowlisted("http://www.google.com/foo/")); @@ -394,12 +388,12 @@ // First and second rule always conflicting. // The fourth rule conflicts with the first for "www.google.com" host. // Blocking then takes precedence. - hosts["*.google.com"] = true; - hosts["calendar.google.com"] = false; - hosts["mail.google.com"] = true; - hosts["www.google.*"] = false; + sync_data_fake_.SetManualHosts({{"*.google.com", UrlStatus::kAllowed}, + {"calendar.google.com", UrlStatus::kBlocked}, + {"mail.google.com", UrlStatus::kAllowed}, + {"www.google.*", UrlStatus::kBlocked}}); + filter_.UpdateManualHosts(); - filter_.SetManualHosts(std::move(hosts)); sync_data_fake_.SetWebFilterType(WebFilterType::kCertainSites); EXPECT_FALSE(IsURLAllowlisted("http://www.google.com/foo/")); @@ -445,10 +439,9 @@ } TEST_F(SupervisedUserURLFilterTest, Reason) { - std::map<std::string, bool> hosts; - hosts["youtube.com"] = true; - hosts["*.google.*"] = true; - filter_.SetManualHosts(std::move(hosts)); + sync_data_fake_.SetManualHosts({{"youtube.com", UrlStatus::kAllowed}, + {"*.google.*", UrlStatus::kAllowed}}); + filter_.UpdateManualHosts(); sync_data_fake_.SetManualUrls( {{"https://youtube.com/robots.txt", UrlStatus::kBlocked}, @@ -519,7 +512,7 @@ class SupervisedUserURLFilteringWithConflictsTest : public testing::TestWithParam<std::tuple< - std::map<std::string, bool>, + std::map<std::string, UrlStatus>, std::optional< SupervisedUserURLFilter::FilteringSubdomainConflictType>>> { public: @@ -556,9 +549,10 @@ PatternsWithSubdomainConflicts) { base::HistogramTester histogram_tester; - auto host_map = std::get<0>(GetParam()); auto conflict_type = std::get<1>(GetParam()); - filter_.SetManualHosts(std::move(host_map)); + + sync_data_fake_.SetManualHosts(std::get<0>(GetParam())); + filter_.UpdateManualHosts(); EXPECT_FALSE(IsURLAllowlisted("https://www.google.com")); @@ -582,8 +576,9 @@ PatternWithoutConflictOnEarlyExit) { base::HistogramTester histogram_tester; // The host map is empty but the url map contains an exact match. - std::map<std::string, bool> host_map; - filter_.SetManualHosts(std::move(host_map)); + sync_data_fake_.SetManualHosts({}); + filter_.UpdateManualHosts(); + sync_data_fake_.SetManualUrls( {{"https://www.google.com", UrlStatus::kAllowed}}); filter_.UpdateManualUrls(); @@ -607,96 +602,105 @@ testing::Values( /* Only trivial subdomain conflicts: */ std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"www.google.com", true}, {"https://google.com", false}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"www.google.com", UrlStatus::kAllowed}, + {"https://google.com", UrlStatus::kBlocked}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictOnly), std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"www.google.com", false}, {"https://google.com", true}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"www.google.com", UrlStatus::kBlocked}, + {"https://google.com", UrlStatus::kAllowed}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictOnly), std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"http://www.google.*", false}, {"google.*", true}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"http://www.google.*", UrlStatus::kBlocked}, + {"google.*", UrlStatus::kAllowed}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictOnly), std::make_tuple( // The collision happens because of the trivial subdomain collision // between google.com and other entries. - /* host_map= */ std::map<std::string, bool>( - {{"https://www.google.com", false}, - {"google.com", true}, - {"www.google.com", false}, - {"http://www.google.com", false}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"https://www.google.com", UrlStatus::kBlocked}, + {"google.com", UrlStatus::kAllowed}, + {"www.google.com", UrlStatus::kBlocked}, + {"http://www.google.com", UrlStatus::kBlocked}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictOnly), std::make_tuple( // The collision happens because of the trivial subdomain collision // between https://google.com and www.google.com. - /* host_map= */ std::map<std::string, bool>( - {{"https://google.com", false}, - {"www.google.com", true}, - {"*.google.*", false}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"https://google.com", UrlStatus::kBlocked}, + {"www.google.com", UrlStatus::kAllowed}, + {"*.google.*", UrlStatus::kBlocked}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictOnly), std::make_tuple( // The collision happens because of the trivial subdomain collision // between https://google.com and www.google.com. - std::map<std::string, bool>({{"https://www.google.com", false}, - {"www.google.*", false}, - {"google.com", true}}), + std::map<std::string, UrlStatus>( + {{"https://www.google.com", UrlStatus::kBlocked}, + {"www.google.*", UrlStatus::kBlocked}, + {"google.com", UrlStatus::kAllowed}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictOnly), /* Only other conflicts: */ std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"http://www.google.com", false}, {"*.google.*", true}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"http://www.google.com", UrlStatus::kBlocked}, + {"*.google.*", UrlStatus::kAllowed}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kOtherConflictOnly), std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"*.google.com", false}, {"www.google.com", true}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"*.google.com", UrlStatus::kBlocked}, + {"www.google.com", UrlStatus::kAllowed}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kOtherConflictOnly), std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"http://www.google.com", false}, {"www.google.*", true}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"http://www.google.com", UrlStatus::kBlocked}, + {"www.google.*", UrlStatus::kAllowed}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kOtherConflictOnly), std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"http://google.com", false}, - {"https://google.com", true}, - {"*.google.com", true}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"http://google.com", UrlStatus::kBlocked}, + {"https://google.com", UrlStatus::kAllowed}, + {"*.google.com", UrlStatus::kAllowed}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kOtherConflictOnly), /* No conflicts: */ std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"http://google.com", false}, {"www.google.com", false}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"http://google.com", UrlStatus::kBlocked}, + {"www.google.com", UrlStatus::kBlocked}}), std::nullopt), /* Mix of www-subdomain conflicts and other conflicts */ std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"https://google.com", false}, - {"www.google.com", true}, - {"*.google.com", true}}), // Other conflict entry + /* host_map= */ std::map<std::string, UrlStatus>( + {{"https://google.com", UrlStatus::kBlocked}, + {"www.google.com", UrlStatus::kAllowed}, + {"*.google.com", + UrlStatus::kAllowed}}), // Other conflict entry SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictAndOtherConflict), std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"https://google.com", true}, - {"www.google.com", false}, - {"*.google.*", true}}), // Other conflict entry + /* host_map= */ std::map<std::string, UrlStatus>( + {{"https://google.com", UrlStatus::kAllowed}, + {"www.google.com", UrlStatus::kBlocked}, + {"*.google.*", UrlStatus::kAllowed}}), // Other conflict entry SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictAndOtherConflict), std::make_tuple( - /* host_map= */ std::map<std::string, bool>( - {{"https://www.google.com", true}, - {"google.com", false}, - {"google.*", true}, // Other conflict entry - {"*.google.*", false}}), + /* host_map= */ std::map<std::string, UrlStatus>( + {{"https://www.google.com", UrlStatus::kAllowed}, + {"google.com", UrlStatus::kBlocked}, + {"google.*", UrlStatus::kAllowed}, // Other conflict entry + {"*.google.*", UrlStatus::kBlocked}}), SupervisedUserURLFilter::FilteringSubdomainConflictType:: kTrivialSubdomainConflictAndOtherConflict))); @@ -758,7 +762,9 @@ } TEST_P(SupervisedUserURLFilterMetricsTest, RecordsTopLevelMetricsForAllow) { - filter_.SetManualHosts({{"http://example.com", true}}); + sync_data_fake_.SetManualHosts({{"http://example.com", UrlStatus::kAllowed}}); + filter_.UpdateManualHosts(); + sync_data_fake_.SetWebFilterType(WebFilterType::kCertainSites); ASSERT_TRUE(filter_.GetFilteringBehaviorWithAsyncChecks( @@ -780,7 +786,8 @@ TEST_P(SupervisedUserURLFilterMetricsTest, RecordsTopLevelMetricsForBlockManual) { - filter_.SetManualHosts({{"http://example.com", false}}); + sync_data_fake_.SetManualHosts({{"http://example.com", UrlStatus::kBlocked}}); + filter_.UpdateManualHosts(); sync_data_fake_.SetWebFilterType(WebFilterType::kAllowAllSites); ASSERT_TRUE(filter_.GetFilteringBehaviorWithAsyncChecks(
diff --git a/components/supervised_user/core/browser/supervised_user_utils_unittest.cc b/components/supervised_user/core/browser/supervised_user_utils_unittest.cc index 10c5f02..c2deea6 100644 --- a/components/supervised_user/core/browser/supervised_user_utils_unittest.cc +++ b/components/supervised_user/core/browser/supervised_user_utils_unittest.cc
@@ -10,36 +10,46 @@ #include "components/prefs/testing_pref_service.h" #include "components/safe_search_api/fake_url_checker_client.h" #include "components/supervised_user/core/browser/proto/parent_access_callback.pb.h" +#include "components/supervised_user/core/browser/supervised_user_preferences.h" +#include "components/supervised_user/core/browser/supervised_user_sync_data_fake.h" #include "components/supervised_user/core/browser/supervised_user_url_filter.h" #include "components/supervised_user/test_support/supervised_user_url_filter_test_utils.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" namespace supervised_user { +namespace { + +using test::UrlStatus; class SupervisedUserUtilsTest : public ::testing::Test { public: SupervisedUserUtilsTest() { + RegisterProfilePrefs(pref_service_.registry()); + sync_data_fake_.Init(); filter_.SetURLCheckerClient( std::make_unique<safe_search_api::FakeURLCheckerClient>()); } ~SupervisedUserUtilsTest() override = default; - supervised_user::SupervisedUserURLFilter& filter() { return filter_; } + SupervisedUserURLFilter& filter() { return filter_; } + test::SupervisedUserSyncDataFake<TestingPrefServiceSimple>& sync_data_fake() { + return sync_data_fake_; + } private: TestingPrefServiceSimple pref_service_; - supervised_user::SupervisedUserURLFilter filter_ = - supervised_user::SupervisedUserURLFilter( - pref_service_, - std::make_unique<FakeURLFilterDelegate>()); + test::SupervisedUserSyncDataFake<TestingPrefServiceSimple> sync_data_fake_{ + pref_service_}; + SupervisedUserURLFilter filter_ = + SupervisedUserURLFilter(pref_service_, + std::make_unique<FakeURLFilterDelegate>()); }; TEST_F(SupervisedUserUtilsTest, StripOnDefaultFilteringBehaviour) { - supervised_user::FilteringBehaviorReason reason = - supervised_user::FilteringBehaviorReason::DEFAULT; - supervised_user::UrlFormatter url_formatter(filter(), reason); + FilteringBehaviorReason reason = FilteringBehaviorReason::DEFAULT; + UrlFormatter url_formatter(filter(), reason); GURL full_url("http://www.example.com"); GURL stripped_url("http://example.com"); @@ -49,9 +59,8 @@ TEST_F(SupervisedUserUtilsTest, StripOnManualFilteringBehaviourWithoutConflict) { - supervised_user::FilteringBehaviorReason reason = - supervised_user::FilteringBehaviorReason::MANUAL; - supervised_user::UrlFormatter url_formatter(filter(), reason); + FilteringBehaviorReason reason = FilteringBehaviorReason::MANUAL; + UrlFormatter url_formatter(filter(), reason); GURL full_url("http://www.example.com"); GURL stripped_url("http://example.com"); @@ -61,15 +70,14 @@ TEST_F(SupervisedUserUtilsTest, SkipStripOnManualFilteringBehaviourWithConflict) { - supervised_user::FilteringBehaviorReason reason = - supervised_user::FilteringBehaviorReason::MANUAL; + FilteringBehaviorReason reason = FilteringBehaviorReason::MANUAL; GURL full_url("http://www.example.com"); // Add an conflicting entry in the blocklist. - std::map<std::string, bool> url_map; - url_map.emplace(full_url.host(), false); - filter().SetManualHosts(url_map); - supervised_user::UrlFormatter url_formatter(filter(), reason); + sync_data_fake().SetManualHosts({{full_url.host(), UrlStatus::kBlocked}}); + filter().UpdateManualHosts(); + + UrlFormatter url_formatter(filter(), reason); EXPECT_EQ(full_url, url_formatter.FormatUrl(full_url)); } @@ -77,8 +85,8 @@ TEST_F(SupervisedUserUtilsTest, ParseParentAccessCallbackDecodingError) { std::string invalid_base64_message = "*INVALID*CHARS"; ParentAccessCallbackParsedResult result = - supervised_user::ParentAccessCallbackParsedResult:: - ParseParentAccessCallbackResult(invalid_base64_message); + ParentAccessCallbackParsedResult::ParseParentAccessCallbackResult( + invalid_base64_message); EXPECT_TRUE(result.GetError().has_value()); EXPECT_EQ(ParentAccessWidgetError::kDecodingError, result.GetError().value()); } @@ -86,8 +94,8 @@ TEST_F(SupervisedUserUtilsTest, ParseParentAccessCallbackParsingError) { std::string base64_non_pacp_message = base::Base64Encode("random_message"); ParentAccessCallbackParsedResult result = - supervised_user::ParentAccessCallbackParsedResult:: - ParseParentAccessCallbackResult(base64_non_pacp_message); + ParentAccessCallbackParsedResult::ParseParentAccessCallbackResult( + base64_non_pacp_message); EXPECT_TRUE(result.GetError().has_value()); EXPECT_EQ(ParentAccessWidgetError::kParsingError, result.GetError().value()); } @@ -109,12 +117,13 @@ base::Base64Encode(parent_access_callback.SerializeAsString()); ParentAccessCallbackParsedResult response = - supervised_user::ParentAccessCallbackParsedResult:: - ParseParentAccessCallbackResult(base64_approve_pacp_message); + ParentAccessCallbackParsedResult::ParseParentAccessCallbackResult( + base64_approve_pacp_message); EXPECT_TRUE(response.GetCallback().has_value()); EXPECT_EQ(kids::platform::parentaccess::client::proto::ParentAccessCallback:: CallbackCase::kOnParentVerified, response.GetCallback().value().callback_case()); } +} // namespace } // namespace supervised_user
diff --git a/components/sync/model/client_tag_based_data_type_processor_unittest.cc b/components/sync/model/client_tag_based_data_type_processor_unittest.cc index 7bb4664..fdf87391 100644 --- a/components/sync/model/client_tag_based_data_type_processor_unittest.cc +++ b/components/sync/model/client_tag_based_data_type_processor_unittest.cc
@@ -209,11 +209,6 @@ FakeDataTypeSyncBridge::OnSyncPaused(); } - std::string GetStorageKey(const EntityData& entity_data) override { - get_storage_key_call_count_++; - return FakeDataTypeSyncBridge::GetStorageKey(entity_data); - } - sync_pb::EntitySpecifics TrimAllSupportedFieldsFromRemoteSpecifics( const sync_pb::EntitySpecifics& entity_specifics) const override { if (entity_specifics.has_preference()) { @@ -239,7 +234,6 @@ int merge_call_count() const { return merge_call_count_; } int apply_call_count() const { return apply_call_count_; } - int get_storage_key_call_count() const { return get_storage_key_call_count_; } int commit_failures_count() const { return commit_failures_count_; } bool sync_started() const { return sync_started_; } @@ -301,7 +295,6 @@ // The number of times MergeFullSyncData has been called. int merge_call_count_ = 0; int apply_call_count_ = 0; - int get_storage_key_call_count_ = 0; int commit_failures_count_ = 0; CommitAttemptFailedBehavior commit_attempt_failed_behaviour_ = @@ -2256,7 +2249,6 @@ const std::string storage_key1 = bridge()->GetLastGeneratedStorageKey(); EXPECT_TRUE(db()->HasMetadata(storage_key1)); EXPECT_EQ(1U, db()->metadata_count()); - EXPECT_EQ(0, bridge()->get_storage_key_call_count()); // Local update should affect the same entity. This ensures that storage key // to client tag hash mapping was updated on the previous step. @@ -2273,7 +2265,6 @@ EXPECT_NE(storage_key1, storage_key2); EXPECT_TRUE(db()->HasMetadata(storage_key2)); EXPECT_EQ(2U, db()->metadata_count()); - EXPECT_EQ(0, bridge()->get_storage_key_call_count()); } // Tests that reencryption scenario works correctly for types that don't support @@ -2314,7 +2305,6 @@ // removed and no storage key got propagated to MetadataChangeList. EXPECT_FALSE(db()->HasMetadata(kKey1)); EXPECT_EQ(0U, db()->metadata_count()); - EXPECT_EQ(0, bridge()->get_storage_key_call_count()); } // Tests that UntrackEntityForStorage won't propagate storage key to
diff --git a/components/sync/model/data_type_sync_bridge.h b/components/sync/model/data_type_sync_bridge.h index 50bedff..52ce205 100644 --- a/components/sync/model/data_type_sync_bridge.h +++ b/components/sync/model/data_type_sync_bridge.h
@@ -131,7 +131,7 @@ // different from GetStorageKey(). Only the hash of this value is kept. // // IsEntityDataValid() is guaranteed to hold for the `entity_data`. - virtual std::string GetClientTag(const EntityData& entity_data) = 0; + virtual std::string GetClientTag(const EntityData& entity_data) const = 0; // Must not be called unless SupportsGetStorageKey() returns true. // @@ -146,7 +146,7 @@ // it contains invalid data). // // IsEntityDataValid() is guaranteed to hold for the `entity_data`. - virtual std::string GetStorageKey(const EntityData& entity_data) = 0; + virtual std::string GetStorageKey(const EntityData& entity_data) const = 0; // Whether or not the bridge is capable of producing a client tag from // `EntityData` (usually remote changes), via GetClientTag(). Most bridges do,
diff --git a/components/sync/model/syncable_service_based_bridge.cc b/components/sync/model/syncable_service_based_bridge.cc index bb182fa..45e4a3e 100644 --- a/components/sync/model/syncable_service_based_bridge.cc +++ b/components/sync/model/syncable_service_based_bridge.cc
@@ -320,13 +320,13 @@ } std::string SyncableServiceBasedBridge::GetClientTag( - const EntityData& entity_data) { + const EntityData& entity_data) const { // Not supported as per SupportsGetClientTag(). NOTREACHED(); } std::string SyncableServiceBasedBridge::GetStorageKey( - const EntityData& entity_data) { + const EntityData& entity_data) const { // Not supported as per SupportsGetStorageKey(). NOTREACHED(); }
diff --git a/components/sync/model/syncable_service_based_bridge.h b/components/sync/model/syncable_service_based_bridge.h index e820c5f..7497cd2 100644 --- a/components/sync/model/syncable_service_based_bridge.h +++ b/components/sync/model/syncable_service_based_bridge.h
@@ -61,8 +61,8 @@ std::unique_ptr<DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const EntityData& entity_data) override; - std::string GetStorageKey(const EntityData& entity_data) override; + std::string GetClientTag(const EntityData& entity_data) const override; + std::string GetStorageKey(const EntityData& entity_data) const override; bool SupportsGetClientTag() const override; bool SupportsGetStorageKey() const override; ConflictResolution ResolveConflict(
diff --git a/components/sync/service/non_ui_syncable_service_based_data_type_controller.cc b/components/sync/service/non_ui_syncable_service_based_data_type_controller.cc index 006b7a8..47a9dd1 100644 --- a/components/sync/service/non_ui_syncable_service_based_data_type_controller.cc +++ b/components/sync/service/non_ui_syncable_service_based_data_type_controller.cc
@@ -53,10 +53,10 @@ NOTREACHED(); } std::unique_ptr<DataBatch> GetAllDataForDebugging() override { NOTREACHED(); } - std::string GetClientTag(const EntityData& /*entity_data*/) override { + std::string GetClientTag(const EntityData& /*entity_data*/) const override { NOTREACHED(); } - std::string GetStorageKey(const EntityData& /*entity_data*/) override { + std::string GetStorageKey(const EntityData& /*entity_data*/) const override { NOTREACHED(); } };
diff --git a/components/sync/test/fake_data_type_sync_bridge.cc b/components/sync/test/fake_data_type_sync_bridge.cc index 7bfb5e4..dc1336f3 100644 --- a/components/sync/test/fake_data_type_sync_bridge.cc +++ b/components/sync/test/fake_data_type_sync_bridge.cc
@@ -318,19 +318,19 @@ } std::string FakeDataTypeSyncBridge::GetClientTag( - const EntityData& entity_data) { + const EntityData& entity_data) const { DCHECK(supports_get_client_tag_); return ClientTagFromKey(GetStorageKeyInternal(entity_data)); } std::string FakeDataTypeSyncBridge::GetStorageKey( - const EntityData& entity_data) { + const EntityData& entity_data) const { DCHECK(supports_get_storage_key_); return GetStorageKeyInternal(entity_data); } std::string FakeDataTypeSyncBridge::GetStorageKeyInternal( - const EntityData& entity_data) { + const EntityData& entity_data) const { switch (type_) { case PREFERENCES: return entity_data.specifics.preference().name();
diff --git a/components/sync/test/fake_data_type_sync_bridge.h b/components/sync/test/fake_data_type_sync_bridge.h index 09749177..5b34c4d 100644 --- a/components/sync/test/fake_data_type_sync_bridge.h +++ b/components/sync/test/fake_data_type_sync_bridge.h
@@ -116,8 +116,8 @@ std::unique_ptr<DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const EntityData& entity_data) override; - std::string GetStorageKey(const EntityData& entity_data) override; + std::string GetClientTag(const EntityData& entity_data) const override; + std::string GetStorageKey(const EntityData& entity_data) const override; bool SupportsGetClientTag() const override; bool SupportsGetStorageKey() const override; bool SupportsUniquePositions() const override; @@ -198,7 +198,7 @@ // Same as GetStorageKey(), but doesn't check that SupportsGetStorageKey() // is true. - std::string GetStorageKeyInternal(const EntityData& entity_data); + std::string GetStorageKeyInternal(const EntityData& entity_data) const; // If SupportsGetStorageKey() is true, same as GetStorageKey(). Otherwise, // generates and returns a new unique storage key.
diff --git a/components/sync/test/stub_data_type_sync_bridge.cc b/components/sync/test/stub_data_type_sync_bridge.cc index b8aab56..7773a7c 100644 --- a/components/sync/test/stub_data_type_sync_bridge.cc +++ b/components/sync/test/stub_data_type_sync_bridge.cc
@@ -44,12 +44,12 @@ } std::string StubDataTypeSyncBridge::GetClientTag( - const EntityData& entity_data) { + const EntityData& entity_data) const { return std::string(); } std::string StubDataTypeSyncBridge::GetStorageKey( - const EntityData& entity_data) { + const EntityData& entity_data) const { return std::string(); }
diff --git a/components/sync/test/stub_data_type_sync_bridge.h b/components/sync/test/stub_data_type_sync_bridge.h index b9c25ed..fdab06e4 100644 --- a/components/sync/test/stub_data_type_sync_bridge.h +++ b/components/sync/test/stub_data_type_sync_bridge.h
@@ -31,8 +31,8 @@ std::unique_ptr<DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const EntityData& entity_data) override; - std::string GetStorageKey(const EntityData& entity_data) override; + std::string GetClientTag(const EntityData& entity_data) const override; + std::string GetStorageKey(const EntityData& entity_data) const override; }; } // namespace syncer
diff --git a/components/sync_device_info/device_info_sync_bridge.cc b/components/sync_device_info/device_info_sync_bridge.cc index 929c94f..02c1da0b 100644 --- a/components/sync_device_info/device_info_sync_bridge.cc +++ b/components/sync_device_info/device_info_sync_bridge.cc
@@ -526,12 +526,14 @@ return batch; } -std::string DeviceInfoSyncBridge::GetClientTag(const EntityData& entity_data) { +std::string DeviceInfoSyncBridge::GetClientTag( + const EntityData& entity_data) const { DCHECK(entity_data.specifics.has_device_info()); return DeviceInfoUtil::SpecificsToTag(entity_data.specifics.device_info()); } -std::string DeviceInfoSyncBridge::GetStorageKey(const EntityData& entity_data) { +std::string DeviceInfoSyncBridge::GetStorageKey( + const EntityData& entity_data) const { DCHECK(entity_data.specifics.has_device_info()); return entity_data.specifics.device_info().cache_guid(); }
diff --git a/components/sync_device_info/device_info_sync_bridge.h b/components/sync_device_info/device_info_sync_bridge.h index 4010554..9fd54a63 100644 --- a/components/sync_device_info/device_info_sync_bridge.h +++ b/components/sync_device_info/device_info_sync_bridge.h
@@ -80,8 +80,8 @@ std::unique_ptr<DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const EntityData& entity_data) override; - std::string GetStorageKey(const EntityData& entity_data) override; + std::string GetClientTag(const EntityData& entity_data) const override; + std::string GetStorageKey(const EntityData& entity_data) const override; void ApplyDisableSyncChanges( std::unique_ptr<MetadataChangeList> delete_metadata_change_list) override; DataTypeSyncBridge::CommitAttemptFailedBehavior OnCommitAttemptFailed(
diff --git a/components/sync_sessions/session_sync_bridge.cc b/components/sync_sessions/session_sync_bridge.cc index 8a336a9..f630048 100644 --- a/components/sync_sessions/session_sync_bridge.cc +++ b/components/sync_sessions/session_sync_bridge.cc
@@ -279,7 +279,7 @@ } std::string SessionSyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { if (!SessionStore::AreValidSpecifics(entity_data.specifics.session())) { return std::string(); } @@ -287,7 +287,7 @@ } std::string SessionSyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { if (!SessionStore::AreValidSpecifics(entity_data.specifics.session())) { return std::string(); }
diff --git a/components/sync_sessions/session_sync_bridge.h b/components/sync_sessions/session_sync_bridge.h index f6945c6..d5bb0799 100644 --- a/components/sync_sessions/session_sync_bridge.h +++ b/components/sync_sessions/session_sync_bridge.h
@@ -67,8 +67,10 @@ std::unique_ptr<syncer::DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override; void OnSyncPaused() override;
diff --git a/components/sync_user_events/user_event_sync_bridge.cc b/components/sync_user_events/user_event_sync_bridge.cc index 62b3484..50ec1123 100644 --- a/components/sync_user_events/user_event_sync_bridge.cc +++ b/components/sync_user_events/user_event_sync_bridge.cc
@@ -154,11 +154,13 @@ return batch; } -std::string UserEventSyncBridge::GetClientTag(const EntityData& entity_data) { +std::string UserEventSyncBridge::GetClientTag( + const EntityData& entity_data) const { return GetStorageKey(entity_data); } -std::string UserEventSyncBridge::GetStorageKey(const EntityData& entity_data) { +std::string UserEventSyncBridge::GetStorageKey( + const EntityData& entity_data) const { return GetStorageKeyFromSpecifics(entity_data.specifics.user_event()); }
diff --git a/components/sync_user_events/user_event_sync_bridge.h b/components/sync_user_events/user_event_sync_bridge.h index 00214ad..fead856 100644 --- a/components/sync_user_events/user_event_sync_bridge.h +++ b/components/sync_user_events/user_event_sync_bridge.h
@@ -45,8 +45,8 @@ std::unique_ptr<DataBatch> GetDataForCommit( StorageKeyList storage_keys) override; std::unique_ptr<DataBatch> GetAllDataForDebugging() override; - std::string GetClientTag(const EntityData& entity_data) override; - std::string GetStorageKey(const EntityData& entity_data) override; + std::string GetClientTag(const EntityData& entity_data) const override; + std::string GetStorageKey(const EntityData& entity_data) const override; void ApplyDisableSyncChanges( std::unique_ptr<MetadataChangeList> delete_metadata_change_list) override;
diff --git a/components/viz/service/display/display_damage_tracker.cc b/components/viz/service/display/display_damage_tracker.cc index e311835..3cdb799 100644 --- a/components/viz/service/display/display_damage_tracker.cc +++ b/components/viz/service/display/display_damage_tracker.cc
@@ -4,7 +4,6 @@ #include "components/viz/service/display/display_damage_tracker.h" -#include "base/feature_list.h" #include "base/observer_list.h" #include "base/trace_event/trace_event.h" #include "components/viz/service/display/surface_aggregator.h" @@ -14,12 +13,6 @@ namespace viz { namespace { -// Kill switch for optimization to skip updating pending surfaces on begin -// frames from other displays. -BASE_FEATURE(kSkipBeginFramesFromOtherDisplays, - "SkipBeginFramesFromOtherDisplays", - base::FEATURE_ENABLED_BY_DEFAULT); - bool ShouldAccumulateInteraction( SurfaceObserver::HandleInteraction handle_interaction) { switch (handle_interaction) { @@ -48,9 +41,7 @@ void DisplayDamageTracker::SetDisplayBeginFrameSourceId( uint64_t begin_frame_source_id) { - if (base::FeatureList::IsEnabled(kSkipBeginFramesFromOtherDisplays)) { - begin_frame_source_id_ = begin_frame_source_id; - } + begin_frame_source_id_ = begin_frame_source_id; } void DisplayDamageTracker::SetDelegate(Delegate* delegate) {
diff --git a/components/viz/service/input/input_manager.cc b/components/viz/service/input/input_manager.cc index dfee82c..2bcf1746 100644 --- a/components/viz/service/input/input_manager.cc +++ b/components/viz/service/input/input_manager.cc
@@ -588,6 +588,24 @@ itr->second.rir_delegate->SetIsHidden(is_hidden); } +void InputManager::ResetGestureDetection( + const FrameSinkId& root_widget_frame_sink_id) { +#if BUILDFLAG(IS_ANDROID) + auto iter = frame_sink_metadata_map_.find(root_widget_frame_sink_id); + if (iter == frame_sink_metadata_map_.end()) { + return; + } + + RenderInputRouterSupportBase* support_base = iter->second.rir_support.get(); + CHECK(support_base); + CHECK(!support_base->IsRenderInputRouterSupportChildFrame()); + + auto* support_android = + static_cast<RenderInputRouterSupportAndroid*>(support_base); + support_android->ResetGestureDetection(); +#endif +} + void InputManager::SetupRenderInputRouterDelegateConnection( const base::UnguessableToken& grouping_id, mojo::PendingRemote<input::mojom::RenderInputRouterDelegateClient>
diff --git a/components/viz/service/input/input_manager.h b/components/viz/service/input/input_manager.h index a90c2d2..57849b6 100644 --- a/components/viz/service/input/input_manager.h +++ b/components/viz/service/input/input_manager.h
@@ -151,6 +151,8 @@ const FrameSinkId& frame_sink_id) override; void NotifyVisibilityChanged(const FrameSinkId& frame_sink_id, bool is_hidden) override; + void ResetGestureDetection( + const FrameSinkId& root_widget_frame_sink_id) override; void SetupRenderInputRouterDelegateConnection( const base::UnguessableToken& grouping_id,
diff --git a/components/viz/service/input/render_input_router_support_android.cc b/components/viz/service/input/render_input_router_support_android.cc index b674e8d..1dcb4ce 100644 --- a/components/viz/service/input/render_input_router_support_android.cc +++ b/components/viz/service/input/render_input_router_support_android.cc
@@ -61,6 +61,10 @@ return input_helper_->ShouldRouteEvents(); } +void RenderInputRouterSupportAndroid::ResetGestureDetection() { + input_helper_->ResetGestureDetection(); +} + bool RenderInputRouterSupportAndroid::RequiresDoubleTapGestureEvents() const { return input_helper_->RequiresDoubleTapGestureEvents(); }
diff --git a/components/viz/service/input/render_input_router_support_android.h b/components/viz/service/input/render_input_router_support_android.h index 2df1488..66349d27 100644 --- a/components/viz/service/input/render_input_router_support_android.h +++ b/components/viz/service/input/render_input_router_support_android.h
@@ -52,6 +52,7 @@ bool OnTouchEvent(const ui::MotionEventAndroid& event, bool emit_histograms) override; bool ShouldRouteEvents() const; + void ResetGestureDetection(); // RenderInputRouterSupportBase implementation. bool IsRenderInputRouterSupportChildFrame() const override;
diff --git a/components/webauthn/core/browser/passkey_sync_bridge.cc b/components/webauthn/core/browser/passkey_sync_bridge.cc index 538f874..1eb874c 100644 --- a/components/webauthn/core/browser/passkey_sync_bridge.cc +++ b/components/webauthn/core/browser/passkey_sync_bridge.cc
@@ -211,12 +211,12 @@ } std::string PasskeySyncBridge::GetClientTag( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { return GetStorageKey(entity_data); } std::string PasskeySyncBridge::GetStorageKey( - const syncer::EntityData& entity_data) { + const syncer::EntityData& entity_data) const { DCHECK(entity_data.specifics.has_webauthn_credential()); return entity_data.specifics.webauthn_credential().sync_id(); }
diff --git a/components/webauthn/core/browser/passkey_sync_bridge.h b/components/webauthn/core/browser/passkey_sync_bridge.h index 56eef74..ba25951 100644 --- a/components/webauthn/core/browser/passkey_sync_bridge.h +++ b/components/webauthn/core/browser/passkey_sync_bridge.h
@@ -48,8 +48,10 @@ StorageKeyList storage_keys) override; std::unique_ptr<syncer::DataBatch> GetAllDataForDebugging() override; bool IsEntityDataValid(const syncer::EntityData& entity_data) const override; - std::string GetClientTag(const syncer::EntityData& entity_data) override; - std::string GetStorageKey(const syncer::EntityData& entity_data) override; + std::string GetClientTag( + const syncer::EntityData& entity_data) const override; + std::string GetStorageKey( + const syncer::EntityData& entity_data) const override; void ApplyDisableSyncChanges(std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) override;
diff --git a/content/browser/agent_cluster_key.cc b/content/browser/agent_cluster_key.cc index 3e2c088..884ed0a 100644 --- a/content/browser/agent_cluster_key.cc +++ b/content/browser/agent_cluster_key.cc
@@ -23,8 +23,6 @@ bool AgentClusterKey::CrossOriginIsolationKey::operator==( const CrossOriginIsolationKey& b) const = default; -bool AgentClusterKey::CrossOriginIsolationKey::operator!=( - const CrossOriginIsolationKey& b) const = default; // static AgentClusterKey AgentClusterKey::CreateSiteKeyed(const GURL& site_url) { @@ -71,7 +69,6 @@ } bool AgentClusterKey::operator==(const AgentClusterKey& b) const = default; -bool AgentClusterKey::operator!=(const AgentClusterKey& b) const = default; bool AgentClusterKey::operator<(const AgentClusterKey& b) const { if (GetCrossOriginIsolationKey().has_value() !=
diff --git a/content/browser/agent_cluster_key.h b/content/browser/agent_cluster_key.h index 21cd3aa..feede60b 100644 --- a/content/browser/agent_cluster_key.h +++ b/content/browser/agent_cluster_key.h
@@ -43,7 +43,6 @@ CrossOriginIsolationKey(const CrossOriginIsolationKey& other); ~CrossOriginIsolationKey(); bool operator==(const CrossOriginIsolationKey& b) const; - bool operator!=(const CrossOriginIsolationKey& b) const; // The origin of the document which triggered cross-origin isolation. This // might be different from the origin returned by AgentClusterKey::GetOrigin // when cross-origin isolation was enabled by COOP + COEP. It should always @@ -97,7 +96,6 @@ GetCrossOriginIsolationKey() const; bool operator==(const AgentClusterKey& b) const; - bool operator!=(const AgentClusterKey& b) const; // Needed for tie comparisons in SiteInfo. bool operator<(const AgentClusterKey& b) const;
diff --git a/content/browser/background_fetch/background_fetch_registration_id.cc b/content/browser/background_fetch/background_fetch_registration_id.cc index a9237f9..86a40dd 100644 --- a/content/browser/background_fetch/background_fetch_registration_id.cc +++ b/content/browser/background_fetch/background_fetch_registration_id.cc
@@ -48,14 +48,9 @@ return unique_id_ == other.unique_id_; } -bool BackgroundFetchRegistrationId::operator!=( +std::weak_ordering BackgroundFetchRegistrationId::operator<=>( const BackgroundFetchRegistrationId& other) const { - return unique_id_ != other.unique_id_; -} - -bool BackgroundFetchRegistrationId::operator<( - const BackgroundFetchRegistrationId& other) const { - return unique_id_ < other.unique_id_; + return unique_id_ <=> other.unique_id_; } bool BackgroundFetchRegistrationId::is_null() const {
diff --git a/content/browser/background_fetch/background_fetch_registration_id.h b/content/browser/background_fetch/background_fetch_registration_id.h index 03bbe41..497a514c 100644 --- a/content/browser/background_fetch/background_fetch_registration_id.h +++ b/content/browser/background_fetch/background_fetch_registration_id.h
@@ -39,10 +39,10 @@ // Return whether the |other| registration id are identical or different. bool operator==(const BackgroundFetchRegistrationId& other) const; - bool operator!=(const BackgroundFetchRegistrationId& other) const; // Enables this type to be used in an std::map and std::set. - bool operator<(const BackgroundFetchRegistrationId& other) const; + std::weak_ordering operator<=>( + const BackgroundFetchRegistrationId& other) const; // Returns whether this registration id refers to valid data. bool is_null() const;
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc index 455c2b66..27841d4 100644 --- a/content/browser/child_process_launcher.cc +++ b/content/browser/child_process_launcher.cc
@@ -416,7 +416,4 @@ bool RenderProcessPriority::operator==( const RenderProcessPriority& other) const = default; -bool RenderProcessPriority::operator!=( - const RenderProcessPriority& other) const = default; - } // namespace content
diff --git a/content/browser/child_process_launcher.h b/content/browser/child_process_launcher.h index 4c3d991..2f85aeb 100644 --- a/content/browser/child_process_launcher.h +++ b/content/browser/child_process_launcher.h
@@ -118,7 +118,6 @@ base::Process::Priority GetProcessPriority() const; bool operator==(const RenderProcessPriority& other) const; - bool operator!=(const RenderProcessPriority& other) const; using TraceProto = perfetto::protos::pbzero::ChildProcessLauncherPriority; void WriteIntoTrace(perfetto::TracedProto<TraceProto> proto) const;
diff --git a/content/browser/indexed_db/BUILD.gn b/content/browser/indexed_db/BUILD.gn index aa96ae0..4322869 100644 --- a/content/browser/indexed_db/BUILD.gn +++ b/content/browser/indexed_db/BUILD.gn
@@ -78,6 +78,8 @@ "instance/sqlite/backing_store_impl.h", "instance/sqlite/backing_store_transaction_impl.cc", "instance/sqlite/backing_store_transaction_impl.h", + "instance/sqlite/database_connection.cc", + "instance/sqlite/database_connection.h", "instance/transaction.cc", "instance/transaction.h", "list_set.h",
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_database_impl.cc b/content/browser/indexed_db/instance/sqlite/backing_store_database_impl.cc index 20e0526..965c55e 100644 --- a/content/browser/indexed_db/instance/sqlite/backing_store_database_impl.cc +++ b/content/browser/indexed_db/instance/sqlite/backing_store_database_impl.cc
@@ -4,83 +4,22 @@ #include "content/browser/indexed_db/instance/sqlite/backing_store_database_impl.h" -#include "base/check.h" #include "base/notimplemented.h" #include "content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h" +#include "content/browser/indexed_db/instance/sqlite/database_connection.h" #include "content/browser/indexed_db/status.h" -#include "sql/database.h" -#include "sql/meta_table.h" -#include "third_party/blink/public/common/indexeddb/indexeddb_metadata.h" namespace content::indexed_db::sqlite { -struct MetadataConstants { - public: - // These are schema versions of our implementation of `sql::Database`; not the - // version supplied by the application for the IndexedDB database. - static constexpr int kCurrentSchemaVersion = 1; - static constexpr int kCompatibleSchemaVersion = 1; - - // Keys of properties stored in the meta table. - struct Keys { - // Metadata relevant to the IndexedDB database. Though these are strictly - // "data" and not "metadata", they are stored in the meta table for - // convenience. - struct Idb { - // The application-supplied version of the IndexedDB database. - static constexpr char kVersion[] = "idb.version"; - static constexpr char kMaxObjectStoreId[] = "idb.max_object_store_id"; - }; - }; -}; - BackingStoreDatabaseImpl::BackingStoreDatabaseImpl( - const std::u16string& name, - base::WeakPtr<DatabaseConnection> open_db) - : connection_(open_db), metadata_(name) { - CHECK(connection_->db()->is_open()); - bool new_db = !sql::MetaTable::DoesTableExist(connection_->db()); - sql::MetaTable* meta_table = connection_->meta_table(); - CHECK(meta_table->Init(connection_->db(), - MetadataConstants::kCurrentSchemaVersion, - MetadataConstants::kCompatibleSchemaVersion)); - if (new_db) { - metadata_.version = blink::IndexedDBDatabaseMetadata::NO_VERSION; - metadata_.max_object_store_id = 0; - meta_table->SetValue(MetadataConstants::Keys::Idb::kVersion, - metadata_.version); - meta_table->SetValue(MetadataConstants::Keys::Idb::kMaxObjectStoreId, - metadata_.max_object_store_id); - } else { - meta_table->GetValue(MetadataConstants::Keys::Idb::kVersion, - &metadata_.version); - meta_table->GetValue(MetadataConstants::Keys::Idb::kMaxObjectStoreId, - &metadata_.max_object_store_id); - } -} + base::WeakPtr<DatabaseConnection> db) + : db_(std::move(db)) {} -BackingStoreDatabaseImpl::~BackingStoreDatabaseImpl() { - if (connection_) { - // The underlying `DatabaseConnection` can be reused by a new instance. - connection_->meta_table()->Reset(); - } -} - -void BackingStoreDatabaseImpl::RollbackUpgrade(UpgradePassKey& pass_key) { - metadata_ = std::move(pass_key.metadata_snapshot_); -} - -Status BackingStoreDatabaseImpl::SetDatabaseVersion(UpgradePassKey&, - int64_t version) { - connection_->meta_table()->SetValue(MetadataConstants::Keys::Idb::kVersion, - version); - metadata_.version = version; - return Status::OK(); -} +BackingStoreDatabaseImpl::~BackingStoreDatabaseImpl() = default; const blink::IndexedDBDatabaseMetadata& BackingStoreDatabaseImpl::GetMetadata() { - return metadata_; + return db_->metadata(); } PartitionedLockId BackingStoreDatabaseImpl::GetLockId( @@ -93,13 +32,7 @@ BackingStoreDatabaseImpl::CreateTransaction( blink::mojom::IDBTransactionDurability durability, blink::mojom::IDBTransactionMode mode) { - // TODO(crbug.com/40253999): Handle `durability` and assert preconditions for - // `mode`. - if (mode == blink::mojom::IDBTransactionMode::VersionChange) { - return std::make_unique<BackingStoreVersionChangeTransaction>( - GetWeakPtr(), UpgradePassKey(metadata_)); - } - return std::make_unique<BackingStoreTransactionImpl>(GetWeakPtr()); + return db_->CreateTransaction(PassKey(), durability, mode); } Status BackingStoreDatabaseImpl::DeleteDatabase( @@ -109,8 +42,4 @@ return Status::OK(); } -base::WeakPtr<BackingStoreDatabaseImpl> BackingStoreDatabaseImpl::GetWeakPtr() { - return weak_factory_.GetWeakPtr(); -} - } // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_database_impl.h b/content/browser/indexed_db/instance/sqlite/backing_store_database_impl.h index 72c4b465..99ca8d81 100644 --- a/content/browser/indexed_db/instance/sqlite/backing_store_database_impl.h +++ b/content/browser/indexed_db/instance/sqlite/backing_store_database_impl.h
@@ -6,55 +6,23 @@ #define CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_BACKING_STORE_DATABASE_IMPL_H_ #include "base/memory/weak_ptr.h" +#include "base/types/pass_key.h" #include "content/browser/indexed_db/instance/backing_store.h" -#include "content/browser/indexed_db/instance/sqlite/backing_store_impl.h" -#include "third_party/blink/public/common/indexeddb/indexeddb_metadata.h" - -namespace sql { -class Database; -} // namespace sql namespace content::indexed_db::sqlite { class DatabaseConnection; -// Owns metadata maintenance. There is at most one instance per -// `DatabaseConnection`. +// Thunks all operations to `DatabaseConnection`. class BackingStoreDatabaseImpl : public BackingStore::Database { public: - // Enables calling methods that upgrade the IndexedDB database. - // This is modeled after `base::PassKey` which cannot be used directly since - // we want to store some data inside the key too. - class UpgradePassKey { - public: - UpgradePassKey(const UpgradePassKey&) = delete; - UpgradePassKey& operator=(const UpgradePassKey&) = delete; - UpgradePassKey(UpgradePassKey&&) = default; - UpgradePassKey& operator=(UpgradePassKey&&) = default; + using PassKey = base::PassKey<BackingStoreDatabaseImpl>; - private: - friend class BackingStoreDatabaseImpl; - explicit UpgradePassKey(blink::IndexedDBDatabaseMetadata metadata_snapshot) - : metadata_snapshot_(std::move(metadata_snapshot)) {} - - // The metadata before the upgrade. - blink::IndexedDBDatabaseMetadata metadata_snapshot_; - }; - - BackingStoreDatabaseImpl(const std::u16string& name, - base::WeakPtr<DatabaseConnection> open_db); + explicit BackingStoreDatabaseImpl(base::WeakPtr<DatabaseConnection> db); BackingStoreDatabaseImpl(const BackingStoreDatabaseImpl&) = delete; BackingStoreDatabaseImpl& operator=(const BackingStoreDatabaseImpl&) = delete; ~BackingStoreDatabaseImpl() override; - sql::Database* db() const { return connection_->db(); } - - // Rolls back all changes made through this pass key. - void RollbackUpgrade(UpgradePassKey&); - - // Methods to upgrade the IndexedDB database. Require a valid pass key. - Status SetDatabaseVersion(UpgradePassKey&, int64_t version); - // BackingStore::Database: const blink::IndexedDBDatabaseMetadata& GetMetadata() override; PartitionedLockId GetLockId(int64_t object_store_id) const override; @@ -65,11 +33,7 @@ base::OnceClosure on_complete) override; private: - base::WeakPtr<BackingStoreDatabaseImpl> GetWeakPtr(); - - base::WeakPtr<DatabaseConnection> connection_; - blink::IndexedDBDatabaseMetadata metadata_; - base::WeakPtrFactory<BackingStoreDatabaseImpl> weak_factory_{this}; + base::WeakPtr<DatabaseConnection> db_; }; } // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_impl.cc b/content/browser/indexed_db/instance/sqlite/backing_store_impl.cc index 7673ad98..7611b82b 100644 --- a/content/browser/indexed_db/instance/sqlite/backing_store_impl.cc +++ b/content/browser/indexed_db/instance/sqlite/backing_store_impl.cc
@@ -4,26 +4,15 @@ #include "content/browser/indexed_db/instance/sqlite/backing_store_impl.h" -#include "base/check.h" #include "base/files/file_path.h" #include "base/notimplemented.h" #include "content/browser/indexed_db/indexed_db_data_loss_info.h" #include "content/browser/indexed_db/instance/sqlite/backing_store_database_impl.h" +#include "content/browser/indexed_db/instance/sqlite/database_connection.h" #include "content/browser/indexed_db/status.h" -#include "sql/database.h" -#include "sql/meta_table.h" namespace content::indexed_db::sqlite { -DatabaseConnection::DatabaseConnection(std::unique_ptr<sql::Database> db) - : db_(std::move(db)), meta_table_(std::make_unique<sql::MetaTable>()) {} - -DatabaseConnection::~DatabaseConnection() = default; - -base::WeakPtr<DatabaseConnection> DatabaseConnection::GetWeakPtr() { - return weak_factory_.GetWeakPtr(); -} - std::tuple<std::unique_ptr<BackingStore>, Status, IndexedDBDataLossInfo, bool> BackingStoreImpl::OpenAndVerify(base::FilePath data_path) { return { @@ -53,9 +42,7 @@ std::move(on_done).Run(); } -void BackingStoreImpl::StopPreCloseTasks() { - NOTIMPLEMENTED(); -} +void BackingStoreImpl::StopPreCloseTasks() {} int64_t BackingStoreImpl::GetInMemorySize() const { NOTIMPLEMENTED(); @@ -63,7 +50,10 @@ } Status BackingStoreImpl::GetDatabaseNames(std::vector<std::u16string>* names) { - NOTIMPLEMENTED(); + // TODO(crbug.com/40253999): Support on-disk databases. + for (const auto& [name, _] : open_connections_) { + names->push_back(name); + } return Status::OK(); } @@ -77,19 +67,14 @@ BackingStoreImpl::CreateOrOpenDatabase(const std::u16string& name) { auto it = open_connections_.find(name); if (it == open_connections_.end()) { - // TODO(crbug.com/40253999): Create new tag(s) for metrics. - constexpr sql::Database::Tag kSqlTag = "Test"; - auto db = std::make_unique<sql::Database>( - sql::DatabaseOptions().set_exclusive_locking(true).set_wal_mode(true), - kSqlTag); - // TODO(crbug.com/40253999): Support on-disk databases. - CHECK(db->OpenInMemory()); - auto result = open_connections_.try_emplace(name, std::move(db)); - CHECK(result.second); - it = result.first; + base::expected<std::unique_ptr<DatabaseConnection>, Status> db = + DatabaseConnection::Open(name, data_path_); + if (!db.has_value()) { + return base::unexpected(db.error()); + } + it = open_connections_.emplace(name, std::move(db.value())).first; } - return std::make_unique<BackingStoreDatabaseImpl>(name, - it->second.GetWeakPtr()); + return std::make_unique<BackingStoreDatabaseImpl>(it->second->GetWeakPtr()); } uintptr_t BackingStoreImpl::GetIdentifierForMemoryDump() {
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_impl.h b/content/browser/indexed_db/instance/sqlite/backing_store_impl.h index c07b41a..3d6e4b4 100644 --- a/content/browser/indexed_db/instance/sqlite/backing_store_impl.h +++ b/content/browser/indexed_db/instance/sqlite/backing_store_impl.h
@@ -10,39 +10,15 @@ #include <unordered_map> #include "base/files/file_path.h" -#include "base/memory/weak_ptr.h" #include "content/browser/indexed_db/instance/backing_store.h" -namespace sql { -class Database; -class MetaTable; -} // namespace sql - namespace content::indexed_db { struct IndexedDBDataLossInfo; namespace sqlite { -// Owns an open connection to a SQLite database and supports weak pointer -// semantics. -class DatabaseConnection { - public: - explicit DatabaseConnection(std::unique_ptr<sql::Database> db); - DatabaseConnection(const DatabaseConnection&) = delete; - DatabaseConnection& operator=(const DatabaseConnection&) = delete; - ~DatabaseConnection(); - - sql::Database* db() const { return db_.get(); } - sql::MetaTable* meta_table() const { return meta_table_.get(); } - - base::WeakPtr<DatabaseConnection> GetWeakPtr(); - - private: - std::unique_ptr<sql::Database> db_; - std::unique_ptr<sql::MetaTable> meta_table_; - base::WeakPtrFactory<DatabaseConnection> weak_factory_{this}; -}; +class DatabaseConnection; class BackingStoreImpl : public BackingStore { public: @@ -74,7 +50,8 @@ private: const base::FilePath data_path_; - std::unordered_map<std::u16string, DatabaseConnection> open_connections_; + std::unordered_map<std::u16string, std::unique_ptr<DatabaseConnection>> + open_connections_; }; } // namespace sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc index 7a2a491..c1cf35a5 100644 --- a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc +++ b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc
@@ -6,21 +6,28 @@ #include "base/check.h" #include "base/notimplemented.h" -#include "base/notreached.h" -#include "content/browser/indexed_db/instance/sqlite/backing_store_database_impl.h" +#include "content/browser/indexed_db/instance/sqlite/database_connection.h" #include "content/browser/indexed_db/status.h" #include "sql/transaction.h" namespace content::indexed_db::sqlite { BackingStoreTransactionImpl::BackingStoreTransactionImpl( - base::WeakPtr<BackingStoreDatabaseImpl> db) - : db_(db), transaction_(db_->db()) {} + base::WeakPtr<DatabaseConnection> db, + std::unique_ptr<sql::Transaction> transaction, + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode) + : db_(std::move(db)), + transaction_(std::move(transaction)), + durability_(durability), + mode_(mode) {} BackingStoreTransactionImpl::~BackingStoreTransactionImpl() = default; void BackingStoreTransactionImpl::Begin(std::vector<PartitionedLock> locks) { - CHECK(transaction_.Begin()); + // TODO(crbug.com/40253999): How do we surface the error if this call fails? + CHECK(transaction_->Begin()); + db_->OnTransactionBegin(PassKey(), *this); } Status BackingStoreTransactionImpl::CommitPhaseOne(BlobWriteCallback callback) { @@ -30,16 +37,19 @@ } Status BackingStoreTransactionImpl::CommitPhaseTwo() { - transaction_.Commit(); + db_->OnBeforeTransactionCommit(PassKey(), *this); + transaction_->Commit(); + db_->OnTransactionCommit(PassKey(), *this); return Status::OK(); } void BackingStoreTransactionImpl::Rollback() { - transaction_.Rollback(); + transaction_->Rollback(); + db_->OnTransactionRollback(PassKey(), *this); } Status BackingStoreTransactionImpl::SetDatabaseVersion(int64_t version) { - NOTREACHED() << "Implemented by BackingStoreVersionChangeTransaction"; + return db_->SetDatabaseVersion(PassKey(), version); } Status BackingStoreTransactionImpl::CreateObjectStore( @@ -47,21 +57,25 @@ const std::u16string& name, blink::IndexedDBKeyPath key_path, bool auto_increment) { - NOTREACHED() << "Implemented by BackingStoreVersionChangeTransaction"; + return db_->CreateObjectStore(PassKey(), object_store_id, name, + std::move(key_path), auto_increment); } Status BackingStoreTransactionImpl::DeleteObjectStore(int64_t object_store_id) { - NOTREACHED() << "Implemented by BackingStoreVersionChangeTransaction"; + NOTIMPLEMENTED(); + return Status::OK(); } Status BackingStoreTransactionImpl::RenameObjectStore( int64_t object_store_id, const std::u16string& new_name) { - NOTREACHED() << "Implemented by BackingStoreVersionChangeTransaction"; + NOTIMPLEMENTED(); + return Status::OK(); } Status BackingStoreTransactionImpl::ClearObjectStore(int64_t object_store_id) { - NOTREACHED() << "Implemented by BackingStoreVersionChangeTransaction"; + NOTIMPLEMENTED(); + return Status::OK(); } Status BackingStoreTransactionImpl::CreateIndex( @@ -71,19 +85,22 @@ blink::IndexedDBKeyPath key_path, bool is_unique, bool is_multi_entry) { - NOTREACHED() << "Implemented by BackingStoreVersionChangeTransaction"; + NOTIMPLEMENTED(); + return Status::OK(); } Status BackingStoreTransactionImpl::DeleteIndex(int64_t object_store_id, int64_t index_id) { - NOTREACHED() << "Implemented by BackingStoreVersionChangeTransaction"; + NOTIMPLEMENTED(); + return Status::OK(); } Status BackingStoreTransactionImpl::RenameIndex( int64_t object_store_id, int64_t index_id, const std::u16string& new_name) { - NOTREACHED() << "Implemented by BackingStoreVersionChangeTransaction"; + NOTIMPLEMENTED(); + return Status::OK(); } Status BackingStoreTransactionImpl::GetRecord(int64_t object_store_id, @@ -199,22 +216,4 @@ return nullptr; } -BackingStoreVersionChangeTransaction::BackingStoreVersionChangeTransaction( - base::WeakPtr<BackingStoreDatabaseImpl> db, - BackingStoreDatabaseImpl::UpgradePassKey pass_key) - : BackingStoreTransactionImpl(db), pass_key_(std::move(pass_key)) {} - -BackingStoreVersionChangeTransaction::~BackingStoreVersionChangeTransaction() = - default; - -void BackingStoreVersionChangeTransaction::Rollback() { - BackingStoreTransactionImpl::Rollback(); - db_->RollbackUpgrade(pass_key_); -} - -Status BackingStoreVersionChangeTransaction::SetDatabaseVersion( - int64_t version) { - return db_->SetDatabaseVersion(pass_key_, version); -} - } // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h index 581a2ce..c7b31a4 100644 --- a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h +++ b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h
@@ -6,21 +6,36 @@ #define CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_BACKING_STORE_TRANSACTION_IMPL_H_ #include "base/memory/weak_ptr.h" +#include "base/types/pass_key.h" #include "content/browser/indexed_db/instance/backing_store.h" -#include "content/browser/indexed_db/instance/sqlite/backing_store_database_impl.h" -#include "sql/transaction.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-forward.h" + +namespace sql { +class Transaction; +} namespace content::indexed_db::sqlite { +class DatabaseConnection; + class BackingStoreTransactionImpl : public BackingStore::Transaction { public: - explicit BackingStoreTransactionImpl( - base::WeakPtr<BackingStoreDatabaseImpl> db); + using PassKey = base::PassKey<BackingStoreTransactionImpl>; + + BackingStoreTransactionImpl(base::WeakPtr<DatabaseConnection> db, + std::unique_ptr<sql::Transaction> transaction, + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode); BackingStoreTransactionImpl(const BackingStoreTransactionImpl&) = delete; BackingStoreTransactionImpl& operator=(const BackingStoreTransactionImpl&) = delete; ~BackingStoreTransactionImpl() override; + blink::mojom::IDBTransactionDurability durability() const { + return durability_; + } + blink::mojom::IDBTransactionMode mode() const { return mode_; } + // BackingStore::Transaction: void Begin(std::vector<PartitionedLock> locks) override; Status CommitPhaseOne(BlobWriteCallback callback) override; @@ -101,29 +116,12 @@ blink::mojom::IDBCursorDirection) override; protected: - base::WeakPtr<BackingStoreDatabaseImpl> db_; - sql::Transaction transaction_; -}; - -class BackingStoreVersionChangeTransaction - : public BackingStoreTransactionImpl { - public: - BackingStoreVersionChangeTransaction( - base::WeakPtr<BackingStoreDatabaseImpl> db, - BackingStoreDatabaseImpl::UpgradePassKey pass_key); - BackingStoreVersionChangeTransaction( - const BackingStoreVersionChangeTransaction&) = delete; - BackingStoreVersionChangeTransaction& operator=( - const BackingStoreVersionChangeTransaction&) = delete; - ~BackingStoreVersionChangeTransaction() override; - - // BackingStore::Transaction: - void Rollback() override; - Status SetDatabaseVersion(int64_t version) override; - // TODO(crbug.com/40253999): Implement the other relevant methods. + base::WeakPtr<DatabaseConnection> db_; private: - BackingStoreDatabaseImpl::UpgradePassKey pass_key_; + std::unique_ptr<sql::Transaction> transaction_; + blink::mojom::IDBTransactionDurability durability_; + blink::mojom::IDBTransactionMode mode_; }; } // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/database_connection.cc b/content/browser/indexed_db/instance/sqlite/database_connection.cc new file mode 100644 index 0000000..644bc31 --- /dev/null +++ b/content/browser/indexed_db/instance/sqlite/database_connection.cc
@@ -0,0 +1,306 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/indexed_db/instance/sqlite/database_connection.h" + +#include <memory> +#include <string> +#include <utility> + +#include "base/check.h" +#include "base/memory/ptr_util.h" +#include "base/notimplemented.h" +#include "base/notreached.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" +#include "base/types/expected.h" +#include "content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h" +#include "content/browser/indexed_db/status.h" +#include "sql/database.h" +#include "sql/meta_table.h" +#include "sql/statement.h" +#include "sql/transaction.h" +#include "third_party/blink/public/common/indexeddb/indexeddb_metadata.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h" + +// TODO(crbug.com/40253999): Remove after handling all error cases. +#define TRANSIENT_CHECK(condition) CHECK(condition) + +namespace content::indexed_db::sqlite { +namespace { + +// The separator used to join the strings when encoding an `IndexedDBKeyPath` of +// type array. Spaces are not allowed in the individual strings, which makes +// this a convenient choice. +constexpr char16_t kKeyPathSeparator[] = u" "; + +// Encodes `key_path` into a string. The key path can be either a string or an +// array of strings. If it is an array, the contents are joined with +// `kKeyPathSeparator`. +std::u16string EncodeKeyPath(const blink::IndexedDBKeyPath& key_path) { + switch (key_path.type()) { + case blink::mojom::IDBKeyPathType::Null: + return std::u16string(); + case blink::mojom::IDBKeyPathType::String: + return key_path.string(); + case blink::mojom::IDBKeyPathType::Array: + return base::JoinString(key_path.array(), kKeyPathSeparator); + default: + NOTREACHED(); + } +} +blink::IndexedDBKeyPath DecodeKeyPath(const std::u16string& key_path) { + if (key_path.empty()) { + return blink::IndexedDBKeyPath(); + } + std::vector<std::u16string> parts = base::SplitString( + key_path, kKeyPathSeparator, base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); + if (parts.size() > 1) { + return blink::IndexedDBKeyPath(std::move(parts)); + } + return blink::IndexedDBKeyPath(std::move(parts.front())); +} + +// These are schema versions of our implementation of `sql::Database`; not the +// version supplied by the application for the IndexedDB database. +// +// The version used to initialize the meta table for the first time. +constexpr int kEmptySchemaVersion = 1; +constexpr int kCurrentSchemaVersion = 10; +constexpr int kCompatibleSchemaVersion = kCurrentSchemaVersion; + +// Atomically creates the current schema for a new `db`, inserts the initial +// IndexedDB metadata entry with `name`, and sets the current version in +// `meta_table`. +void InitializeNewDatabase(sql::Database* db, + const std::u16string& name, + sql::MetaTable* meta_table) { + sql::Transaction transaction(db); + TRANSIENT_CHECK(transaction.Begin()); + + // Create the tables. + // + // Note on the schema: The IDB spec defines the "name" + // (https://www.w3.org/TR/IndexedDB/#name) of the database, object stores and + // indexes as an arbitrary sequence of 16-bit code units, which implies that + // the application-supplied name strings need not be valid UTF-16. + // However, "key_path"s are always valid UTF-16 since they contain only + // identifiers (required to be valid UTF-16) and periods. + // TODO(crbug.com/40253999): Appropriately handle invalid UTF-16 names. + // + // Stores a single row containing the properties of + // `IndexedDBDatabaseMetadata` for this database. + TRANSIENT_CHECK( + db->Execute("CREATE TABLE indexed_db_metadata " + "(name TEXT NOT NULL UNIQUE," + " version INTEGER NOT NULL)")); + TRANSIENT_CHECK( + db->Execute("CREATE TABLE object_stores " + "(id INTEGER PRIMARY KEY," + " name TEXT NOT NULL UNIQUE," + " key_path TEXT," + " auto_increment INTEGER NOT NULL)")); + + // Insert the initial metadata entry. + sql::Statement statement( + db->GetUniqueStatement("INSERT INTO indexed_db_metadata " + "(name, version) VALUES (?, ?)")); + statement.BindString16(0, name); + statement.BindInt64(1, blink::IndexedDBDatabaseMetadata::NO_VERSION); + TRANSIENT_CHECK(statement.Run()); + + // Set the current version in the meta table. + TRANSIENT_CHECK(meta_table->SetVersionNumber(kCurrentSchemaVersion)); + + TRANSIENT_CHECK(transaction.Commit()); +} + +blink::IndexedDBDatabaseMetadata GenerateIndexedDbMetadata(sql::Database* db) { + blink::IndexedDBDatabaseMetadata metadata; + + // Set the database name and version. + { + sql::Statement statement(db->GetReadonlyStatement( + "SELECT name, version FROM indexed_db_metadata")); + TRANSIENT_CHECK(statement.Step()); + metadata.name = statement.ColumnString16(0); + metadata.version = statement.ColumnInt64(1); + } + + // Populate object store metadata. + { + sql::Statement statement(db->GetReadonlyStatement( + "SELECT id, name, key_path, auto_increment FROM object_stores")); + int64_t max_object_store_id = 0; + while (statement.Step()) { + blink::IndexedDBObjectStoreMetadata store_metadata; + store_metadata.id = statement.ColumnInt64(0); + store_metadata.name = statement.ColumnString16(1); + store_metadata.key_path = DecodeKeyPath(statement.ColumnString16(2)); + store_metadata.auto_increment = statement.ColumnBool(3); + max_object_store_id = std::max(max_object_store_id, store_metadata.id); + metadata.object_stores[store_metadata.id] = std::move(store_metadata); + } + TRANSIENT_CHECK(statement.Succeeded()); + metadata.max_object_store_id = max_object_store_id; + } + + return metadata; +} + +} // namespace + +// static +base::expected<std::unique_ptr<DatabaseConnection>, Status> +DatabaseConnection::Open(const std::u16string& name, + const base::FilePath& file_path) { + // TODO(crbug.com/40253999): Create new tag(s) for metrics. + constexpr sql::Database::Tag kSqlTag = "Test"; + auto db = std::make_unique<sql::Database>( + sql::DatabaseOptions().set_exclusive_locking(true).set_wal_mode(true), + kSqlTag); + + // TODO(crbug.com/40253999): Support on-disk databases. + TRANSIENT_CHECK(db->OpenInMemory()); + + auto meta_table = std::make_unique<sql::MetaTable>(); + TRANSIENT_CHECK(meta_table->Init(db.get(), kEmptySchemaVersion, + kCompatibleSchemaVersion)); + + switch (meta_table->GetVersionNumber()) { + case kEmptySchemaVersion: + InitializeNewDatabase(db.get(), name, meta_table.get()); + break; + // ... + // Schema upgrades go here. + // ... + case kCurrentSchemaVersion: + // Already current. + break; + default: + NOTREACHED(); + } + + blink::IndexedDBDatabaseMetadata metadata = + GenerateIndexedDbMetadata(db.get()); + // Database corruption can cause a mismatch. + TRANSIENT_CHECK(metadata.name == name); + + return base::WrapUnique(new DatabaseConnection( + std::move(db), std::move(meta_table), std::move(metadata))); +} + +DatabaseConnection::DatabaseConnection( + std::unique_ptr<sql::Database> db, + std::unique_ptr<sql::MetaTable> meta_table, + blink::IndexedDBDatabaseMetadata metadata) + : db_(std::move(db)), + meta_table_(std::move(meta_table)), + metadata_(std::move(metadata)) {} + +DatabaseConnection::~DatabaseConnection() = default; + +base::WeakPtr<DatabaseConnection> DatabaseConnection::GetWeakPtr() { + return weak_factory_.GetWeakPtr(); +} + +std::unique_ptr<BackingStoreTransactionImpl> +DatabaseConnection::CreateTransaction( + base::PassKey<BackingStoreDatabaseImpl>, + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode) { + // TODO(crbug.com/40253999): Ensure that `DatabaseConnection` outlives active + // instances of `BackingStoreTransactionImpl`. + auto transaction = std::make_unique<sql::Transaction>(db_.get()); + + // TODO(crbug.com/40253999): Assert preconditions for `mode`. + return std::make_unique<BackingStoreTransactionImpl>( + GetWeakPtr(), std::move(transaction), durability, mode); +} + +void DatabaseConnection::OnTransactionBegin( + base::PassKey<BackingStoreTransactionImpl>, + const BackingStoreTransactionImpl& transaction) { + // No other transaction can begin while a version change transaction is + // active. + CHECK(!HasActiveVersionChangeTransaction()); + if (transaction.mode() == blink::mojom::IDBTransactionMode::VersionChange) { + metadata_snapshot_.emplace(metadata_); + } +} + +void DatabaseConnection::OnBeforeTransactionCommit( + base::PassKey<BackingStoreTransactionImpl>, + const BackingStoreTransactionImpl& transaction) { + if (transaction.durability() == + blink::mojom::IDBTransactionDurability::Strict && + transaction.mode() != blink::mojom::IDBTransactionMode::ReadOnly) { + // TODO(crbug.com/40253999): Execute `PRAGMA synchronous=FULL` + } +} + +void DatabaseConnection::OnTransactionCommit( + base::PassKey<BackingStoreTransactionImpl>, + const BackingStoreTransactionImpl& transaction) { + // TODO(crbug.com/40253999): Reset the `synchronous` setting. + if (transaction.mode() == blink::mojom::IDBTransactionMode::VersionChange) { + CHECK(metadata_snapshot_.has_value()); + metadata_snapshot_.reset(); + } +} + +void DatabaseConnection::OnTransactionRollback( + base::PassKey<BackingStoreTransactionImpl>, + const BackingStoreTransactionImpl& transaction) { + // TODO(crbug.com/40253999): Reset the `synchronous` setting. + if (transaction.mode() == blink::mojom::IDBTransactionMode::VersionChange) { + CHECK(metadata_snapshot_.has_value()); + metadata_ = std::move(*metadata_snapshot_); + metadata_snapshot_.reset(); + } +} + +Status DatabaseConnection::SetDatabaseVersion( + base::PassKey<BackingStoreTransactionImpl>, + int64_t version) { + CHECK(HasActiveVersionChangeTransaction()); + sql::Statement statement( + db_->GetUniqueStatement("UPDATE indexed_db_metadata SET version = ?")); + statement.BindInt64(0, version); + TRANSIENT_CHECK(statement.Run()); + metadata_.version = version; + return Status::OK(); +} + +Status DatabaseConnection::CreateObjectStore( + base::PassKey<BackingStoreTransactionImpl>, + int64_t object_store_id, + std::u16string name, + blink::IndexedDBKeyPath key_path, + bool auto_increment) { + CHECK(HasActiveVersionChangeTransaction()); + if (metadata_.object_stores.contains(object_store_id)) { + return Status::InvalidArgument("Invalid object_store_id"); + } + TRANSIENT_CHECK(object_store_id > metadata_.max_object_store_id); + + blink::IndexedDBObjectStoreMetadata metadata( + std::move(name), object_store_id, std::move(key_path), auto_increment, + /*max_index_id=*/0); + sql::Statement statement(db_->GetCachedStatement( + SQL_FROM_HERE, + "INSERT INTO object_stores " + "(id, name, key_path, auto_increment) VALUES (?, ?, ?, ?)")); + statement.BindInt64(0, metadata.id); + statement.BindString16(1, metadata.name); + statement.BindString16(2, EncodeKeyPath(metadata.key_path)); + statement.BindBool(3, metadata.auto_increment); + TRANSIENT_CHECK(statement.Run()); + + metadata_.object_stores[object_store_id] = std::move(metadata); + metadata_.max_object_store_id = object_store_id; + return Status::OK(); +} + +} // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/database_connection.h b/content/browser/indexed_db/instance/sqlite/database_connection.h new file mode 100644 index 0000000..51c3a32 --- /dev/null +++ b/content/browser/indexed_db/instance/sqlite/database_connection.h
@@ -0,0 +1,95 @@ +// 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 CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_DATABASE_CONNECTION_H_ +#define CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_DATABASE_CONNECTION_H_ + +#include <memory> +#include <optional> +#include <string> + +#include "base/files/file_path.h" +#include "base/memory/weak_ptr.h" +#include "base/types/expected.h" +#include "base/types/pass_key.h" +#include "content/browser/indexed_db/status.h" +#include "third_party/blink/public/common/indexeddb/indexeddb_metadata.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-forward.h" + +namespace sql { +class Database; +class MetaTable; +} // namespace sql + +namespace content::indexed_db::sqlite { + +class BackingStoreDatabaseImpl; +class BackingStoreTransactionImpl; + +// Owns the sole connection to the SQLite database that is backing a given +// IndexedDB database. Also owns the schema, operations and in-memory metadata +// for this database. BackingStore interface methods call into this class to +// perform the actual database operations. +class DatabaseConnection { + public: + // Opens the SQL database for the IndexedDB database with `name` at + // `file_path`, creating it if it doesn't exist. + static base::expected<std::unique_ptr<DatabaseConnection>, Status> Open( + const std::u16string& name, + const base::FilePath& file_path); + + DatabaseConnection(const DatabaseConnection&) = delete; + DatabaseConnection& operator=(const DatabaseConnection&) = delete; + ~DatabaseConnection(); + + const blink::IndexedDBDatabaseMetadata& metadata() const { return metadata_; } + + base::WeakPtr<DatabaseConnection> GetWeakPtr(); + + // Exposed to `BackingStoreDatabaseImpl`. + std::unique_ptr<BackingStoreTransactionImpl> CreateTransaction( + base::PassKey<BackingStoreDatabaseImpl>, + blink::mojom::IDBTransactionDurability durability, + blink::mojom::IDBTransactionMode mode); + + // Exposed to `BackingStoreTransactionImpl`. + void OnTransactionBegin(base::PassKey<BackingStoreTransactionImpl>, + const BackingStoreTransactionImpl& transaction); + void OnBeforeTransactionCommit( + base::PassKey<BackingStoreTransactionImpl>, + const BackingStoreTransactionImpl& transaction); + void OnTransactionCommit(base::PassKey<BackingStoreTransactionImpl>, + const BackingStoreTransactionImpl& transaction); + void OnTransactionRollback(base::PassKey<BackingStoreTransactionImpl>, + const BackingStoreTransactionImpl& transaction); + Status SetDatabaseVersion(base::PassKey<BackingStoreTransactionImpl>, + int64_t version); + Status CreateObjectStore(base::PassKey<BackingStoreTransactionImpl>, + int64_t object_store_id, + std::u16string name, + blink::IndexedDBKeyPath key_path, + bool auto_increment); + + private: + DatabaseConnection(std::unique_ptr<sql::Database> db, + std::unique_ptr<sql::MetaTable> meta_table, + blink::IndexedDBDatabaseMetadata metadata); + + bool HasActiveVersionChangeTransaction() const { + return metadata_snapshot_.has_value(); + } + + std::unique_ptr<sql::Database> db_; + std::unique_ptr<sql::MetaTable> meta_table_; + blink::IndexedDBDatabaseMetadata metadata_; + + // Only set while a version change transaction is active. + std::optional<blink::IndexedDBDatabaseMetadata> metadata_snapshot_; + + base::WeakPtrFactory<DatabaseConnection> weak_factory_{this}; +}; + +} // namespace content::indexed_db::sqlite + +#endif // CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_DATABASE_CONNECTION_H_
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc index ce4d203..38660ab 100644 --- a/content/browser/media/session/media_session_impl.cc +++ b/content/browser/media/session/media_session_impl.cc
@@ -158,22 +158,6 @@ int player_id) : observer(observer), player_id(player_id) {} -bool MediaSessionImpl::PlayerIdentifier::operator==( - const PlayerIdentifier& other) const { - return this->observer == other.observer && this->player_id == other.player_id; -} - -bool MediaSessionImpl::PlayerIdentifier::operator!=( - const PlayerIdentifier& other) const { - return this->observer != other.observer || this->player_id != other.player_id; -} - -bool MediaSessionImpl::PlayerIdentifier::operator<( - const PlayerIdentifier& other) const { - return observer != other.observer ? observer < other.observer - : player_id < other.player_id; -} - // static MediaSession* MediaSession::Get(WebContents* web_contents) { return MediaSessionImpl::Get(web_contents);
diff --git a/content/browser/media/session/media_session_impl.h b/content/browser/media/session/media_session_impl.h index 0e84a95..2bfa67b 100644 --- a/content/browser/media/session/media_session_impl.h +++ b/content/browser/media/session/media_session_impl.h
@@ -397,9 +397,10 @@ PlayerIdentifier& operator=(const PlayerIdentifier&) = default; PlayerIdentifier& operator=(PlayerIdentifier&&) = default; - bool operator==(const PlayerIdentifier& other) const; - bool operator!=(const PlayerIdentifier& other) const; - bool operator<(const PlayerIdentifier& other) const; + friend bool operator==(const PlayerIdentifier&, + const PlayerIdentifier&) = default; + friend auto operator<=>(const PlayerIdentifier&, + const PlayerIdentifier&) = default; // RAW_PTR_EXCLUSION: #union RAW_PTR_EXCLUSION MediaSessionPlayerObserver* observer; int player_id;
diff --git a/content/browser/process_lock.cc b/content/browser/process_lock.cc index 7eea2fcb..867ec0a 100644 --- a/content/browser/process_lock.cc +++ b/content/browser/process_lock.cc
@@ -149,10 +149,6 @@ return site_info_->ProcessLockCompareTo(rhs.site_info_.value()) == 0; } -bool ProcessLock::operator!=(const ProcessLock& rhs) const { - return !(*this == rhs); -} - bool ProcessLock::operator<(const ProcessLock& rhs) const { if (!site_info_.has_value() && !rhs.site_info_.has_value()) return false;
diff --git a/content/browser/process_lock.h b/content/browser/process_lock.h index d896740..9ab59ec1 100644 --- a/content/browser/process_lock.h +++ b/content/browser/process_lock.h
@@ -207,7 +207,6 @@ bool IsCompatibleWithWebExposedIsolation(const SiteInfo& site_info) const; bool operator==(const ProcessLock& rhs) const; - bool operator!=(const ProcessLock& rhs) const; // Defined to allow this object to act as a key for std::map. bool operator<(const ProcessLock& rhs) const;
diff --git a/content/browser/renderer_host/input/input_transfer_handler_android.h b/content/browser/renderer_host/input/input_transfer_handler_android.h index 274d5e6..bb5c44f 100644 --- a/content/browser/renderer_host/input/input_transfer_handler_android.h +++ b/content/browser/renderer_host/input/input_transfer_handler_android.h
@@ -80,7 +80,8 @@ void OnTouchEnd(base::TimeTicks event_time); - bool IsTouchSequencePotentiallyActiveOnViz() const; + // Virtual for testing. + virtual bool IsTouchSequencePotentiallyActiveOnViz() const; RenderWidgetHost::InputEventObserver& GetInputObserver() { return input_observer_;
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc index 70185f2..14103a20 100644 --- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -2029,15 +2029,9 @@ // renderer agree about the length of the history list, and that both get it // right. // TODO(crbug.com/335458094): Flaky on Linux TSan. -#if BUILDFLAG(IS_LINUX) && defined(THREAD_SANITIZER) -#define MAYBE_CorrectLengthWithNewTabNavigatingFromWebUI \ - DISABLED_CorrectLengthWithNewTabNavigatingFromWebUI -#else -#define MAYBE_CorrectLengthWithNewTabNavigatingFromWebUI \ - CorrectLengthWithNewTabNavigatingFromWebUI -#endif +// Gardening(crbug.com/346960510) IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, - MAYBE_CorrectLengthWithNewTabNavigatingFromWebUI) { + DISABLED_CorrectLengthWithNewTabNavigatingFromWebUI) { GURL web_ui_page(std::string(kChromeUIScheme) + "://" + std::string(kChromeUIGpuHost)); EXPECT_TRUE(NavigateToURL(shell(), web_ui_page)); @@ -2643,13 +2637,9 @@ // Tests various cases of replacements caused by error pages. // TODO(crbug.com/335458094): Flaky on Linux TSan. -#if BUILDFLAG(IS_LINUX) && defined(THREAD_SANITIZER) -#define MAYBE_ErrorPageReplacement DISABLED_ErrorPageReplacement -#else -#define MAYBE_ErrorPageReplacement ErrorPageReplacement -#endif +// Gardening(crbug.com/346960510) IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, - MAYBE_ErrorPageReplacement) { + DISABLED_ErrorPageReplacement) { NavigationController& controller = shell()->web_contents()->GetController(); GetIOThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce(&net::URLRequestFailedJob::AddUrlHandler)); @@ -14139,7 +14129,9 @@ // This test verifies that reloading a POST request that is uncacheable won't // incorrectly result in a GET request. This is a regression test for // https://crbug.com/860807. -IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, UncacheablePost) { +// Gardening(crbug.com/346960510) +IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, + DISABLED_UncacheablePost) { GURL main_url(embedded_test_server()->GetURL( "initial-page.example.com", "/form_that_posts_to_echoall_nocache.html")); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -14307,6 +14299,7 @@ // https://crbug.com/783806. // Flaky on every platforms: // https://crbug.com/765107#c15 +// Gardening(crbug.com/346960510) IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, DISABLED_EnsureFrameNavigationEntriesClearedOnMismatch) { WebContentsImpl* web_contents = @@ -14827,8 +14820,9 @@ // Test that verifies that Content-Type http header is correctly sent // to the final destination of a cross-site POST with a few redirects thrown in. // Test for https://crbug.com/860546. +// Gardening(crbug.com/346960510) IN_PROC_BROWSER_TEST_P(NavigationControllerBrowserTest, - ContentTypeHeaderAfterRedirectAndRefresh) { + DISABLED_ContentTypeHeaderAfterRedirectAndRefresh) { // Navigate to the page with form that posts via 307 redirection to // |redirect_target_url| (cross-site from |form_url|). Using 307 (rather than // 302) redirection is important to preserve the HTTP method and POST body. @@ -17863,16 +17857,10 @@ // deletion is ignored and does not result in a crash. See // https://crbug.com/1019180. // TODO(crbug.com/40819000): Flaky failures -#if BUILDFLAG(IS_CHROMEOS) -#define MAYBE_BrowserInitiatedLoadPostCommitErrorPageIgnoredForFramePendingDeletion \ - DISABLED_BrowserInitiatedLoadPostCommitErrorPageIgnoredForFramePendingDeletion -#else -#define MAYBE_BrowserInitiatedLoadPostCommitErrorPageIgnoredForFramePendingDeletion \ - BrowserInitiatedLoadPostCommitErrorPageIgnoredForFramePendingDeletion -#endif +// Gardening(crbug.com/346960510) IN_PROC_BROWSER_TEST_P( NavigationControllerBrowserTest, - MAYBE_BrowserInitiatedLoadPostCommitErrorPageIgnoredForFramePendingDeletion) { + DISABLED_BrowserInitiatedLoadPostCommitErrorPageIgnoredForFramePendingDeletion) { NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>( shell()->web_contents()->GetController());
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 4213ca1..e34559f 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -689,6 +689,12 @@ // flag, enables the browser to track and reuse free and empty renderer // processes to optimize process creation and navigation performance. bool IsEmptyRendererProcessesReuseAllowed() { + // In single-process mode (run_renderer_in_process()), there's no separate + // renderer process to track for reuse. This logic is therefore skipped + // to prevent issues and because reuse is not applicable. + if (RenderProcessHost::run_renderer_in_process()) { + return false; + } return base::FeatureList::IsEnabled( features::kTrackEmptyRendererProcessesForReuse); }
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index ae9ebdfa4f..2be1cd4 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -1612,31 +1612,17 @@ } void RenderWidgetHostViewAndroid::ResetGestureDetection() { - const ui::MotionEvent* current_down_event = - gesture_provider_.GetCurrentDownEvent(); - if (!current_down_event) { - // A hard reset ensures prevention of any timer-based events that might fire - // after a touch sequence has ended. - gesture_provider_.ResetDetection(); + // TODO(crbug.com/412591209): Fix this for active fling case. + if (IsTouchSequencePotentiallyActiveOnViz()) { + if (!host()) { + return; + } + auto* remote = host()->delegate()->GetRenderInputRouterDelegateRemote(); + remote->ResetGestureDetection(GetFrameSinkId()); return; } - std::unique_ptr<ui::MotionEvent> cancel_event = current_down_event->Cancel(); - if (gesture_provider_.OnTouchEvent(*cancel_event).succeeded) { - bool causes_scrolling = false; - ui::LatencyInfo latency_info; - latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT); - blink::WebTouchEvent web_event = ui::CreateWebTouchEventFromMotionEvent( - *cancel_event, causes_scrolling /* may_cause_scrolling */, - false /* hovering */); - if (ShouldRouteEvents()) { - host()->delegate()->GetInputEventRouter()->RouteTouchEvent( - this, &web_event, latency_info); - } else { - host()->GetRenderInputRouter()->ForwardTouchEventWithLatencyInfo( - web_event, latency_info); - } - } + input_helper_->ResetGestureDetection(); } void RenderWidgetHostViewAndroid::OnOldViewDidNavigatePreCommit() {
diff --git a/content/browser/renderer_host/render_widget_host_view_android_unittest.cc b/content/browser/renderer_host/render_widget_host_view_android_unittest.cc index 6c5bd4c..ae1414d 100644 --- a/content/browser/renderer_host/render_widget_host_view_android_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
@@ -99,6 +99,11 @@ OnTouchEvent, (const ui::MotionEventAndroid& event), (override)); + + MOCK_METHOD(bool, + IsTouchSequencePotentiallyActiveOnViz, + (), + (const, override)); }; class MockMojoRenderInputRouterDelegate @@ -125,6 +130,8 @@ void(const viz::FrameSinkId& frame_sink_id)); MOCK_METHOD2(NotifyVisibilityChanged, void(const viz::FrameSinkId& frame_sink_id, bool is_hidden)); + MOCK_METHOD1(ResetGestureDetection, + void(const viz::FrameSinkId& frame_sink_id)); private: mojo::Receiver<input::mojom::RenderInputRouterDelegate> receiver_{this}; @@ -478,6 +485,57 @@ EXPECT_NE(gesture_provider.GetCurrentDownEvent(), nullptr); } +TEST_F(RenderWidgetHostViewAndroidTest, ResetGestureDetectionGeneratesCancel) { + RenderWidgetHostViewAndroid* rwhva = render_widget_host_view_android(); + + gfx::Point point(/*x=*/100, /*y=*/100); + ui::MotionEventAndroid::Pointer p(0, point.x(), point.y(), 10, 0, 0, 0, 0); + JNIEnv* env = base::android::AttachCurrentThread(); + auto time_ns = (ui::EventTimeForNow() - base::TimeTicks()).InNanoseconds(); + auto action = ui::MotionEvent::Action::DOWN; + ui::MotionEventAndroidJava touch_down( + env, nullptr, 1.f, 0, 0, 0, base::TimeTicks::FromJavaNanoTime(time_ns), + ui::MotionEventAndroid::GetAndroidAction(action), 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, false, &p, nullptr); + rwhva->OnTouchEvent(touch_down); + + auto& gesture_provider = rwhva->GetGestureProvider(); + EXPECT_NE(gesture_provider.GetCurrentDownEvent(), nullptr); + + rwhva->ResetGestureDetection(); + + // The current down should have been reset as a result of processing cancel + // generated from `ResetGestureDetection` call. + EXPECT_EQ(gesture_provider.GetCurrentDownEvent(), nullptr); + + MockRenderWidgetHost* mock_widget = + static_cast<MockRenderWidgetHost*>(rwhva->host()); + std::optional<blink::WebTouchEvent> touch_event = + mock_widget->mock_render_input_router() + ->GetAndResetLastForwardedTouchEvent(); + CHECK(touch_event.has_value()); + CHECK_EQ(touch_event->GetType(), blink::WebInputEvent::Type::kTouchCancel); +} + +TEST_F(RenderWidgetHostViewAndroidTest, ResetGestureDetectionOnViz) { + RenderWidgetHostViewAndroid* rwhva = render_widget_host_view_android(); + + MockInputTransferHandler* handler = new MockInputTransferHandler(); + rwhva->SetInputTransferHandlerForTesting(handler); + + MockMojoRenderInputRouterDelegate rir_delegate; + delegate()->set_render_input_router_delegate_remote( + rir_delegate.GetPendingRemote()); + + EXPECT_CALL(*handler, IsTouchSequencePotentiallyActiveOnViz()) + .WillOnce(Return(true)); + EXPECT_CALL(rir_delegate, ResetGestureDetection).Times(1); + + rwhva->ResetGestureDetection(); + + base::RunLoop().RunUntilIdle(); +} + // Tests that when an input sequence is handled on browser with InputVizard, // browser sends a StopFlingingOnViz mojo call to VizCompositorThread. TEST_F(RenderWidgetHostViewAndroidTest, StopFlingingOnViz) {
diff --git a/content/browser/site_info.cc b/content/browser/site_info.cc index a8b49ab..1b14a85 100644 --- a/content/browser/site_info.cc +++ b/content/browser/site_info.cc
@@ -598,12 +598,8 @@ return IsSamePrincipalWith(other); } -bool SiteInfo::operator!=(const SiteInfo& other) const { - return !IsSamePrincipalWith(other); -} - -bool SiteInfo::operator<(const SiteInfo& other) const { - return MakeSecurityPrincipalKey(*this) < MakeSecurityPrincipalKey(other); +std::weak_ordering SiteInfo::operator<=>(const SiteInfo& other) const { + return MakeSecurityPrincipalKey(*this) <=> MakeSecurityPrincipalKey(other); } std::string SiteInfo::GetDebugString() const {
diff --git a/content/browser/site_info.h b/content/browser/site_info.h index 743c414..0ded9e6 100644 --- a/content/browser/site_info.h +++ b/content/browser/site_info.h
@@ -316,13 +316,12 @@ // Note: equality operators are defined in terms of IsSamePrincipalWith(). bool operator==(const SiteInfo& other) const; - bool operator!=(const SiteInfo& other) const; // Defined to allow this object to act as a key for std::map and std::set. // Note that the key is determined based on what distinguishes one security // principal from another (see IsSamePrincipalWith) and does not necessarily // include all the fields in SiteInfo. - bool operator<(const SiteInfo& other) const; + std::weak_ordering operator<=>(const SiteInfo& other) const; // Returns a string representation of this SiteInfo principal. std::string GetDebugString() const;
diff --git a/content/browser/web_exposed_isolation_info.cc b/content/browser/web_exposed_isolation_info.cc index 5660dd5..98cad2c 100644 --- a/content/browser/web_exposed_isolation_info.cc +++ b/content/browser/web_exposed_isolation_info.cc
@@ -84,11 +84,6 @@ return true; } -bool WebExposedIsolationInfo::operator!=( - const WebExposedIsolationInfo& b) const { - return !(operator==(b)); -} - bool WebExposedIsolationInfo::operator<( const WebExposedIsolationInfo& b) const { // Nonisolated < Isolated < Isolated Application.
diff --git a/content/browser/web_exposed_isolation_info.h b/content/browser/web_exposed_isolation_info.h index dbe2560..2a7b0b1 100644 --- a/content/browser/web_exposed_isolation_info.h +++ b/content/browser/web_exposed_isolation_info.h
@@ -85,7 +85,6 @@ const url::Origin& origin() const; bool operator==(const WebExposedIsolationInfo& b) const; - bool operator!=(const WebExposedIsolationInfo& b) const; // Non-isolated < Isolated < Isolated Application. //
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java index ddbc19b2..e660348 100644 --- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java +++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/DOMUtils.java
@@ -810,8 +810,7 @@ TestInputMethodManagerWrapper inputMethodManagerWrapper = TestInputMethodManagerWrapper.create(imeAdapter); imeAdapter.setInputMethodManagerWrapper(inputMethodManagerWrapper); - // Click the text field node, so that it would get focus. - DOMUtils.clickNode(webContents, nodeId); + DOMUtils.focusNode(webContents, nodeId); CriteriaHelper.pollInstrumentationThread( () -> { try {
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index 8e0acb2..1fc0040 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -550,7 +550,6 @@ return document_url == rhs.document_url && render_frame_event == rhs.render_frame_event; } - bool operator!=(const SourceAnnotation& rhs) const { return !(*this == rhs); } }; std::ostream& operator<<(std::ostream& out, const SourceAnnotation& s) {
diff --git a/content/test/mock_render_input_router.cc b/content/test/mock_render_input_router.cc index 59d52f6a3..94cb47a 100644 --- a/content/test/mock_render_input_router.cc +++ b/content/test/mock_render_input_router.cc
@@ -41,6 +41,7 @@ const ui::LatencyInfo& ui_latency) { RenderInputRouter::ForwardTouchEventWithLatencyInfo(touch_event, ui_latency); SetLastWheelOrTouchEventLatencyInfo(ui::LatencyInfo(ui_latency)); + last_forwarded_touch_event_ = touch_event; } void MockRenderInputRouter::ForwardGestureEventWithLatencyInfo( @@ -58,6 +59,13 @@ return ret; } +std::optional<WebTouchEvent> +MockRenderInputRouter::GetAndResetLastForwardedTouchEvent() { + std::optional<WebTouchEvent> ret; + last_forwarded_touch_event_.swap(ret); + return ret; +} + MockWidgetInputHandler::MessageVector MockRenderInputRouter::GetAndResetDispatchedMessages() { return mock_widget_input_handler_->GetAndResetDispatchedMessages();
diff --git a/content/test/mock_render_input_router.h b/content/test/mock_render_input_router.h index 5c060ed50f..16eaeb6 100644 --- a/content/test/mock_render_input_router.h +++ b/content/test/mock_render_input_router.h
@@ -14,6 +14,7 @@ #include "content/test/mock_widget_input_handler.h" using blink::WebGestureEvent; +using blink::WebTouchEvent; namespace content { @@ -51,6 +52,7 @@ const ui::LatencyInfo& ui_latency) override; std::optional<WebGestureEvent> GetAndResetLastForwardedGestureEvent(); + std::optional<WebTouchEvent> GetAndResetLastForwardedTouchEvent(); void SetLastWheelOrTouchEventLatencyInfo(ui::LatencyInfo latency_info) { last_wheel_or_touch_event_latency_info_ = latency_info; @@ -73,6 +75,7 @@ private: std::optional<ui::LatencyInfo> last_wheel_or_touch_event_latency_info_; std::optional<WebGestureEvent> last_forwarded_gesture_event_; + std::optional<WebTouchEvent> last_forwarded_touch_event_; }; } // namespace content
diff --git a/device/fido/OWNERS b/device/fido/OWNERS index b063b212..4c998d3 100644 --- a/device/fido/OWNERS +++ b/device/fido/OWNERS
@@ -4,7 +4,6 @@ # people are more familiar with certain areas of the code so, if you spot that # your area of alteration is listed, you should prefer to select that person. -agl@chromium.org kenrb@chromium.org martinkr@google.com nsatragno@chromium.org
diff --git a/extensions/browser/lazy_context_task_queue.h b/extensions/browser/lazy_context_task_queue.h index b9870d1..170e81b 100644 --- a/extensions/browser/lazy_context_task_queue.h +++ b/extensions/browser/lazy_context_task_queue.h
@@ -38,8 +38,6 @@ const int64_t service_worker_version_id; const int worker_thread_id; const GURL url; - // TODO(dbertoni): This needs to be initialized for the Service Worker - // version of the constructor. // `browser_context` is not a raw_ptr<...> for performance reasons (based on // analysis of sampling profiler data). RAW_PTR_EXCLUSION content::BrowserContext* const browser_context = nullptr;
diff --git a/headless/public/switches.h b/headless/public/switches.h index f95e0c0..b804f8fd 100644 --- a/headless/public/switches.h +++ b/headless/public/switches.h
@@ -115,7 +115,7 @@ inline constexpr char kProxyServer[] = "proxy-server"; // Headless screen info in the format: {0,0 800x600}{800,0 600x800}. -// See //components/headless/screen_info/headless_screen_info.h for details. +// See //components/headless/screen_info/README.md for more details. inline constexpr char kScreenInfo[] = "screen-info"; // A string used to override the default user agent with a custom one.
diff --git a/infra/config/generated/builders/ci/GPU FYI Mac arm64 Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Mac arm64 Builder/targets/chromium.gpu.fyi.json index 3fbb3c2..48ea93b 100644 --- a/infra/config/generated/builders/ci/GPU FYI Mac arm64 Builder/targets/chromium.gpu.fyi.json +++ b/infra/config/generated/builders/ci/GPU FYI Mac arm64 Builder/targets/chromium.gpu.fyi.json
@@ -13,7 +13,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -41,7 +41,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -73,7 +73,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -95,7 +95,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -121,7 +121,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -149,7 +149,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -188,7 +188,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -235,7 +235,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -273,7 +273,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -311,7 +311,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -353,7 +353,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -400,7 +400,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -439,7 +439,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -477,7 +477,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -515,7 +515,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -556,7 +556,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -597,7 +597,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -636,7 +636,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -674,7 +674,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800,
diff --git "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/targets/chromium.gpu.fyi.json" index 06555058..d9d43e5 100644 --- "a/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/targets/chromium.gpu.fyi.json" +++ "b/infra/config/generated/builders/ci/Mac FYI Experimental Release \050Apple M1\051/targets/chromium.gpu.fyi.json"
@@ -13,7 +13,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -41,7 +41,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -73,7 +73,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -95,7 +95,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -121,7 +121,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -149,7 +149,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -188,7 +188,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -235,7 +235,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -273,7 +273,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -311,7 +311,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -353,7 +353,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -400,7 +400,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -439,7 +439,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -477,7 +477,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -515,7 +515,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -556,7 +556,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -597,7 +597,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -636,7 +636,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -674,7 +674,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800,
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/targets/chromium.gpu.fyi.json index 06555058..d9d43e5 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/targets/chromium.gpu.fyi.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp/targets/chromium.gpu.fyi.json
@@ -13,7 +13,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -41,7 +41,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -73,7 +73,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -95,7 +95,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -121,7 +121,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -149,7 +149,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -188,7 +188,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -235,7 +235,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -273,7 +273,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -311,7 +311,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -353,7 +353,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -400,7 +400,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -439,7 +439,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -477,7 +477,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -515,7 +515,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -556,7 +556,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -597,7 +597,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -636,7 +636,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800, @@ -674,7 +674,7 @@ "display_attached": "1", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests" }, "hard_timeout": 1800,
diff --git a/infra/config/generated/testing/mixins.pyl b/infra/config/generated/testing/mixins.pyl index 159ef3a..32a4c07 100644 --- a/infra/config/generated/testing/mixins.pyl +++ b/infra/config/generated/testing/mixins.pyl
@@ -544,7 +544,7 @@ 'cpu': 'arm64', 'gpu': 'apple:m1', 'mac_model': 'Macmini9,1', - 'os': 'Mac-15.4', + 'os': 'Mac-15.5', 'pool': 'chromium.tests', 'display_attached': '1', },
diff --git a/infra/config/targets/mixins.star b/infra/config/targets/mixins.star index a85e4ae..206f2fc 100644 --- a/infra/config/targets/mixins.star +++ b/infra/config/targets/mixins.star
@@ -1655,7 +1655,7 @@ "cpu": "arm64", "gpu": "apple:m1", "mac_model": "Macmini9,1", - "os": "Mac-15.4", + "os": "Mac-15.5", "pool": "chromium.tests", "display_attached": "1", },
diff --git a/infra/inclusive_language_presubmit_exempt_dirs.txt b/infra/inclusive_language_presubmit_exempt_dirs.txt index 6372ace4..ac24ecd 100644 --- a/infra/inclusive_language_presubmit_exempt_dirs.txt +++ b/infra/inclusive_language_presubmit_exempt_dirs.txt
@@ -360,6 +360,7 @@ third_party/blink/renderer/core/html/custom 1 1 third_party/blink/renderer/core/html/fenced_frame 2 1 third_party/blink/renderer/core/layout 1 1 +third_party/blink/renderer/core/layout/flex 1 1 third_party/blink/renderer/core/layout/inline 2 2 third_party/blink/renderer/core/permissions_policy 1 1 third_party/blink/renderer/core/resize_observer 1 1 @@ -656,6 +657,7 @@ third_party/rust/chromium_crates_io/vendor/codespan-reporting-v0_12 4 2 third_party/rust/chromium_crates_io/vendor/codespan-reporting-v0_12/examples 1 1 third_party/rust/chromium_crates_io/vendor/crc32fast-v1/.github/workflows 2 1 +third_party/rust/chromium_crates_io/vendor/crossbeam-utils-v0_8 3 3 third_party/rust/chromium_crates_io/vendor/cxx-v1 1 1 third_party/rust/chromium_crates_io/vendor/cxx-v1/book 1 1 third_party/rust/chromium_crates_io/vendor/cxx-v1/book/src 3 1 @@ -735,6 +737,8 @@ third_party/rust/chromium_crates_io/vendor/windows-sys-v0_52 1 1 third_party/rust/chromium_crates_io/vendor/windows-sys-v0_52/src/Windows/Wdk/System/SystemServices 1 1 third_party/rust/chromium_crates_io/vendor/windows-sys-v0_52/src/Windows/Win32/Networking/Clustering 2 1 +third_party/rust/chromium_crates_io/vendor/zip-v2 2 2 +third_party/rust/chromium_crates_io/vendor/zip-v2/src 1 1 third_party/screen-ai 1 1 third_party/sentencepiece/src 2 2 third_party/sentencepiece/src/doc 3 1 @@ -794,7 +798,6 @@ third_party/wpt_tools/wpt/tools/wpt 6 3 third_party/wpt_tools/wpt/tools/wptrunner 1 1 third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers 1 1 -third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters 1 1 third_party/wuffs 3 1 third_party/xcbproto 2 1 third_party/xcbproto/src/src 2 1 @@ -848,6 +851,7 @@ ui/gfx/x 1 1 ui/gfx/x/generated_protos 6 2 ui/gtk 1 1 +ui/menus/android 1 1 ui/ozone/platform/drm/common 6 2 ui/ozone/platform/drm/gpu 5 3 ui/ozone/platform/drm/host 2 2
diff --git a/ios/chrome/app/profile/identity_confirmation_profile_agent.mm b/ios/chrome/app/profile/identity_confirmation_profile_agent.mm index f75c7cf..289e105e 100644 --- a/ios/chrome/app/profile/identity_confirmation_profile_agent.mm +++ b/ios/chrome/app/profile/identity_confirmation_profile_agent.mm
@@ -224,11 +224,11 @@ ManagementState managementState = GetManagementState(identityManager, authenticationService, prefService); - MDCSnackbarMessage* snackbarTitle = [[IdentitySnackbarMessage alloc] - initWithName:systemIdentity.userGivenName - email:systemIdentity.userEmail - avatar:avatar - managed:managementState.is_profile_managed()]; + MDCSnackbarMessage* snackbarTitle = + [[IdentitySnackbarMessage alloc] initWithName:systemIdentity.userGivenName + email:systemIdentity.userEmail + avatar:avatar + managementState:managementState]; CommandDispatcher* dispatcher = browser->GetCommandDispatcher(); id<SnackbarCommands> snackbarCommandsHandler =
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd index b4c7b5c..d6969b7a 100644 --- a/ios/chrome/app/strings/ios_chromium_strings.grd +++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -378,6 +378,9 @@ <message name="IDS_IOS_ENTERPRISE_FORCED_SIGNIN_MESSAGE_WITH_LEARN_MORE" desc="Text to inform the user about the forced sign-in policy with a Learn More link that redirects to a page that gives more details. (Force Sign In) [iOS only]"> Your organization requires you to sign in to use Chromium. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> </message> + <message name="IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN" desc="The snackbar message subtitle to confirm the signed-in account after a successful account switch. For enterprise users, we remind them that their browser is managed by their company, school, or organization. This string does not have line break, so terminal punctuation is required for sentence fragments. [iOS only]"> + <ph name="EMAIL">$1<ex>johndoe@acme.com</ex></ph>. Chromium is managed. + </message> <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO."> Your organization turned off the ability to use and save Chromium data in your Google Account. New bookmarks, passwords, and more will be saved only to this device. </message>
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN.png.sha1 new file mode 100644 index 0000000..0f000d2 --- /dev/null +++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN.png.sha1
@@ -0,0 +1 @@ +e7f1a761f68ec881ead905595b7ef83a71b891d1 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd index 6dddee73..99fed8f1 100644 --- a/ios/chrome/app/strings/ios_google_chrome_strings.grd +++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -378,6 +378,9 @@ <message name="IDS_IOS_ENTERPRISE_FORCED_SIGNIN_MESSAGE_WITH_LEARN_MORE" desc="Text to inform the user about the forced sign-in policy with a Learn More link that redirects to a page that gives more details. (Force Sign In) [iOS only]"> Your organization requires you to sign in to use Chrome. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> </message> + <message name="IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN" desc="The snackbar message subtitle to confirm the signed-in account after a successful account switch. For enterprise users, we remind them that their browser is managed by their company, school, or organization. This string does not have line break, so terminal punctuation is required for sentence fragments. [iOS only]"> + <ph name="EMAIL">$1<ex>johndoe@acme.com</ex></ph>. Chrome is managed. + </message> <message name="IDS_IOS_ENTERPRISE_SYNC_DISABLED_MESSAGE_WITH_UNO" desc="Message displayed in a prompt when saving data (like bookmarks/reading list/passwords...) is disabled due to an enterprise policy. Related with IDS_IOS_ENTERPRISE_SYNC_DISABLED_TITLE_UNO."> Your organization turned off the ability to use and save Chrome data in your Google Account. New bookmarks, passwords, and more will be saved only to this device. </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN.png.sha1 new file mode 100644 index 0000000..1d9c64f95 --- /dev/null +++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN.png.sha1
@@ -0,0 +1 @@ +0bfe842e0c053381775931878bbc50ad52b1b140 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb index 512bf52..c8eae25 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_pt-BR.xtb
@@ -312,7 +312,7 @@ Seus dados foram criptografados com a senha longa em <ph name="TIME" />. Digite-a para usar e salvar os dados do Chrome na sua Conta do Google.</translation> <translation id="8540666473246803645">Google Chrome</translation> -<translation id="8544583291890527417">Mostra alertas sobre problemas de privacidade ou segurança detectados pelo Chrome.</translation> +<translation id="8544583291890527417">Receba alertas sobre problemas de privacidade ou segurança detectados pelo Chrome.</translation> <translation id="8558480467877843976">Agora você pode usar o Chrome sempre que navegar ou tocar em links em mensagens, documentos e outros apps.</translation> <translation id="8603022514504485810">O Gerenciador de senhas do Google não conseguiu verificar todas as senhas. Tente de novo amanhã ou <ph name="BEGIN_LINK" />verifique-as na sua Conta do Google<ph name="END_LINK" />.</translation> <translation id="8630122478628016441">Ative a opção "Bloquear guias anônimas ao fechar o Chrome".</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index 1a398e11..e757cd72 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Laai tans af … <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Kieslys → Instellings → Betaalmetodes</translation> <translation id="7108338896283013870">Versteek</translation> +<translation id="7115051913071512405">Probeer dit</translation> <translation id="7128693485119315539">Dit kan nodig wees dat jou organisasie blaaierdata verbonde aan jou bestuurde rekening moet sien en bestuur, soos jou blaaigeskiedenis en wagwoorde.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera is onbeskikbaar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 393aeab..47e35847 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">ድርጅትዎ በመለያ መግባትን አጥፍቷል። አዳዲስ ዕልባቶች፣ የይለፍ ቃላት እና ሌሎችም በዚህ መሣሪያ ላይ ብቻ ይቀመጣሉ።</translation> <translation id="3213807041830307252">የእርስዎን ካሜራ እና የፎቶ ማዕከለ ሥዕላት ተጠቅመው ያዩትን ይግዙ፣ ይተርጉሙ እና ይለዩ</translation> <translation id="3214379938835224220">እንደ የእርስዎ iPad ዳግም ማስጀመር አንድ አካል ከመለያዎ ዘግተው እንዲወጡ ተደርገዋል። በመለያ ለመግባት ከታች ያለውን ቀጥልን መታ ያድርጉ።</translation> +<translation id="3218296450292600703">በሚተዳደረው መለያዎ መግባት ከድርጅትዎ ጋር ተዛማጅ አሰሳን (ትሮች፣ ታሪክ እና የይለፍ ቃላትን ጨምሮ) ከሌላ አሰሳዎ ጋር ለይተው እንዲያቆዩ ያግዝዎታል።</translation> <translation id="3224075676564434205">ትሮቹ በዚህ መሣሪያ ላይ ክፍት እንደሆኑ ይቆያሉ፣ ነገር ግን ቡድኑ ወደ <ph name="USER_EMAIL" /> ከገቡ ሁሉም መሣሪያዎች ይሰረዛል።</translation> <translation id="3224641773458703735">የይለፍ ቃላትን ወደ ውጭ ለመላክ በመጀመሪያ በመሣሪያዎ ላይ የይለፍ ኮድ ማዘጋጀት አለብዎት።</translation> <translation id="3227137524299004712">ማይክሮፎን</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">በማውረድ ላይ… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">ምናሌ → ቅንብሮች → የመክፈያ ዘዴዎች</translation> <translation id="7108338896283013870">ደብቅ</translation> +<translation id="7115051913071512405">ሞክረው</translation> <translation id="7128693485119315539">ደርጅትዎ እንደ የእርስዎ የአሰሳ ታሪክ እና የይለፍ ቃላት ያለ ከሚተዳደር መለያ ጋር የተያያዘ የአሰሳ ውሂብን ማየት እና ማስተዳደር ሊያስፈልገው ይችላል።</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">ካሜራ አይገኝም</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 50322c1..34f1d246 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -1482,6 +1482,7 @@ <translation id="7102005569666697658">جارٍ تنزيل… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">"القائمة" ← "الإعدادات" ← "طُرق الدفع"</translation> <translation id="7108338896283013870">إخفاء</translation> +<translation id="7115051913071512405">جرب بنفسك</translation> <translation id="7128693485119315539">قد تحتاج مؤسستك إلى الاطّلاع على بيانات التصفّح المرتبطة بحسابك المُدار وإدارتها، مثل سجلّ التصفُّح وكلمات المرور.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">الكاميرا غير متاحة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index b0bd061..d65a95c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">আপোনাৰ প্ৰতিষ্ঠানে ছাইন ইন কৰাটো অফ কৰিছে। নতুন বুকমাৰ্ক, পাছৱৰ্ড আৰু অধিক কেৱল এই ডিভাইচত ছেভ কৰা হ'ব।</translation> <translation id="3213807041830307252">আপোনাৰ কেমেৰা আৰু ফট’ গেলাৰী ব্যৱহাৰ কৰি ক্ৰয় কৰক, অনুবাদ কৰক আৰু আপুনি দেখা পোৱা বস্তু চিনাক্ত কৰক।</translation> <translation id="3214379938835224220">আপোনাৰ iPad ৰিছেট কৰাৰ অংশ হিচাপে আপোনাক ছাইন আউট কৰা হৈছে। ছাইন ইন কৰিবলৈ তলত অব্যাহত ৰাখকত টিপক।</translation> +<translation id="3218296450292600703">আপোনাৰ পৰিচালিত একাউণ্টৰ জৰিয়তে ছাইন ইন কৰাটোৱে আপোনাৰ প্ৰতিষ্ঠানৰ সৈতে জড়িত ব্ৰাউজিং (টেব, ইতিহাস আৰু পাছৱৰ্ডকে ধৰি) আন ব্ৰাউজিঙৰ পৰা পৃথক কৰি ৰখাত সহায় কৰে</translation> <translation id="3224075676564434205">টেবসমূহ এই ডিভাইচটোত খোলা থাকিব কিন্তু গোটটো <ph name="USER_EMAIL" />ত ছাইন ইন কৰা আটাইবোৰ ডিভাইচৰ পৰা মচি পেলোৱা হ’ব।</translation> <translation id="3224641773458703735">পাছৱৰ্ড ৰপ্তানি কৰিবলৈ, আপুনি প্ৰথমে নিজৰ ডিভাইচত এটা পাছক’ড ছেট কৰিব লাগিব৷</translation> <translation id="3227137524299004712">মাইক্ৰ’ফ’ন</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">ডাউনল’ড কৰি থকা হৈছে… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">মেনু → ছেটিং → পৰিশোধ পদ্ধতি</translation> <translation id="7108338896283013870">লুকুৱাওক</translation> +<translation id="7115051913071512405">এইটো ব্যৱহাৰ কৰি চাওক</translation> <translation id="7128693485119315539">আপোনাৰ প্ৰতিষ্ঠানে আপোনাৰ পৰিচালিত একাউণ্টৰ সৈতে জড়িত ব্ৰাউজিঙৰ ডেটা চাব আৰু পৰিচালনা কৰিব লগা হ’ব পাৰে, যেনে, আপোনাৰ ব্ৰাউজিঙৰ ইতিহাস আৰু পাছৱর্ডসমূহ।</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">কেমেৰা উপলব্ধ নহয়</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 85796e0d..c9874a68 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Təşkilat girişi deaktiv edib. Yeni əlfəcin, parol və s. yalnız bu cihazda yadda saxlanacaq.</translation> <translation id="3213807041830307252">Kamera və fotoqalereyadan istifadə edərək gördüklərinizi alın, tərcümə edin və müəyyənləşdirin.</translation> <translation id="3214379938835224220">iPad sıfırlamasının bir hissəsi olaraq hesabınızdan çıxmısınız. Daxil olmaq üçün aşağıda "davam edin" seçiminə toxunun.</translation> +<translation id="3218296450292600703">İdarə olunan hesabınız ilə daxil olmaq təşkilatınızla əlaqəli axtarışı (tablar, tarixçə və parollar daxil olmaqla) digər axtarışdan ayırmağa kömək edir.</translation> <translation id="3224075676564434205">Tablar bu cihazda açıq qalacaq, lakin qrup <ph name="USER_EMAIL" /> hesabına daxil olmuş bütün cihazlardan silinəcək.</translation> <translation id="3224641773458703735">Parolları eksport etmək üçün əvvəlcə cihazınızda parol kod ayarlamalısınız.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Endirilir… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menyu → Ayarlar → Ödəniş metodları</translation> <translation id="7108338896283013870">Gizlədin</translation> +<translation id="7115051913071512405">Bunu sınayın</translation> <translation id="7128693485119315539">Təşkilatınız idarə olunan hesab ilə əlaqəli brauzer datasına (məsələn, brauzer tarixçəsi və parollar) baxmalı və onu idarə etməli ola bilər.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera əlçatan deyil</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index 29a233c..713d2af 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Ваша арганізацыя адключыла магчымасць уваходу. Новыя закладкі, паролі і іншыя даныя будуць захоўвацца толькі на гэтай прыладзе.</translation> <translation id="3213807041830307252">Знаходзьце тавары, перакладайце тэксты і распазнавайце навакольныя аб’екты з дапамогай камеры і фотагалерэі.</translation> <translation id="3214379938835224220">У выніку скіду налад iPad адбыўся выхад з уліковага запісу. Каб увайсці ў яго, націсніце Continue ("Працягнуць") ніжэй.</translation> +<translation id="3218296450292600703">Уваход праз уліковы запіс пад кіраваннем дазваляе аддзяляць даныя пра работу ў браўзеры, звязаныя з арганізацыяй (у прыватнасці, укладкі, запісы гісторыі і паролі), ад падобных даных, звязаных з іншым уліковым запісам</translation> <translation id="3224075676564434205">Укладкі застануцца адкрытымі на гэтай прыладзе, але група будзе выдалена з усіх прылад, на якіх выкананы ўваход у <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Каб экспартаваць паролі, на прыладзе трэба спачатку задаць пароль.</translation> <translation id="3227137524299004712">Мікрафон</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Ідзе спампоўванне… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Меню → Налады → Спосабы аплаты</translation> <translation id="7108338896283013870">Схаваць</translation> +<translation id="7115051913071512405">Паспрабаваць</translation> <translation id="7128693485119315539">Вашай арганізацыі можа спатрэбіцца праглядаць даныя пра работу ў браўзеры (напрыклад, гісторыю прагляду сайтаў і паролі), прывязаныя да вашага ўліковага запісу пад кіраваннем, і кіраваць імі.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Камера недаступная</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index 6b346d9..b0bf52cfa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Изтегля се… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Меню → Настройки → Начини на плащане</translation> <translation id="7108338896283013870">Скриване</translation> +<translation id="7115051913071512405">Изпробване</translation> <translation id="7128693485119315539">Може да е необходимо организацията ви да вижда и управлява данните за сърфиране, свързани с управлявания ви профил, като например историята на сърфиране и паролите ви.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Няма достъп до камерата</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index b4d53fa7f..f1d6f11 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658"><ph name="FILE_SIZE" /> ডাউনলোড করা হচ্ছে…</translation> <translation id="7104701424653979232">মেনু → সেটিংস → পেমেন্ট পদ্ধতি</translation> <translation id="7108338896283013870">লুকান</translation> +<translation id="7115051913071512405">এটি চেষ্টা করে দেখুন</translation> <translation id="7128693485119315539">আপনার ম্যানেজ করা অ্যাকাউন্টের সাথে যুক্ত থাকা ব্রাউজ করা ডেটা, আপনার প্রতিষ্ঠান দেখতে চাইতে পারে, যেমন আপনার ব্রাউজিং ইতিহাস ও পাসওয়ার্ড।</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">ক্যামেরা অনুপলব্ধ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index 818c6df..0992145e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -533,7 +533,7 @@ <translation id="3208260410153224535">Vaša organizacija je isključila prijavu. Nove oznake, lozinke i još mnogo toga će se pohranjivati samo na ovom uređaju.</translation> <translation id="3213807041830307252">Kupujte, prevodite sadržaj i prepoznajte šta vidite pomoću kamere i galerije fotografija.</translation> <translation id="3214379938835224220">Bili ste odjavljeni tokom vraćanja iPada na zadano. Dodirnite Nastavi u nastavku da se prijavite.</translation> -<translation id="3218296450292600703">Prijavite se na upravljani račun kako biste pregledavanje povezano s vašom organizacijom (uključujući kartice, povijest i zaporke) lakše odvojili od ostatka pregledavanja</translation> +<translation id="3218296450292600703">Prijava putem upravljanog računa vam pomaže da odvojite pregledanje povezano s vašom organizacijom (uključujući kartice, historiju i lozinke) od drugog pregledanja</translation> <translation id="3224075676564434205">Kartice će ostati otvorene na uređaju, ali će se grupa izbrisati sa svih uređaja na kojima ste prijavljeni na <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Da izvezete lozinke, najprije morate postaviti šifru na uređaju.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">Preuzimanje… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Meni → Postavke → Načini plaćanja</translation> <translation id="7108338896283013870">Sakrij</translation> +<translation id="7115051913071512405">Isprobajte</translation> <translation id="7128693485119315539">Vaša organizacija možda mora vidjeti podatke pregledanja povezane s vašim upravljanim računom kao što su historija pregledanja i lozinke te upravljati njima.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera je nedostupna</translation> @@ -1903,6 +1904,7 @@ <translation id="8786100550345425552">Uredite odobrenja</translation> <translation id="878871978861915380">Sakrij "Praćenje cijena"</translation> <translation id="8792626944327216835">mikrofon</translation> +<translation id="8796634520835503150">Dostupan je čitački način</translation> <translation id="8803526663383843427">Kada je uključeno</translation> <translation id="8803639129939845298">Sigurno</translation> <translation id="8806823403540278281">Vaša organizacija zahtijeva da pregledate privatno. Kartice se ne pohranjuju u anonimnom načinu rada.
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index bdae4d8..21b261a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">La teva organització ha desactivat l'inici de sessió. Les adreces d'interès noves, les contrasenyes i altres dades només es desaran en aquest dispositiu.</translation> <translation id="3213807041830307252">Compra, tradueix i identifica el que veus utilitzant la càmera i la galeria de fotos.</translation> <translation id="3214379938835224220">Se t'ha tancat la sessió com a part del restabliment de l'iPad. Per iniciar-la, toca Continua, més avall.</translation> +<translation id="3218296450292600703">Si inicies la sessió amb el compte gestionat, podràs mantenir la navegació relacionada amb la teva organització (incloses les pestanyes, l'historial i les contrasenyes) separada de la teva altra activitat de navegació</translation> <translation id="3224075676564434205">Les pestanyes continuaran obertes en aquest dispositiu, però el grup se suprimirà de tots els dispositius en què s'hagi iniciat la sessió amb <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Per exportar les contrasenyes, primer has d'establir una contrasenya al dispositiu.</translation> <translation id="3227137524299004712">Micròfon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">S'està baixant… (<ph name="FILE_SIZE" />)</translation> <translation id="7104701424653979232">Menú → Configuració → Formes de pagament</translation> <translation id="7108338896283013870">Amaga</translation> +<translation id="7115051913071512405">Prova-ho</translation> <translation id="7128693485119315539">És possible que la teva organització necessiti veure i gestionar les dades de navegació associades al teu compte gestionat, com ara l'historial de navegació i les contrasenyes.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">La càmera no està disponible</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index b105b79..28ad1351 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Stahování… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Nabídka → Nastavení → Platební metody</translation> <translation id="7108338896283013870">Skrýt</translation> +<translation id="7115051913071512405">Vyzkoušejte to</translation> <translation id="7128693485119315539">Vaše organizace může potřebovat vidět a spravovat údaje o prohlížení spojené s vaším spravovaným účtem, jako jsou historie prohlížení a hesla.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera je nedostupná</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index 013a522..2937f28 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Mae eich sefydliad wedi diffodd mewngofnodi. Dim ond i'r ddyfais hon y bydd nodau tudalen, cyfrineiriau a rhagor sy'n newydd yn cael eu cadw.</translation> <translation id="3213807041830307252">Siopa, cyfieithu, a nodi'r hyn a welwch gan ddefnyddio'ch camera a'ch oriel luniau.</translation> <translation id="3214379938835224220">Cawsoch eich allgofnodi fel rhan o'ch ailosodiad iPad. Tapiwch parhau isod i fewngofnodi.</translation> +<translation id="3218296450292600703">Mae mewngofnodi gyda'ch cyfrif a reolir yn eich helpu i gadw pori sy'n gysylltiedig â'ch sefydliad (gan gynnwys tabiau, hanes a chyfrineiriau) ar wahân i'ch pori arall</translation> <translation id="3224075676564434205">Bydd y tabiau'n aros ar agor ar y ddyfais hon ond bydd y grŵp yn cael ei ddileu o bob dyfais sydd wedi'i mewngofnodi i <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">I allforio cyfrineiriau, rhaid i chi osod cod pas ar eich dyfais yn gyntaf.</translation> <translation id="3227137524299004712">Meicroffon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Wrthi'n lawrlwytho… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Dewislen → Gosodiadau → Dulliau talu</translation> <translation id="7108338896283013870">Cuddio</translation> +<translation id="7115051913071512405">Rhowch gynnig arni</translation> <translation id="7128693485119315539">Mae'n bosib y bydd angen i'ch sefydliad weld a rheoli data pori sy'n gysylltiedig â'ch cyfrif a reolir, megis eich hanes pori a'ch cyfrineiriau.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Nid yw'r camera ar gael</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index d5fa415..366fbf0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Din organisation har deaktiveret login. Nye bogmærker, adgangskoder m.m. gemmes kun på denne enhed.</translation> <translation id="3213807041830307252">Køb, oversæt og identificer det, du ser, med dit kamera og billedgalleri.</translation> <translation id="3214379938835224220">Du blev logget ud som en del af nulstillingen af din iPad. Tryk på Fortsæt nedenfor for at logge ind.</translation> +<translation id="3218296450292600703">Når du logger ind med din administrerede konto, kan du adskille browserdata, der er relateret til din organisation (herunder faner, historik og adgangskoder), fra dine øvrige browserdata</translation> <translation id="3224075676564434205">Fanerne forbliver åbne på denne enhed, men gruppen slettes fra alle enheder, der er logget ind på <ph name="USER_EMAIL" /></translation> <translation id="3224641773458703735">Angiv en adgangskode på din enhed, før du kan eksportere adgangskoder.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Downloader… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Indstillinger → Betalingsmetoder</translation> <translation id="7108338896283013870">Skjul</translation> +<translation id="7115051913071512405">Prøv det</translation> <translation id="7128693485119315539">Din organisation skal muligvis se og administrere browserdata, der er knyttet til din administrerede konto, f.eks. din browserhistorik og dine adgangskoder.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kameraet er ikke tilgængeligt</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 36ed0f09..bdac895e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Deine Organisation hat die Anmeldung deaktiviert. Neue Lesezeichen, Passwörter und weitere Informationen werden nur auf diesem Gerät gespeichert.</translation> <translation id="3213807041830307252">Kaufe ein, übersetze und finde mit deiner Kamera und Fotogalerie heraus, was du gerade siehst.</translation> <translation id="3214379938835224220">Du wurdest beim Zurücksetzen deines iPads abgemeldet. Tippe unten auf „Weiter“, um dich anzumelden.</translation> +<translation id="3218296450292600703">Wenn du dich mit deinem verwalteten Konto anmeldest, kannst du die mit deiner Organisation verbundenen Browserdaten wie Tabs, Verlauf und Passwörter besser von deinen anderen Browserdaten trennen</translation> <translation id="3224075676564434205">Die Tabs bleiben auf diesem Gerät geöffnet, aber die Gruppe wird von allen Geräten gelöscht, die im Konto <ph name="USER_EMAIL" /> angemeldet sind.</translation> <translation id="3224641773458703735">Um Passwörter zu exportieren, musst du zuerst einen Passcode auf deinem Gerät einrichten.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Wird heruntergeladen… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">„Menü“ → Einstellungen → „Zahlungsmethoden“</translation> <translation id="7108338896283013870">Ausblenden</translation> +<translation id="7115051913071512405">Testen</translation> <translation id="7128693485119315539">Deine Organisation muss möglicherweise Browserdaten, die mit deinem verwalteten Konto verknüpft sind, sehen und verwalten – beispielsweise deinen Browserverlauf und deine Passwörter.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera ist nicht verfügbar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index cc6400f..e76e124 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -1486,6 +1486,7 @@ <translation id="7102005569666697658">Λήψη… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Μενού → Ρυθμίσεις → Τρόποι πληρωμής</translation> <translation id="7108338896283013870">Απόκρυψη</translation> +<translation id="7115051913071512405">Δοκιμάστε το</translation> <translation id="7128693485119315539">Ο οργανισμός σας μπορεί να χρειάζεται να βλέπει και να διαχειρίζεται δεδομένα περιήγησης που συνδέονται με τον διαχειριζόμενο λογαριασμό σας, όπως το ιστορικό περιήγησης και τους κωδικούς πρόσβασης.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Η κάμερα δεν είναι διαθέσιμη</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index a68449531..3ef4de6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">Downloading… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Settings → Payment methods</translation> <translation id="7108338896283013870">Hide</translation> +<translation id="7115051913071512405">Try it out</translation> <translation id="7128693485119315539">Your organisation may need to see and manage browsing data tied to your managed account, such as your browsing history and passwords.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Camera is unavailable</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index 0dd750a..134e319c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Tu organización desactivó el acceso. Los favoritos, las contraseñas y otros elementos nuevos se guardarán solo en este dispositivo.</translation> <translation id="3213807041830307252">Compra, identifica y traduce lo que ves con la cámara y la galería de fotos.</translation> <translation id="3214379938835224220">Saliste de tu cuenta como parte del restablecimiento de tu iPad. Presiona Continuar para acceder.</translation> +<translation id="3218296450292600703">Acceder con tu cuenta administrada te ayuda a mantener la navegación relacionada con tu organización (incluidas las pestañas, el historial y las contraseñas) separada de la que realizas en otras plataformas</translation> <translation id="3224075676564434205">Las pestañas permanecerán abiertas en este dispositivo, pero se borrará el grupo de todos los dispositivos en los que accediste a <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Para exportar las contraseñas, primero debes establecer una en tu dispositivo.</translation> <translation id="3227137524299004712">Micrófono</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Descargando… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menú → Configuración → Formas de pago</translation> <translation id="7108338896283013870">Ocultar</translation> +<translation id="7115051913071512405">Probar</translation> <translation id="7128693485119315539">Es posible que tu organización necesite ver y administrar los datos de navegación vinculados a tu cuenta administrada, como el historial de navegación y las contraseñas.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">La cámara no está disponible</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 5b1872c..d8ee97a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Tu organización ha desactivado el inicio de sesión. Los marcadores, las contraseñas y otros elementos nuevos solo se guardarán en este dispositivo.</translation> <translation id="3213807041830307252">Compra, traduce e identifica lo que ves con tu cámara y tu galería de fotos.</translation> <translation id="3214379938835224220">Se ha cerrado tu sesión al restablecer tu iPad. Toca Continuar abajo para iniciar sesión.</translation> +<translation id="3218296450292600703">Iniciar sesión con tu cuenta gestionada te ayuda a mantener la navegación relacionada con tu organización (como las pestañas, el historial y las contraseñas) separada del resto de tu navegación</translation> <translation id="3224075676564434205">Las pestañas permanecerán abiertas en este dispositivo, pero el grupo se eliminará de todos los dispositivos en los que se haya iniciado sesión con <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Debes establecer primero un bloqueo de pantalla en tu dispositivo para poder exportar las contraseñas.</translation> <translation id="3227137524299004712">Micrófono</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Descargando… (<ph name="FILE_SIZE" />)</translation> <translation id="7104701424653979232">Menú → Configuración → Métodos de pago</translation> <translation id="7108338896283013870">Ocultar</translation> +<translation id="7115051913071512405">Pruébalo</translation> <translation id="7128693485119315539">Es posible que tu organización necesite ver y gestionar los datos de navegación asociados a tu cuenta gestionada, como el historial de navegación y las contraseñas.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">La cámara no está disponible</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 113fac38..d7be27c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Teie organisatsioon on sisselogimise välja lülitanud. Uued järjehoidjad, paroolid ja muu sisu salvestatakse ainult sellesse seadmesse.</translation> <translation id="3213807041830307252">Ostke, tõlkige ja tuvastage, mida näete, kasutades oma kaamerat ja fotogaleriid.</translation> <translation id="3214379938835224220">Teid logiti iPadi lähtestamise käigus välja. Sisselogimiseks puudutage allpool käsku Jätka.</translation> +<translation id="3218296450292600703">Hallatud kontoga sisselogimine aitab teie organisatsiooniga seotud sirvimistegevust (sh vahelehti, ajalugu ja paroole) muust sirvimistegevusest eraldada</translation> <translation id="3224075676564434205">Vahelehed jäävad selles seadmes avatuks, aga grupp kustutatakse kõikidest seadmetest, mis on kontole <ph name="USER_EMAIL" /> sisse logitud.</translation> <translation id="3224641773458703735">Paroolide eksportimiseks peate oma seadmes esmalt pääsukoodi seadistama.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Allalaadimine … <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menüü → Seaded → Makseviisid</translation> <translation id="7108338896283013870">Peida</translation> +<translation id="7115051913071512405">Proovi järele</translation> <translation id="7128693485119315539">Teie organisatsioonil võib olla vaja näha ja hallata teie hallatud kontoga seotud sirvimisandmeid (nt sirvimisajalugu ja paroole).</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kaamera pole saadaval</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index e0ce901..6ba4427 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Deskargatzen… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menua → Ezarpenak → Ordainketa-metodoak</translation> <translation id="7108338896283013870">Ezkutatu</translation> +<translation id="7115051913071512405">Proba ezazu</translation> <translation id="7128693485119315539">Baliteke zure erakundeak kontu kudeatuarekin lotutako arakatze-datuak ikusi eta kudeatu behar izatea; adibidez, arakatze-historia eta pasahitzak.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera ez dago erabilgarri</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 92b37b06..3f5b632 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">درحال بارگیری… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">منو ← تنظیمات ← روشهای پرداخت</translation> <translation id="7108338896283013870">عدم نمایش</translation> +<translation id="7115051913071512405">امتحان کنید</translation> <translation id="7128693485119315539">شاید لازم باشد سازمانتان دادههای مرور مربوط به حساب مدیریتشده شما، مثل سابقه مرور و گذرواژههایتان را ببیند و مدیریت کند.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">دوربین غیرقابل دسترسی است</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 16dff4d..8c039e9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Organisaatiosi on laittanut sisäänkirjautumisen pois päältä. Uudet kirjanmerkit, salasanat ja muut tiedot tallennetaan vain tälle laitteelle.</translation> <translation id="3213807041830307252">Tee ostoksia, käännä ja tunnista näkemiäsi asioita kameran ja kuvagallerian avulla.</translation> <translation id="3214379938835224220">Sinut kirjattiin ulos, kun iPad nollattiin. Kirjaudu sisään valitsemalla alta "Jatka".</translation> +<translation id="3218296450292600703">Kun kirjaudut sisään hallinnoidulla tilillä, voit erottaa organisaatioosi liittyvän selaamisen (esim. välilehdet, historian ja salasanat) muusta selaamisesta</translation> <translation id="3224075676564434205">Välilehdet pysyvät auki tällä laitteella, mutta ryhmä poistetaan kaikilta laitteilta, jotka ovat kirjautuneina tilille <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Jos haluat viedä salasanoja, sinun on ensin määritettävä laitteellesi tunnuskoodi.</translation> <translation id="3227137524299004712">Mikrofoni</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Ladataan… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Valikko → Asetukset → Maksutavat</translation> <translation id="7108338896283013870">Piilota</translation> +<translation id="7115051913071512405">Kokeile</translation> <translation id="7128693485119315539">Voi olla, että organisaatiosi täytyy nähdä ja hallinnoida hallinnoituun tiliisi liittyvää selausdataa, kuten selaushistoriaa ja salasanoja.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera ei ole käytettävissä</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 821fbef..8ec8ee99 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Dina-download… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Mga Setting → Mga paraan ng pagbabayad</translation> <translation id="7108338896283013870">Itago</translation> +<translation id="7115051913071512405">Subukan ito</translation> <translation id="7128693485119315539">Posibleng kailanganing tingnan at pamahalaan ng organisasyon mo ang data mula sa pag-browse na nauugnay sa iyong pinamamahalaang account, tulad ng history ng pag-browse at mga password mo.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Hindi available ang camera</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index 9cde8628..f68ca539 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Téléchargement en cours… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Paramètres → Modes de paiement</translation> <translation id="7108338896283013870">Masquer</translation> +<translation id="7115051913071512405">Essayez-le</translation> <translation id="7128693485119315539">Votre organisation devra peut-être consulter et gérer les données de navigation associées à votre compte géré, comme votre historique de navigation et vos mots de passe.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">La caméra est indisponible</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 2f5631b..e6e0668 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Téléchargement… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Réglages → Modes de paiement</translation> <translation id="7108338896283013870">Masquer</translation> +<translation id="7115051913071512405">Essayer</translation> <translation id="7128693485119315539">Votre organisation peut avoir besoin de voir et gérer les données de navigation liées à votre compte géré, comme votre historique de navigation et vos mots de passe.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Appareil photo non disponible</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index a897c40..d6cc3d91 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Descargando… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menú → Configuración → Métodos de pago</translation> <translation id="7108338896283013870">Ocultar</translation> +<translation id="7115051913071512405">Próbao</translation> <translation id="7128693485119315539">É posible que a túa organización necesite consultar e administrar os datos de navegación asociados á túa conta xestionada, como o teu historial de navegación e os contrasinais.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">A cámara non está dispoñible</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index a784a39..a0d11e6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">તમારી સંસ્થાએ સાઇન ઇન કરવાનું બંધ કર્યું છે. નવા બુકમાર્ક, પાસવર્ડ વગેરે માત્ર આ ડિવાઇસમાં સાચવવામાં આવશે.</translation> <translation id="3213807041830307252">તમારા કૅમેરા અને ફોટો ગૅલરીનો ઉપયોગ કરીને તમે જે જુઓ છો તે ખરીદો, તેનો અનુવાદ કરો અને તેને ઓળખો.</translation> <translation id="3214379938835224220">તમારા iPadની રીસેટ પ્રક્રિયાને કારણે તમને સાઇન આઉટ કરવામાં આવ્યા હતા. સાઇન ઇન કરવા માટે નીચે ચાલુ રાખો બટન પર ટૅપ કરો.</translation> +<translation id="3218296450292600703">તમારા મેનેજ કરેલા એકાઉન્ટ વડે સાઇન ઇન કરવાથી તમને તમારી સંસ્થા સાથે સંબંધિત બ્રાઉઝિંગ (ટૅબ, ઇતિહાસ અને પાસવર્ડ સહિત)ને તમારા અન્ય બ્રાઉઝિંગથી અલગ રાખવામાં મદદ મળે છે</translation> <translation id="3224075676564434205">આ ડિવાઇસ પર ટૅબ ખુલ્લા રહેશે, પરંતુ <ph name="USER_EMAIL" />માં સાઇન ઇન કરેલા બધા ડિવાઇસમાંથી આ ગ્રૂપ ડિલીટ કરવામાં આવશે.</translation> <translation id="3224641773458703735">પાસવર્ડના નિકાસ માટે, તમારે સૌથી પહેલા તમારા ઉપકરણ પર એક પાસકોડ સેટ કરવો આવશ્યક છે.</translation> <translation id="3227137524299004712">માઇક્રોફોન</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">ડાઉનલોડ કરી રહ્યાં છીએ… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">મેનૂ → સેટિંગ → ચુકવણી પદ્ધતિઓ</translation> <translation id="7108338896283013870">છુપાવો</translation> +<translation id="7115051913071512405">તેને અજમાવી જુઓ</translation> <translation id="7128693485119315539">તમારી સંસ્થાને તમારા મેનેજ કરેલા એકાઉન્ટ સાથે જોડાયેલો તમારો બ્રાઉઝિંગ ઇતિહાસ અને પાસવર્ડ જેવો બ્રાઉઝિંગ ડેટા જોવાની અને તેને મેનેજ કરવાની કદાચ જરૂર પડી શકે છે.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">કૅમેરા અનુપલબ્ધ છે</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index 9c79f2d..35acc68 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">आपके संगठन ने साइन इन करने की सुविधा बंद कर दी है. नए बुकमार्क, पासवर्ड वगैरह सिर्फ़ इस डिवाइस में सेव किए जाएंगे.</translation> <translation id="3213807041830307252">अपने कैमरे और फ़ोटो गैलरी का इस्तेमाल करें और जो चीज़ें दिख रही हैं उन्हें खरीदें, उनका अनुवाद करें या उनकी पहचान करें.</translation> <translation id="3214379938835224220">iPad रीसेट करने की वजह से, आपको साइन आउट कर दिया गया था. साइन इन करने के लिए, नीचे 'जारी रखें' पर टैप करें.</translation> +<translation id="3218296450292600703">मैनेज किए जा रहे खाते से साइन इन करने पर, आपको अपने संगठन से जुड़े ब्राउज़िंग डेटा को अपने अन्य ब्राउज़िंग डेटा से अलग करने में मदद मिलती है. इस डेटा में टैब, इतिहास, और पासवर्ड शामिल हैं</translation> <translation id="3224075676564434205">ये टैब इस डिवाइस में खुले रहेंगे, लेकिन <ph name="USER_EMAIL" /> से साइन इन किए गए सभी डिवाइसों से ग्रुप मिटा दिया जाएगा.</translation> <translation id="3224641773458703735">पासवर्ड भेजने के लिए, आपको सबसे पहले अपने डिवाइस पर एक पासवर्ड सेट करना होगा.</translation> <translation id="3227137524299004712">माइक्रोफ़ोन</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">डाउनलोड हो रही है… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">मेन्यू → सेटिंग → पेमेंट का तरीका</translation> <translation id="7108338896283013870">छुपाएं</translation> +<translation id="7115051913071512405">इसे आज़माएं</translation> <translation id="7128693485119315539">आपके संगठन को, मैनेज किए जा रहे आपके खाते का ब्राउज़िंग डेटा देखने और मैनेज करने की ज़रूरत पड़ सकती है. जैसे, आपका ब्राउज़िंग इतिहास और पासवर्ड.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">कैमरा अनुपलब्ध है</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 034b254e..2ab62f5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">Preuzimanje… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Izbornik → Postavke → Načini plaćanja</translation> <translation id="7108338896283013870">Sakrij preglednik</translation> +<translation id="7115051913071512405">Isprobajte</translation> <translation id="7128693485119315539">Vaša organizacija možda treba vidjeti podatke o pregledavanju povezane s vašim upravljanim računom, kao što su povijest pregledavanja i zaporke, te upravljati njima.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Fotoaparat nije dostupan</translation> @@ -1903,6 +1904,7 @@ <translation id="8786100550345425552">Uredite dopuštenja</translation> <translation id="878871978861915380">Sakrij opciju Praćenje cijena</translation> <translation id="8792626944327216835">mikrofon</translation> +<translation id="8796634520835503150">Dostupan je čitački način</translation> <translation id="8803526663383843427">Kad je značajka uključena</translation> <translation id="8803639129939845298">Sigurno</translation> <translation id="8806823403540278281">Vaša organizacija zahtijeva da pregledavate privatno. Kartice se ne spremaju u anonimnom načinu.
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index 93445a7..1eb9b9d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Letöltés… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menü → Beállítások → Fizetési módok</translation> <translation id="7108338896283013870">Elrejtés</translation> +<translation id="7115051913071512405">Próbálja ki</translation> <translation id="7128693485119315539">Előfordulhat, hogy a szervezetnek látnia és kezelnie kell a felügyelt fiókjához kapcsolódó böngészési adatokat (például a böngészési előzményeket és a jelszavakat).</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">A kamera nem áll rendelkezésre</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index f6f4593..489c604 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Ներբեռնում… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Ընտրացանկ → Կարգավորումներ → Վճարման եղանակներ</translation> <translation id="7108338896283013870">Թաքցնել</translation> +<translation id="7115051913071512405">Փորձել</translation> <translation id="7128693485119315539">Ձեր կազմակերպությանը կարող է անհրաժեշտ լինել տեսնել և կառավարել կայքերի այցելությունների մասին տվյալները, որոնք կապված են ձեր կառավարվող հաշվի հետ, օրինակ՝ ձեր այցելությունների պատմությունը և գաղտնաբառերը։</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Ֆոտոխցիկն անհասանելի է</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 522ac0e..b275fd31 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Organisasi Anda menonaktifkan login. Bookmark, sandi, dan data baru lainnya hanya akan disimpan ke perangkat ini.</translation> <translation id="3213807041830307252">Belanja, terjemahkan, dan identifikasi hal yang Anda lihat menggunakan kamera dan galeri foto.</translation> <translation id="3214379938835224220">Anda telah logout sebagai bagian dari proses reset iPad. Ketuk lanjutkan di bawah untuk login.</translation> +<translation id="3218296450292600703">Login dengan akun terkelola Anda akan membantu penjelajahan yang terkait dengan organisasi Anda (termasuk tab, histori, dan sandi) terpisah dari penjelajahan lainnya</translation> <translation id="3224075676564434205">Tab akan tetap terbuka di perangkat ini, tetapi grup akan dihapus dari semua perangkat yang digunakan untuk login ke <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Untuk mengekspor sandi, Anda harus menyetel kode sandi di perangkat terlebih dahulu.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Mendownload… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Setelan → Metode pembayaran</translation> <translation id="7108338896283013870">Sembunyikan</translation> +<translation id="7115051913071512405">Cobalah</translation> <translation id="7128693485119315539">Organisasi Anda mungkin perlu melihat dan mengelola data penjelajahan yang terkait dengan akun terkelola, seperti histori penjelajahan dan sandi.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera tidak tersedia</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index cd849786..eee85a0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Sækir… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Valmynd → Stillingar → Greiðslumátar</translation> <translation id="7108338896283013870">Fela</translation> +<translation id="7115051913071512405">Prófa</translation> <translation id="7128693485119315539">Fyrirtækið þitt þarf hugsanlega að skoða og stjórna vefskoðunargögnum sem tengjast stýrða reikningnum þínum, t.d. vafraferli og aðgangsorðum.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Myndavélin er ekki tiltæk</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 436fbc1..090d9f4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">Download in corso… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Impostazioni → Metodi di pagamento</translation> <translation id="7108338896283013870">Nascondi</translation> +<translation id="7115051913071512405">Provalo</translation> <translation id="7128693485119315539">La tua organizzazione potrebbe aver bisogno di vedere e gestire i dati di navigazione legati al tuo account gestito, come la cronologia di navigazione e le password.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">La videocamera non è disponibile</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index c58faa1..e79a83a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">ההורדה מתבצעת… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">תפריט ← הגדרות ← אמצעי תשלום</translation> <translation id="7108338896283013870">הסתרה</translation> +<translation id="7115051913071512405">נסה את זה</translation> <translation id="7128693485119315539">יכול להיות שהאדמין בארגון שלך יצטרך לראות ולנהל את נתוני הגלישה שקשורים לחשבון המנוהל שלך, כמו היסטוריית הגלישה והסיסמאות.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">המצלמה לא זמינה</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 505fad7..7db64cf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">ログインは組織によってオフにされています。新しいブックマークやパスワードなどは、このデバイスにのみ保存されます。</translation> <translation id="3213807041830307252">カメラとフォト ギャラリーを使って、見たものを購入、翻訳、特定できます。</translation> <translation id="3214379938835224220">iPad をリセットする途中でログアウトしました。下の [続行] をタップしてログインしてください。</translation> +<translation id="3218296450292600703">管理対象アカウントでログインすると、組織に関連するブラウジング(タブ、履歴、パスワードなど)を他のブラウジングと分けて管理できます</translation> <translation id="3224075676564434205">タブはこのデバイスで引き続き表示されますが、グループは <ph name="USER_EMAIL" /> にログインしているすべてのデバイスから削除されます。</translation> <translation id="3224641773458703735">パスワードをエクスポートするには、まずデバイスでパスコードを設定する必要があります。</translation> <translation id="3227137524299004712">マイク</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">ダウンロードしています… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">[メニュー] → [設定] → [お支払い方法]</translation> <translation id="7108338896283013870">非表示</translation> +<translation id="7115051913071512405">試してみる</translation> <translation id="7128693485119315539">組織で必要に応じて管理対象アカウントに関連付けられた閲覧データ(閲覧履歴やパスワードなど)を確認、管理する場合があります。</translation> <translation id="713215255510512027"><ph name="FILENAME" />(<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">カメラを使用できません</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 40eb10e..9b0d8ea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">თქვენმა ორგანიზაციამ გამორთო სისტემაში შესვლა. ახალი სანიშნეები, პაროლები და სხვა კონტენტი შეინახება მხოლოდ ამ მოწყობილობაზე.</translation> <translation id="3213807041830307252">იყიდეთ, თარგმნეთ და ამოიცანით ის, რასაც ხედავთ, თქვენი კამერისა და ფოტოგალერეის მეშვეობით.</translation> <translation id="3214379938835224220">თქვენი iPad-ის გადაყენების გამო, სისტემიდან გახვედით. სისტემაში შესასვლელად შეეხეთ „გაგრძელებას“ ქვემოთ.</translation> +<translation id="3218296450292600703">თქვენი მართული ანგარიშით შესვლა საშუალებას მოგცემთ, გამიჯნოთ დათვალიერება თქვენი ორგანიზაციისთვის, კერძოდ, ჩანართები, ისტორია და პაროლები.</translation> <translation id="3224075676564434205">ჩანართები დარჩება გახსნილი ამ მოწყობილობაზე, მაგრამ ჯგუფი წაიშლება ყველა მოწყობილობიდან, რომელიც შესულია ანგარიშში: <ph name="USER_EMAIL" /></translation> <translation id="3224641773458703735">პაროლების ექსპორტირებისთვის, პირველ რიგში, საჭიროა თქვენს მოწყობილობაზე საიდუმლო კოდის დაყენება.</translation> <translation id="3227137524299004712">მიკროფონი</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">მიმდინარეობს ჩამოტვირთვა… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">მენიუ → პარამეტრები → გადახდის მეთოდები</translation> <translation id="7108338896283013870">დამალვა</translation> +<translation id="7115051913071512405">შეამოწმეთ ეს</translation> <translation id="7128693485119315539">თქვენს ორგანიზაციას შეიძლება დასჭირდეს თქვენს მართულ ანგარიშთან მიბმული დათვალიერების მონაცემების (დათვალიერების ისტორია და პაროლები) ნახვა და მართვა.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">კამერა მიუწვდომელია</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index 2bd8ade..74e975fa 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Ұйымыңыз аккаунтқа кіруді өшірді. Жаңа бетбелгілер, құпия сөздер және т.б. тек осы құрылғыда сақталады.</translation> <translation id="3213807041830307252">Камера мен фотосуреттер галереясындағы нәрселерді сатып алуға, аударуға және анықтауға болады.</translation> <translation id="3214379938835224220">iPad бастапқы күйіне келтірілген кезде, сіз аккаунттан шығарылдыңыз. Аккаунтқа кіру үшін төмендегі "Жалғастыру" түймесін түртіңіз.</translation> +<translation id="3218296450292600703">Басқарылатын аккаунтпен кірсеңіз, ұйымға қатысты қойындылар, тарих пен құпия сөздер сияқты шолу ақпаратын басқа шолу ақпаратынан бөлек сақтай аласыз.</translation> <translation id="3224075676564434205">Қойындылар осы құрылғыда ашық қалады, бірақ топ <ph name="USER_EMAIL" /> аккаунтына кірген барлық құрылғыдан жойылады.</translation> <translation id="3224641773458703735">Құпия сөздерді экспорттау үшін алдымен құрылғыға тексеру кодын орнату керек.</translation> <translation id="3227137524299004712">Микрофон</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Жүктеп алынуда…<ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Мәзір → Параметрлер → Төлеу әдістері</translation> <translation id="7108338896283013870">Жасыру</translation> +<translation id="7115051913071512405">Оны пайдаланып көру</translation> <translation id="7128693485119315539">Ұйымыңызға басқарылатын аккаунтпен байланысты браузерді қолдану тарихы және құпия сөздер сияқты браузерді пайдалану деректерін көру және басқару қажет болуы мүмкін.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Камера қолжетімсіз</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index d7366e8..f92302a2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">ស្ថាប័នរបស់អ្នកបានបិទការចូលគណនី។ ចំណាំ ពាក្យសម្ងាត់ថ្មីៗ និងអ្វីៗជាច្រើនទៀតនឹងត្រូវបានរក្សាទុកទៅក្នុងឧបករណ៍នេះតែប៉ុណ្ណោះ។</translation> <translation id="3213807041830307252">រកទិញ បកប្រែ និងរកមើលអ្វីដែលអ្នកមើលឃើញដោយប្រើកាមេរ៉ា និងសាលរូបថតរបស់អ្នក។</translation> <translation id="3214379938835224220">អ្នកបានចេញពីគណនីដែលជាផ្នែកមួយនៃការកំណត់ iPad របស់អ្នកឡើងវិញ។ ចុច "បន្ត" ខាងក្រោម ដើម្បីចូល។</translation> +<translation id="3218296450292600703">ការចូលដោយប្រើគណនីរបស់អ្នកដែលស្ថិតក្រោមការគ្រប់គ្រង ជួយអ្នកក្នុងការរក្សាការរុករកដែលពាក់ព័ន្ធនឹងស្ថាប័នរបស់អ្នក (រួមទាំងផ្ទាំង ប្រវត្តិ និងពាក្យសម្ងាត់) ឱ្យនៅដាច់ដោយឡែកពីការរុករកផ្សេងទៀតរបស់អ្នក</translation> <translation id="3224075676564434205">ផ្ទាំងនឹងនៅតែបើកនៅលើឧបករណ៍នេះ ប៉ុន្តែក្រុមនឹងត្រូវបានលុបចេញពីគ្រប់ឧបករណ៍ដែលបានចូលគណនី <ph name="USER_EMAIL" />។</translation> <translation id="3224641773458703735">ដើម្បីនាំចេញពាក្យសម្ងាត់ អ្នកត្រូវកំណត់លេខកូដសម្ងាត់នៅលើឧបករណ៍របស់អ្នកជាមុនសិន។</translation> <translation id="3227137524299004712">ម៉ៃក្រូហ្វូន</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">កំពុងទាញយក… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">ម៉ឺនុយ → ការកំណត់ → វិធីបង់ប្រាក់</translation> <translation id="7108338896283013870">លាក់</translation> +<translation id="7115051913071512405">សាកល្បងវាមើល</translation> <translation id="7128693485119315539">ស្ថាប័នរបស់អ្នកប្រហែលជាត្រូវមើល និងគ្រប់គ្រងទិន្នន័យរុករកដែលបានភ្ជាប់ទៅគណនីរបស់អ្នកដែលស្ថិតក្រោមការគ្រប់គ្រង ដូចជាពាក្យសម្ងាត់ និងប្រវត្តិរុករកតាមអ៊ីនធឺណិតរបស់អ្នកជាដើម។</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">កាមេរ៉ាមិនអាចប្រើបានទេ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index a59b5747..a310252 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">ನಿಮ್ಮ ಸಂಸ್ಥೆ ಸೈನ್ ಇನ್ ಅನ್ನು ಆಫ್ ಮಾಡಿದೆ. ಹೊಸ ಬುಕ್ಮಾರ್ಕ್ಗಳು, ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ಈ ಸಾಧನದಲ್ಲಿ ಮಾತ್ರ ಸೇವ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation> <translation id="3213807041830307252">ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಫೋಟೋ ಗ್ಯಾಲರಿಯನ್ನು ಬಳಸಿಕೊಂಡು ನೀವು ಏನನ್ನು ನೋಡುತ್ತೀರಿ ಎಂಬುದನ್ನು ಶಾಪಿಂಗ್ ಮಾಡಿ, ಅನುವಾದಿಸಿ ಮತ್ತು ಗುರುತಿಸಿ.</translation> <translation id="3214379938835224220">ನಿಮ್ಮ ಐಪ್ಯಾಡ್ ರೀಸೆಟ್ನ ಭಾಗವಾಗಿ ನಿಮ್ಮನ್ನು ಸೈನ್ಔಟ್ ಮಾಡಲಾಗಿದೆ. ಸೈನ್ ಇನ್ ಮಾಡಲು, ಕೆಳಗೆ ಮುಂದುವರಿಸಿ ಎಂಬುದನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ.</translation> +<translation id="3218296450292600703">ನಿಮ್ಮ ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯೊಂದಿಗೆ ಸೈನ್ ಇನ್ ಮಾಡುವುದರಿಂದ ನಿಮ್ಮ ಸಂಸ್ಥೆಗೆ ಸಂಬಂಧಿಸಿದ ಬ್ರೌಸಿಂಗ್ (ಟ್ಯಾಬ್ಗಳು, ಇತಿಹಾಸ ಮತ್ತು ಪಾಸ್ವರ್ಡ್ಗಳು ಸೇರಿದಂತೆ) ಅನ್ನು ನಿಮ್ಮ ಇತರ ಬ್ರೌಸಿಂಗ್ಗಿಂತ ಪ್ರತ್ಯೇಕವಾಗಿಡಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ</translation> <translation id="3224075676564434205">ಈ ಸಾಧನದಲ್ಲಿ ಟ್ಯಾಬ್ಗಳು ತೆರೆದಿರುತ್ತವೆ ಆದರೆ <ph name="USER_EMAIL" /> ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿರುವ ಎಲ್ಲಾ ಸಾಧನಗಳಿಂದ ಗುಂಪನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="3224641773458703735">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ರಫ್ತು ಮಾಡಲು, ನೀವು ಮೊದಲು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಪಾಸ್ಕೋಡ್ ಅನ್ನು ಹೊಂದಿಸಬೇಕು.</translation> <translation id="3227137524299004712">ಮೈಕ್ರೋಫೋನ್</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">ಡೌನ್ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">ಮೆನು → ಸೆಟ್ಟಿಂಗ್ಗಳು → ಪಾವತಿ ವಿಧಾನಗಳು</translation> <translation id="7108338896283013870">ಮರೆಮಾಡಿ</translation> +<translation id="7115051913071512405">ಇದನ್ನು ಪ್ರಯತ್ನಿಸಿ</translation> <translation id="7128693485119315539">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸ ಮತ್ತು ಪಾಸ್ವರ್ಡ್ಗಳಂತಹ ನಿಮ್ಮ ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಗೆ ಸಂಬಂಧಿಸಿರುವ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನೋಡಬೇಕಾಗಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬೇಕಾಗಬಹುದು.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">ಕ್ಯಾಮರಾ ಲಭ್ಯವಿಲ್ಲ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 8d50e3f1..ad6bcca2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">조직에서 로그인을 사용 중지했습니다. 새 북마크, 비밀번호 등이 이 기기에만 저장됩니다.</translation> <translation id="3213807041830307252">카메라와 사진 갤러리를 사용하여 지금 보고 있는 항목을 쇼핑하고, 번역하고, 식별하세요</translation> <translation id="3214379938835224220">iPad 재설정 중 로그아웃되었습니다. 아래에서 '계속'을 탭하여 로그인하세요.</translation> +<translation id="3218296450292600703">관리 계정으로 로그인하면 탭, 방문 기록, 비밀번호 등 조직과 관련된 인터넷 사용 기록을 다른 인터넷 사용 기록과 분리할 수 있습니다.</translation> <translation id="3224075676564434205">이 기기에서의 탭은 열린 상태로 유지되지만, <ph name="USER_EMAIL" />에 로그인된 모든 기기에서는 그룹이 삭제됩니다.</translation> <translation id="3224641773458703735">비밀번호를 내보내려면 먼저 기기에 비밀번호를 설정해야 합니다.</translation> <translation id="3227137524299004712">마이크</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">다운로드 중… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">메뉴 → 설정 → 결제 수단</translation> <translation id="7108338896283013870">숨기기</translation> +<translation id="7115051913071512405">사용해 보기</translation> <translation id="7128693485119315539">조직에서 방문 기록, 비밀번호 등 관리 계정과 연결된 인터넷 사용 기록을 확인하고 관리해야 할 수 있습니다.</translation> <translation id="713215255510512027"><ph name="FILENAME" />(<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">카메라를 사용할 수 없음</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index ea65d22..f501773 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Уюмуңуз кирүү аракетин өчүрүп койду. Жаңы кыстармалар, сырсөздөр жана башкалар ушул түзмөккө гана сакталат.</translation> <translation id="3213807041830307252">Камера жана cүрөт галереясы аркылуу соода кылыңыз, тексттерди которуңуз жана көргөн нерсеңизди аныктаңыз.</translation> <translation id="3214379938835224220">iPad түзмөгүңүз баштапкы абалга келтирилип жатканда аккаунтуңуздан чыктыңыз. Кирүү үчүн төмөндөгү "Улантуу" дегенди таптаңыз.</translation> +<translation id="3218296450292600703">Башкарылган аккаунт менен кирүү уюмуңузга тиешелүү серептөө дайындарын (анын ичинде өтмөктөрдү, таржымалды жана сырсөздөрдү) башка серептөө дайындарынан өзүнчө сактоого жардам берет</translation> <translation id="3224075676564434205">Өтмөктөр бул түзмөктө ачык бойдон калып, бирок топ <ph name="USER_EMAIL" /> аккаунтуна кирип турган бардык түзмөктөрдөн өчүрүлөт.</translation> <translation id="3224641773458703735">Сырсөздөрдү экспорттоо үчүн, адегенде, түзмөгүңүздөгү өткөрүүчү кодду жөндөп алышыңыз керек.</translation> <translation id="3227137524299004712">Микрофон</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Жүктөлүп алынууда… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Меню → Тууралоо → Төлөм ыкмалары</translation> <translation id="7108338896283013870">Жашыруу</translation> +<translation id="7115051913071512405">Муну байкап көрүңүз</translation> <translation id="7128693485119315539">Уюмуңуз башкарылган аккаунтка байланышкан серептөө дайындарын (мисалы, көрүлгөн вебсайттарды жана сырсөздөрдү) көрүп, тескей алат.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Камера жеткиликсиз</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index dfac4e52..3b493c06 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">ອົງກອນຂອງທ່ານປິດການເຂົ້າສູ່ລະບົບໄວ້. ບຸກມາກ, ລະຫັດຜ່ານ ແລະ ຂໍ້ມູນອື່ນໆຈະຖືກບັນທຶກໄປໃສ່ອຸປະກອນນີ້ເທົ່ານັ້ນ.</translation> <translation id="3213807041830307252">ເລືອກຊື້, ແປພາສາ ແລະ ລະບຸສິ່ງທີ່ທ່ານເຫັນໂດຍໃຊ້ກ້ອງ ແລະ ຄັງຮູບພາບຂອງທ່ານ.</translation> <translation id="3214379938835224220">ທ່ານອອກຈາກລະບົບເປັນສ່ວນໜຶ່ງຂອງການຣີເຊັດ iPad ທ່ານແລ້ວ. ແຕະສືບຕໍ່ທາງລຸ່ມເພື່ອເຂົ້າສູ່ລະບົບ.</translation> +<translation id="3218296450292600703">ການເຂົ້າສູ່ລະບົບດ້ວຍບັນຊີທີ່ມີການຈັດການຂອງທ່ານຈະຊ່ວຍແຍກການທ່ອງເວັບທີ່ກ່ຽວຂ້ອງກັບອົງກອນຂອງທ່ານ (ເຊິ່ງຮວມທັງແຖບ, ປະຫວັດ ແລະ ລະຫັດຜ່ານ) ອອກຈາກການທ່ອງເວັບອື່ນໆຂອງທ່ານ</translation> <translation id="3224075676564434205">ແຖບຈະຍັງເປີດຢູ່ໃນອຸປະກອນນີ້ ແຕ່ລະບົບຈະລຶບກຸ່ມອອກຈາກທຸກອຸປະກອນທີ່ເຂົ້າສູ່ລະບົບ <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">ເພື່ອສົ່ງອອກລະຫັດຜ່ານ, ທ່ານຕ້ອງຕັ້ງລະຫັດຜ່ານໃນອຸປະກອນຂອງທ່ານກ່ອນ.</translation> <translation id="3227137524299004712">ໄມໂຄຣໂຟນ</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">ກຳລັງດາວໂຫຼດ… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">ເມນູ → ການຕັ້ງຄ່າ → ວິທີການຈ່າຍເງິນ</translation> <translation id="7108338896283013870">ເຊື່ອງ</translation> +<translation id="7115051913071512405">ລອງມັນເບິ່ງ</translation> <translation id="7128693485119315539">ອົງກອນຂອງທ່ານອາດຈະຕ້ອງເບິ່ງ ແລະ ຈັດການຂໍ້ມູນການທ່ອງເວັບທີ່ຜູກກັບບັນຊີທີ່ມີການຈັດການຂອງທ່ານ, ເຊັ່ນ: ປະຫວັດການທ່ອງເວັບ ແລະ ລະຫັດຜ່ານຂອງທ່ານ.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">ກ້ອງຖ່າຍຮູບບໍ່ສາມາດໃຊ້ໄດ້</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 2f41f85..8ce2554 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">Atsisiunčiama… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Meniu → „Nustatymai“ → „Mokėjimo metodai“</translation> <translation id="7108338896283013870">Slėpti</translation> +<translation id="7115051913071512405">Išbandykite</translation> <translation id="7128693485119315539">Organizacijai gali reikėti peržiūrėti ir tvarkyti su valdoma paskyra susijusius naršymo duomenis, pvz., naršymo istoriją ir slaptažodžius.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Fotoaparatas nepasiekiamas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index b218ade..afeff13 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Notiek lejupielāde… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Izvēlne → Iestatījumi → Maksājuma veidi</translation> <translation id="7108338896283013870">Slēpt</translation> +<translation id="7115051913071512405">Izmēģināt</translation> <translation id="7128693485119315539">Jūsu organizācijai var būt nepieciešams skatīt un pārvaldīt pārlūkošanas datus, kas saistīti ar jūsu pārvaldīto kontu, piemēram, jūsu pārlūkošanas vēsturi un paroles.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera nav pieejama.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index 1aa46a18..21bfb28 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Се презема… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Мени → Поставки → Начини на плаќање</translation> <translation id="7108338896283013870">Скриј</translation> +<translation id="7115051913071512405">Испробај го</translation> <translation id="7128693485119315539">Вашата организација може да треба да ги гледа и да управува со податоците од прелистување поврзани со вашата управувана сметка, како што се вашата историја на прелистувањето и лозинки.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Камерата е недостапна</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 1cfc4f2..810c93f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">ഡൗൺലോഡ് ചെയ്യുന്നു… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">മെനു → ക്രമീകരണം → പേയ്മെന്റ് രീതികൾ</translation> <translation id="7108338896283013870">മറയ്ക്കുക</translation> +<translation id="7115051913071512405">അത് പരീക്ഷിച്ചുനോക്കൂ</translation> <translation id="7128693485119315539">ബ്രൗസിംഗ് ചരിത്രവും പാസ്വേഡുകളും പോലെ, നിങ്ങളുടെ മാനേജ് ചെയ്യപ്പെടുന്ന അക്കൗണ്ടുമായി ബന്ധിപ്പിച്ചിരിക്കുന്ന ബ്രൗസിംഗ് ഡാറ്റ നിങ്ങളുടെ സ്ഥാപനത്തിന് കാണുകയും മാനേജ് ചെയ്യുകയും വേണ്ടി വന്നേക്കാം.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">ക്യാമറ ലഭ്യമല്ല</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 5a20b61..e433e5d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Танай байгууллага нэвтрэхийг унтраасан. Шинэ хавчуурга, нууц үг болон бусад зүйлийг зөвхөн энэ төхөөрөмжид хадгална.</translation> <translation id="3213807041830307252">Камер болон зургийн цомгоо ашиглан харж буй зүйлээ худалдан авч, орчуулж мөн тодорхойлоорой.</translation> <translation id="3214379938835224220">Таны iPad-г шинэчлэх явцад таныг гаргасан. Нэвтрэхийн тулд доорх үргэлжлүүлэх дээр товшино уу.</translation> +<translation id="3218296450292600703">Тохиргоо хийгдсэн бүртгэлээрээ нэвтрэх нь байгууллагатайгаа холбоотой үзсэн зүйлсийг (таб, түүх, нууц үг гэх мэт) бусад үзсэн зүйлсээсээ тусдаа байлгахад тусалдаг</translation> <translation id="3224075676564434205">Табууд энэ төхөөрөмж дээр нээлттэй хэвээр үлдэх хэдий ч бүлгийг <ph name="USER_EMAIL" />-д нэвтэрсэн бүх төхөөрөмжөөс устгана.</translation> <translation id="3224641773458703735">Та нууц үгийг экспорт хийхийн тулд эхлээд төхөөрөмждөө нууц код тохируулах шаардлагатай.</translation> <translation id="3227137524299004712">Микрофон</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Татаж байна… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Цэс → Тохиргоо → Төлбөрийн хэрэгсэл</translation> <translation id="7108338896283013870">Нуух</translation> +<translation id="7115051913071512405">Үүнийг туршаад үзээрэй.</translation> <translation id="7128693485119315539">Танай байгууллага таны хөтчийн түүх, нууц үг зэрэг таны удирддаг бүртгэлтэй холбоотой интернэтээр үзсэн өгөгдлийг харж, удирдах шаардлагатай байж магадгүй.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Камер боломжгүй</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 645b8fa..d353e62 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">तुमच्या संस्थेने साइन इन करणे बंद केले आहे. नवीन बुकमार्क, पासवर्ड आणि आणखी बऱ्याच गोष्टी फक्त या डिव्हाइसवर सेव्ह केल्या जातील.</translation> <translation id="3213807041830307252">तुम्ही पाहता त्या गोष्टींना तुमचा कॅमेरा आणि फोटो गॅलरी वापरून खरेदी करा, त्याचे भाषांतर करा व ओळखा.</translation> <translation id="3214379938835224220">तुमच्या iPad रीसेटचा भाग म्हणून तुम्हाला साइन आउट केले गेले होते. साइन इन करण्यासाठी, सुरू ठेवा वर खाली टॅप करा.</translation> +<translation id="3218296450292600703">तुमचे व्यवस्थापित केलेले खाते वापरून साइन इन केल्यामुळे, तुम्हाला तुमच्या संस्थेशी संबंधित ब्राउझिंग (टॅब, इतिहास आणि पासवर्ड यांच्या समावेशासह) तुमच्या इतर ब्राउझिंगपासून वेगळे ठेवण्यात मदत होते</translation> <translation id="3224075676564434205">टॅब या डिव्हाइसवर खुले राहतील, पण गट हा <ph name="USER_EMAIL" /> मध्ये साइन इन केलेल्या सर्व डिव्हाइसवरून हटवला जाईल.</translation> <translation id="3224641773458703735">पासवर्ड एक्सपोर्ट करण्यासाठी, तुम्ही प्रथम तुमच्या डिव्हाइसवर पासकोड सेट करणे आवश्यक आहे.</translation> <translation id="3227137524299004712">मायक्रोफोन</translation> @@ -1485,6 +1486,7 @@ <translation id="7102005569666697658">डाउनलोड होत आहे… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">मेनू → सेटिंग्ज → पेमेंट पद्धती</translation> <translation id="7108338896283013870">लपवा</translation> +<translation id="7115051913071512405">हे वापरून पहा</translation> <translation id="7128693485119315539">तुमच्या संस्थेला तुमच्या व्यवस्थापित खात्याशी जोडलेला ब्राउझिंग डेटा पाहण्याची आणि व्यवस्थापित करण्याची आवश्यकता असू शकते, जसे की तुमचा ब्राउझिंग इतिहास आणि पासवर्ड.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">कॅमेरा अनुपलब्ध आहे</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 5fafbf47..b3a1fa69 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Organisasi anda telah mematikan log masuk. Penanda halaman, kata laluan baharu dan banyak lagi akan disimpan pada peranti ini sahaja.</translation> <translation id="3213807041830307252">Beli, terjemah dan kenal pasti perkara yang anda lihat menggunakan kamera dan galeri foto anda.</translation> <translation id="3214379938835224220">Anda telah dilog keluar sebagai sebahagian daripada tetapan semula iPad anda. Ketik teruskan di bawah untuk log masuk.</translation> +<translation id="3218296450292600703">Tindakan log masuk dengan akaun terurus anda membantu anda meneruskan penyemakan imbas berkaitan dengan organisasi anda (termasuk tab, sejarah dan kata laluan) berasingan daripada penyemakan imbas anda yang lain</translation> <translation id="3224075676564434205">Tab akan kekal terbuka pada peranti ini tetapi kumpulan akan dipadamkan daripada semua peranti yang dilog masuk menggunakan <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Untuk mengeksport kata laluan, mula-mula anda mesti menetapkan kod laluan pada peranti anda.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Memuat turun… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Tetapan → Kaedah pembayaran</translation> <translation id="7108338896283013870">Sembunyikan</translation> +<translation id="7115051913071512405">Cubalah</translation> <translation id="7128693485119315539">Organisasi anda mungkin perlu melihat dan mengurus data penyemakan imbas yang dikaitkan dengan akaun terurus anda, seperti sejarah penyemakan imbas dan kata laluan anda.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera tidak tersedia</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index cf6b037..316f8a1e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">ဒေါင်းလုဒ်လုပ်နေသည်… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">မီနူး → ဆက်တင်များ → ငွေပေးချေနည်းလမ်းများ</translation> <translation id="7108338896283013870">ဝှက်ထားရန်</translation> +<translation id="7115051913071512405">စမ်းကြည့်ပါ</translation> <translation id="7128693485119315539">ကြည့်ရှုမှုမှတ်တမ်းနှင့် စကားဝှက်များကဲ့သို့သော သင်၏ စီမံခန့်ခွဲထားသည့်အကောင့်နှင့် ချိတ်ဆက်ထားသော ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာကို သင့်အဖွဲ့အစည်းက ကြည့်ရှု၊ စီမံရန် လိုအပ်နိုင်သည်။</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">ကင်မရာအသုံးမပြုနိုင်ပါ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index d94076f..7a25981a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">डाउनलोड गरिँदै छ… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">मेनु → सेटिङ → भुक्तानी विधि</translation> <translation id="7108338896283013870">लुकाउनुहोस्</translation> +<translation id="7115051913071512405">यसलाई प्रयास गर्नुहोस्</translation> <translation id="7128693485119315539">तपाईंको सङ्गठनले तपाईंको व्यवस्थापन गरिएको खातासँग सम्बन्धित ब्राउजिङ डेटा (जस्तै, तपाईंका ब्राउजिङ हिस्ट्री र पासवर्ड) हेर्नु पर्ने र व्यवस्थापन गर्नु पर्ने हुन सक्छ।</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">क्यामेरा उपलब्ध छैन</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index f3890db..568c7c8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Je organisatie heeft inloggen uitgezet. Items zoals nieuwe bookmarks en wachtwoorden worden alleen opgeslagen op dit apparaat.</translation> <translation id="3213807041830307252">Winkel, vertaal en identificeer wat je ziet met je camera en fotogalerij.</translation> <translation id="3214379938835224220">Je bent uitgelogd omdat je iPad wordt gereset. Tik hieronder op Doorgaan om in te loggen.</translation> +<translation id="3218296450292600703">Als je inlogt met je beheerde account, kun je browsen gerelateerd aan je organisatie (zoals tabbladen, geschiedenis en wachtwoorden) scheiden van je andere browse-activiteiten</translation> <translation id="3224075676564434205">De tabbladen blijven geopend op dit apparaat, maar de groep wordt verwijderd van alle apparaten die zijn ingelogd bij <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Als je wachtwoorden wilt exporteren, moet je eerst een toegangscode instellen op je apparaat.</translation> <translation id="3227137524299004712">Microfoon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Downloaden… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Instellingen → Betaalmethoden</translation> <translation id="7108338896283013870">Verbergen</translation> +<translation id="7115051913071512405">Probeer het uit</translation> <translation id="7128693485119315539">Je organisatie moet misschien browsegegevens kunnen bekijken en beheren die aan je beheerde account zijn gekoppeld, zoals je browsegeschiedenis en wachtwoorden.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Camera is niet beschikbaar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index f32c120..98740d9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Organisasjonen din har slått av pålogging. Nye bokmerker, passord med mer lagres bare på denne enheten.</translation> <translation id="3213807041830307252">Kjøp, oversett og identifiser det du ser, ved bruk av kameraet og bildegalleriet.</translation> <translation id="3214379938835224220">Du ble logget av som en del av tilbakestillingen av iPad. Trykk på Fortsett under for å logge på.</translation> +<translation id="3218296450292600703">Hvis du logger på med den administrerte kontoen din, kan du holde nettlesingen som er knyttet til organisasjonen din (inkludert faner, logg og passord), atskilt fra annen nettlesing</translation> <translation id="3224075676564434205">Fanene forblir åpne på denne enheten, men gruppen blir slettet fra alle enheter som er logget på <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">For å eksportere passordene må du først angi en adgangskode på enheten din.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Laster ned … <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Meny → Innstillinger → Betalingsmåter</translation> <translation id="7108338896283013870">Skjul</translation> +<translation id="7115051913071512405">Test det</translation> <translation id="7128693485119315539">Organisasjonen din kan ha behov for å se og administrere nettlesingsdata knyttet til den administrerte kontoen din, for eksempel nettleserloggen og passordene dine.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kameraet er utilgjengelig</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index 5a475df..14b2f897 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658"><ph name="FILE_SIZE" /> ଡାଉନ୍ଲୋଡ୍ ହେଉଛି…</translation> <translation id="7104701424653979232">ମେନୁ → ସେଟିଂସ → ପେମେଣ୍ଟ ପଦ୍ଧତିଗୁଡ଼ିକ</translation> <translation id="7108338896283013870">ଲୁଚାନ୍ତୁ</translation> +<translation id="7115051913071512405">ଏହାକୁ ବ୍ୟବହାର କରି ଦେଖନ୍ତୁ</translation> <translation id="7128693485119315539">ଆପଣଙ୍କ ସଂସ୍ଥା ଆପଣଙ୍କର ବ୍ରାଉଜିଂ ଇତିହାସ ଏବଂ ପାସୱାର୍ଡଗୁଡ଼ିକ ପରି ଆପଣଙ୍କ ପରିଚାଳିତ ଆକାଉଣ୍ଟ ସହ ସମ୍ବନ୍ଧିତ ବ୍ରାଉଜିଂ ଡାଟାକୁ ଦେଖିବା ଏବଂ ପରିଚାଳନା କରିବା ଆବଶ୍ୟକ କରିପାରେ।</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">କ୍ୟାମେରା ଉପଲବ୍ଧ ନାହିଁ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index d94a0bf..029335a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">ਮੀਨੂ → ਸੈਟਿੰਗਾਂ → ਭੁਗਤਾਨ ਵਿਧੀਆਂ</translation> <translation id="7108338896283013870">ਲੁਕਾਓ</translation> +<translation id="7115051913071512405">ਇਸਨੂੰ ਅਜ਼ਮਾਓ</translation> <translation id="7128693485119315539">ਤੁਹਾਡੀ ਸੰਸਥਾ ਨੂੰ ਤੁਹਾਡੇ ਪ੍ਰਬੰਧਿਤ ਕੀਤੇ ਖਾਤੇ ਨਾਲ ਸੰਬੰਧਿਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਡਾਟੇ ਨੂੰ ਦੇਖਣ ਅਤੇ ਉਸਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਦੀ ਲੋੜ ਹੋ ਸਕਦੀ ਹੈ, ਜਿਵੇਂ ਕਿ ਤੁਹਾਡਾ ਬ੍ਰਾਊਜ਼ਿੰਗ ਇਤਿਹਾਸ ਅਤੇ ਪਾਸਵਰਡ।</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">ਕੈਮਰਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 957d382..3c04530 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Twoja organizacja wyłączyła logowanie się. Nowe zakładki, hasła i inne ustawienia będą zapisywane tylko na tym urządzeniu.</translation> <translation id="3213807041830307252">Kupuj, tłumacz i rozpoznawaj to, co widzisz, za pomocą aparatu i galerii zdjęć.</translation> <translation id="3214379938835224220">W ramach resetowania iPada nastąpiło wylogowanie. Aby się zalogować, poniżej kliknij Dalej.</translation> +<translation id="3218296450292600703">Logowanie się na konto zarządzane pozwala oddzielić dane przeglądania związane z organizacją (w tym karty, historię i hasła) od pozostałych danych przeglądania</translation> <translation id="3224075676564434205">Karty pozostaną otwarte na tym urządzeniu, ale grupa zostanie usunięta ze wszystkich urządzeń zalogowanych na konto <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Aby wyeksportować hasła, musisz najpierw ustawić kod dostępu na urządzeniu.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Pobieram… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Ustawienia → Formy płatności</translation> <translation id="7108338896283013870">Ukryj</translation> +<translation id="7115051913071512405">Wypróbuj</translation> <translation id="7128693485119315539">Twoja organizacja może potrzebować dostępu do danych przeglądania powiązanych z Twoim kontem zarządzanym, takich jak historia przeglądania i hasła, oraz chcieć nimi zarządzać.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Aparat jest niedostępny</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index 89f40b3..0cf4aff 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -819,7 +819,7 @@ <translation id="4473608001744970767">Ocultar o recurso "Monitorar preço"</translation> <translation id="4474142134969976028">Nenhum resultado correspondente</translation> <translation id="4474494258097106883">Criado para o iPhone</translation> -<translation id="4488754974567924717">Vamos avisar você se as senhas forem comprometidas</translation> +<translation id="4488754974567924717">Vamos avisar você se esse problema acontecer</translation> <translation id="4489536976005181779">{count,plural, =1{Página adicionada à Lista de leitura na sua conta {email}}one{Página adicionada à Lista de leitura na sua conta {email}}other{Páginas adicionadas à Lista de leitura na sua conta {email}}}</translation> <translation id="4490794477009017910">Ir para a guia anterior</translation> <translation id="4493604894403585654">Você fez login como <ph name="USER_EMAIL" />. Você pode parar a sincronização a qualquer momento nas configurações. O Google pode personalizar a Pesquisa e outros serviços com base no seu histórico.</translation> @@ -1146,7 +1146,7 @@ <translation id="5803566855766646066">Tem certeza de que você quer descartar este novo card?</translation> <translation id="5804012843049740908">Dicas para ajudar você a aproveitar o Chrome ao máximo</translation> <translation id="5804241973901381774">Permissões</translation> -<translation id="5817176759448082654">Check-up de senha</translation> +<translation id="5817176759448082654">Check-up de Senha</translation> <translation id="5819208479324046259">Gerenciado por <ph name="MANAGER" />. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation> <translation id="5829649908290113115">Sincronizando…</translation> <translation id="583923961930319521">Usar senhas em todos seus dispositivos</translation> @@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Fazendo o download… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Configurações → Formas de pagamento</translation> <translation id="7108338896283013870">Ocultar</translation> +<translation id="7115051913071512405">Experimente</translation> <translation id="7128693485119315539">Sua organização talvez precise ver e gerenciar dados de navegação vinculados à sua conta gerenciada, como histórico de navegação e senhas.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">A câmera não está disponível</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index a1f83ed..f4dee2e8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">A transferir… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menu → Definições → Métodos de pagamento</translation> <translation id="7108338896283013870">Ocultar</translation> +<translation id="7115051913071512405">Experimente</translation> <translation id="7128693485119315539">A sua organização pode ter de ver e gerir os dados de navegação associados à sua conta gerida, como o histórico de navegação e as palavras-passe.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">A câmara não está disponível</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index e8a912e..5403dc8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Organizația a dezactivat conectarea. Marcajele, parolele și alte date noi vor fi salvate numai pe acest dispozitiv.</translation> <translation id="3213807041830307252">Cumpără, tradu și identifică ceea ce vezi cu ajutorul camerei foto și al galeriei foto.</translation> <translation id="3214379938835224220">Te-ai deconectat în cadrul resetării dispozitivului iPad. Atinge Continuă pentru a te conecta.</translation> +<translation id="3218296450292600703">Dacă te conectezi cu contul gestionat, poți să separi navigarea asociată organizației tale (inclusiv filele, istoricul și parolele) de celelalte activități de navigare</translation> <translation id="3224075676564434205">Filele vor rămâne deschise pe acest dispozitiv, dar grupul va fi șters de pe toate dispozitivele conectate la <ph name="USER_EMAIL" /></translation> <translation id="3224641773458703735">Pentru a exporta parolele, trebuie mai întâi să setezi o parolă pe dispozitiv.</translation> <translation id="3227137524299004712">Microfon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Se descarcă… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Meniu → Setări → Metode de plată</translation> <translation id="7108338896283013870">Ascunde</translation> +<translation id="7115051913071512405">Încercați</translation> <translation id="7128693485119315539">Organizația ta poate avea nevoie să vadă și să gestioneze datele de navigare asociate contului tău gestionat, cum ar fi istoricul de navigare și parolele.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Camera foto nu este disponibilă</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index fdad63457..fdce1976 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -132,7 +132,7 @@ <translation id="1509486075633541495">Войдите в аккаунт</translation> <translation id="1509960214886564027">Многие функции на сайтах могут работать некорректно</translation> <translation id="1513858653616922153">Удалить пароль</translation> -<translation id="1517166097004694782">Скрыть карточку "Продолжить просмотр"</translation> +<translation id="1517166097004694782">Скрыть "Снова открыть эту вкладку"</translation> <translation id="1520027731907768768">Уведомления о скидках на отслеживаемые товары</translation> <translation id="1521366073263497277">Перейдите на страницу вкладок.</translation> <translation id="1521774566618522728">Последние действия: сегодня</translation> @@ -357,7 +357,7 @@ <translation id="2408110434434717724">Уже имеющиеся данные о работе в браузере будут храниться отдельно. Чтобы их использовать, выйдите из управляемого аккаунта.</translation> <translation id="2410754283952462441">Выберите аккаунт</translation> <translation id="2422174748424038845">Тогда группа вкладок "<ph name="GROUP_NAME" />" сразу станет недоступна всем пользователям и будет удалена с каждого устройства.</translation> -<translation id="2424805048070062787">Продолжить просмотр</translation> +<translation id="2424805048070062787">Снова открыть эту вкладку</translation> <translation id="2426805022920575512">Сменить аккаунт</translation> <translation id="243275146591958220">Отменить скачивание</translation> <translation id="2434405374328098816">Пароль пользователя <ph name="USERNAME" /> для сайта <ph name="WEBSITE" /> уже сохранен.</translation> @@ -533,6 +533,7 @@ <translation id="3208260410153224535">В вашей организации вход в браузере отключен. Новые закладки, пароли и другие данные будут сохраняться только на этом устройстве.</translation> <translation id="3213807041830307252">Находите товары, переводите тексты и получайте информацию о том, что вас окружает, используя камеру или фото из галереи.</translation> <translation id="3214379938835224220">В результате сброса настроек iPad произошел выход из аккаунта. Нажмите "Продолжить" ниже, чтобы войти в него.</translation> +<translation id="3218296450292600703">Войдя в управляемый аккаунт, вы сможете отделить рабочие данные в браузере, например вкладки, историю и пароли, от личных.</translation> <translation id="3224075676564434205">Хотя здесь вкладки останутся открытыми, группа будет удалена со всех устройств, на которых выполнен вход в <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Чтобы экспортировать пароли, настройте на устройстве код доступа.</translation> <translation id="3227137524299004712">Микрофон</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Скачивание… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Меню → Настройки → Способы оплаты</translation> <translation id="7108338896283013870">Скрыть</translation> +<translation id="7115051913071512405">Попробовать</translation> <translation id="7128693485119315539">Ваша организация может просматривать данные о работе в браузере, привязанные к управляемому аккаунту (например, историю браузера и пароли), а также управлять ими.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Камера недоступна</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index 311fc4b4..910d32ae 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">බාගනිමින්… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">මෙනුව → සැකසීම් → ගෙවීමේ ක්රම</translation> <translation id="7108338896283013870">සඟවන්න</translation> +<translation id="7115051913071512405">ඊට උත්සාහ කර බලන්න</translation> <translation id="7128693485119315539">ඔබේ බ්රවුස් කිරීමේ ඉතිහාසය සහ මුරපද වැනි ඔබගේ කළමනාකරණය කළ ගිණුමට බැඳී ඇති බ්රවුස් කිරීමේ දත්ත බැලීමට සහ කළමනාකරණය කිරීමට ඔබේ සංවිධානයට අවශ්ය විය හැක.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">කැමරාව නොතිබේ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index e057266..365d30f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Sťahuje sa… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Ponuka → Nastavenia → Spôsoby platby</translation> <translation id="7108338896283013870">Skryť</translation> +<translation id="7115051913071512405">Vyskúšajte to</translation> <translation id="7128693485119315539">Vaša organizácia môže potrebovať zobraziť a spravovať dáta prehliadania spojené s vaším spravovaným účtom, napríklad históriu prehliadania a heslá.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera nie je k dispozícii</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 8ca1f069..1eceda5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">Prenašanje … <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Meni → Nastavitve → Plačilna sredstva</translation> <translation id="7108338896283013870">Skrij</translation> +<translation id="7115051913071512405">Preskusite</translation> <translation id="7128693485119315539">Vaša organizacija si bo morda morala ogledati in upravljati podatke brskanja, povezane z vašim upravljanim računom, kot so zgodovina brskanja in gesla.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Fotoaparat ni na voljo</translation> @@ -1903,6 +1904,7 @@ <translation id="8786100550345425552">Uredi dovoljenja</translation> <translation id="878871978861915380">Skrij »Spremljanje cen«</translation> <translation id="8792626944327216835">mikrofon</translation> +<translation id="8796634520835503150">Na voljo je način za branje</translation> <translation id="8803526663383843427">Če je to vklopljeno</translation> <translation id="8803639129939845298">Varno</translation> <translation id="8806823403540278281">Vaša organizacija zahteva, da brskate zasebno. V anonimnem načinu se zavihki ne shranjujejo.
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index fc81d12..baa94f0a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Po shkarkon… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menyja → Cilësimet → Mënyrat e pagesës</translation> <translation id="7108338896283013870">Fshih</translation> +<translation id="7115051913071512405">Provoje</translation> <translation id="7128693485119315539">Organizata jote mund të duhet të shikojë dhe të menaxhojë të dhënat e shfletimit që janë të lidhura me llogarinë tënde të menaxhuar, si p.sh. historikun e shfletimit dhe fjalëkalimet e tua.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera nuk ofrohet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index def47ad..efb0359 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658"><ph name="FILE_SIZE" /> se preuzima…</translation> <translation id="7104701424653979232">Meni → Podešavanja → Načini plaćanja</translation> <translation id="7108338896283013870">Sakrij</translation> +<translation id="7115051913071512405">Isprobajte</translation> <translation id="7128693485119315539">Organizacija može da ima potrebu da vidi podatke pregledanja povezane sa vašim upravljanim nalogom, poput istorije pregledanja i lozinki, kao i da upravlja njima.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera je nedostupna</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 5cb42dfa..65824f378 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658"><ph name="FILE_SIZE" /> се преузима…</translation> <translation id="7104701424653979232">Мени → Подешавања → Начини плаћања</translation> <translation id="7108338896283013870">Сакриј</translation> +<translation id="7115051913071512405">Испробајте</translation> <translation id="7128693485119315539">Организација може да има потребу да види податке прегледања повезане са вашим управљаним налогом, попут историје прегледања и лозинки, као и да управља њима.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Камера је недоступна</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index b23e476..ec49854 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Din organisation har inaktiverat inloggning. Nya bokmärken, lösenord med mera sparas endast på den här enheten.</translation> <translation id="3213807041830307252">Köp, översätt och identifiera det du ser med hjälp av kameran och fotogalleriet.</translation> <translation id="3214379938835224220">Du har loggats ut som en del av återställningen av din iPad. Tryck på Fortsätt nedan för att logga in.</translation> +<translation id="3218296450292600703">Genom att logga in med det hanterade kontot kan du skilja på webbinformationen som är kopplad till organisationen, till exempel flikar, historik och lösenord, från annan webbinformation.</translation> <translation id="3224075676564434205">Flikarna förblir öppna på den här enheten men gruppen raderas från alla enheter där du är inloggad på <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Du måste ställa in ett lösenord på enheten om du vill kunna exportera lösenord.</translation> <translation id="3227137524299004712">Mikrofon</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Laddar ned … <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Meny → Inställningar → Betalningsmetod</translation> <translation id="7108338896283013870">Dölj</translation> +<translation id="7115051913071512405">Testa själv</translation> <translation id="7128693485119315539">Organisationen behöver kanske se och hantera webbinformation som är kopplad till ditt hanterade konto, till exempel webbhistorik och lösenord.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kameran är inte tillgänglig</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index a38399d..51267b3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Inapakua… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menyu → Mipangilio → Njia za kulipa</translation> <translation id="7108338896283013870">Ficha</translation> +<translation id="7115051913071512405">Ijaribu</translation> <translation id="7128693485119315539">Huenda shirika lako likahitaji kuona na kudhibiti data ya kuvinjari inayohusishwa na akaunti yako inayosimamiwa, kama vile manenosiri na historia yako ya kuvinjari.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera haipatikani</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 4591c7f6..73259e4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">உள்நுழைவதை உங்கள் நிறுவனம் முடக்கியுள்ளது. புதிய புக்மார்க்குகள், கடவுச்சொற்கள் போன்ற அனைத்தும் இந்தச் சாதனத்தில் மட்டுமே சேமிக்கப்படும்.</translation> <translation id="3213807041830307252">நீங்கள் பார்ப்பதை உங்கள் கேமரா மற்றும் புகைப்பட கேலரியைப் பயன்படுத்தி ஷாப்பிங் செய்யலாம் மொழிபெயர்க்கலாம் அடையாளம் காணலாம்.</translation> <translation id="3214379938835224220">iPad மீட்டமைப்பின் ஒரு பகுதியாக வெளியேற்றப்பட்டீர்கள். உள்நுழைய கீழுள்ள 'தொடர்க' என்பதைத் தட்டவும்.</translation> +<translation id="3218296450292600703">நிர்வகிக்கப்படும் கணக்கு மூலம் உள்நுழைவது உங்கள் நிறுவனத்துடன் தொடர்புடைய பக்கங்கள், பதிவுகள், கடவுச்சொற்கள் போன்ற பிரவுசிங் தரவையும் பிற பிரவுசிங் தரவையும் பிரித்து வைக்க உதவும்</translation> <translation id="3224075676564434205">இந்தச் சாதனத்தில் பக்கங்கள் திறந்தே இருக்கும். ஆனால், நீங்கள் <ph name="USER_EMAIL" /> கணக்கின் மூலம் உள்நுழைந்துள்ள சாதனங்கள் அனைத்திலும் குழு நீக்கப்படும்.</translation> <translation id="3224641773458703735">கடவுச்சொற்களை ஏற்ற, முதலில் உங்கள் சாதனத்தில் கடவுக்குறியீட்டை அமைக்க வேண்டும்.</translation> <translation id="3227137524299004712">மைக்ரோஃபோன்</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">பதிவிறக்குகிறது… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">மெனு → அமைப்புகள் → பேமெண்ட் முறைகள்</translation> <translation id="7108338896283013870">மறை</translation> +<translation id="7115051913071512405">முயற்சிக்கவும்</translation> <translation id="7128693485119315539">உங்களின் நிர்வகிக்கப்படும் கணக்குடன் இணைக்கப்பட்டுள்ள உங்கள் பிரவுசிங் பதிவுகள், கடவுச்சொற்கள் போன்ற பிரவுசிங் தரவை உங்கள் நிறுவனம் பார்க்கவும் நிர்வகிக்கவும் வேண்டியிருக்கலாம்.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">கேமரா இல்லை</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index 636597c..213dd25 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">డౌన్లోడ్ చేస్తోంది… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">మెనూ → సెట్టింగ్లు → పేమెంట్ ఆప్షన్లు</translation> <translation id="7108338896283013870">దాచిపెట్టు</translation> +<translation id="7115051913071512405">దీన్ని ప్రయత్నించు</translation> <translation id="7128693485119315539">మీ బ్రౌజింగ్ హిస్టరీ, పాస్వర్డ్ల వంటి మీ మేనేజ్ చేయబడే ఖాతాతో ముడిపడి ఉన్న బ్రౌజింగ్ డేటాను మీ సంస్థ చూడవలసి రావచ్చు, మేనేజ్ చేయవలసి రావచ్చు.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">కెమెరా అందుబాటులో లేదు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index 4b3f4e8f4..d94cb6f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">กำลังดาวน์โหลด… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">เมนู → การตั้งค่า → วิธีการชำระเงิน</translation> <translation id="7108338896283013870">ซ่อน</translation> +<translation id="7115051913071512405">ลองใช้งาน</translation> <translation id="7128693485119315539">องค์กรของคุณอาจต้องดูและจัดการข้อมูลการท่องเว็บที่เชื่อมโยงกับบัญชีที่มีการจัดการ เช่น ประวัติการท่องเว็บและรหัสผ่าน</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">กล้องถ่ายรูปไม่พร้อมใช้งาน</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 225b662..47011ea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -757,7 +757,7 @@ <translation id="4207873326995387292">Tarayıcı Bilgisi</translation> <translation id="421070604241073551">Bu ayar etkinleştirildiğinde veriler Google Hesabınıza kaydedilir. Devre dışı bırakıldığında veriler yalnızca bu cihaza kaydedilir.</translation> <translation id="4224534474590365556">Etkin olmayan 99+ sekme kapatılsın mı?</translation> -<translation id="422474357428465195">Güvenliğinizi riske atabilecek birkaç şifre sorununuz var.</translation> +<translation id="422474357428465195">Güvenliğinizi riske atabilecek birden fazla şifre sorununuz var.</translation> <translation id="422477017457571619">Tarama verilerinizin Google'a gönderilmesi aracılığıyla tehlikeli siteler, indirmeler ve uzantılara karşı anlık, yapay zeka destekli koruma</translation> <translation id="4231395118547300571">Güvenlik Kontrolü bildirimleri açıldı</translation> <translation id="4237377247299956313"><ph name="BEGIN_BOLD" />Varsayılan Tarayıcı Uygulaması<ph name="END_BOLD" />'na dokunun</translation> @@ -865,7 +865,7 @@ <translation id="4647758699119474035"><ph name="USER_NAME" /> olarak oturum açtınız. <ph name="USER_EMAIL" />. Google Hesabı hatası. Hesap menüsünü açın.</translation> <translation id="4650125387981512669"><ph name="FIRST_RUN_ACCOUNT_NAME" /> olarak devam et</translation> <translation id="4651927776207937667">{count,plural, =1{1 dakika sonra gizle}other{{count} dakika sonra gizle}}</translation> -<translation id="4652817563047461855">Şifrelerinizin güvenliğini sağlayın, sızdırılıp sızdırılmadıklarını öğrenin ve internette kendinizi korumanıza yardımcı olacak öneriler alın. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation> +<translation id="4652817563047461855">Şifrelerinizin güvenliğini sağlayın, güvenliğin ihlal edilip edilmediğini öğrenin ve internette kendinizi korumanıza yardımcı olacak öneriler alın. <ph name="BEGIN_LINK" />Daha fazla bilgi<ph name="END_LINK" /></translation> <translation id="4658335131052370646">Kaydet</translation> <translation id="466307903888586355">Dosya kaydetme işlemi, kuruluşunuz tarafından engelleniyor</translation> <translation id="4668929960204016307">,</translation> @@ -978,7 +978,7 @@ <translation id="5118764316110575523">Kapalı</translation> <translation id="5119329531859909472">Ürünü takip etmek için Takip Et'e dokunun</translation> <translation id="5121618895923301719">Bu ürünü zaten takip ediyorsunuz. Bu sayfa <ph name="BEGIN_LINK" />Mobil Yer İşaretleri<ph name="END_LINK" />'ne kaydedildi.</translation> -<translation id="512533434554095351">Birkaç şifre sorununuz var.</translation> +<translation id="512533434554095351">Birden fazla şifre sorununuz var.</translation> <translation id="5127538504377457572"><ph name="DAYS" /> gün önce etkindi</translation> <translation id="5128788795241319992">Yeni menüyü keşfedin</translation> <translation id="5132942445612118989">Tüm cihazlardaki şifreleriniz, geçmişiniz ve diğer öğelerinizi senkronize edin</translation> @@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">İndiriliyor… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menü → Ayarlar → Ödeme yöntemleri</translation> <translation id="7108338896283013870">Gizle</translation> +<translation id="7115051913071512405">Dene</translation> <translation id="7128693485119315539">Kuruluşunuzun, yönetilen hesabınıza bağlı tarama geçmişiniz ve şifreleriniz gibi tarama verilerini görmesi ve yönetmesi gerekebilir.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera kullanılamıyor</translation> @@ -1830,7 +1831,7 @@ <translation id="8534481786647257214">Google+ yayını tamamlandı.</translation> <translation id="8535368836838588657">Şifreyi göster</translation> <translation id="8545276357312221485">Varsayılan tarayıcı ayarlarınızı kontrol edin</translation> -<translation id="854938212724803178">Sızdırılmış 1 şifreniz var. Güvenlik için sorunu giderin.</translation> +<translation id="854938212724803178">Güvenliği ihlal edilmiş 1 şifreniz var. Güvenlik için sorunu giderin.</translation> <translation id="8556590991644167667">{count,plural, =1{{count} uyarıyı kapattınız}other{{count} uyarıyı kapattınız}}</translation> <translation id="8558046478684552694">Grubu kapat.</translation> <translation id="8560253818350321773">Sık kullanılan öğeleri üstte gösterir.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 3f4ae241..d1c13b0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">Адміністратор вашої організації вимкнув можливість входу. Нові закладки, паролі тощо буде збережено лише на цьому пристрої.</translation> <translation id="3213807041830307252">Здійснюйте покупки, перекладайте тексти й визначайте об’єкти навколо за допомогою камери й фотогалереї.</translation> <translation id="3214379938835224220">Ви вийшли з облікового запису, коли було скинуто налаштування iPad. Щоб увійти, натисніть "Продовжити" нижче.</translation> +<translation id="3218296450292600703">Увійдіть у керований обліковий запис, щоб відокремити дані вебперегляду, пов’язані з вашою організацією (зокрема вкладки, історію і паролі), від особистих</translation> <translation id="3224075676564434205">Вкладки залишатимуться відкритими на цьому пристрої, однак групу буде видалено з усіх пристроїв, на яких ви ввійшли в обліковий запис <ph name="USER_EMAIL" />.</translation> <translation id="3224641773458703735">Щоб експортувати паролі, спершу потрібно налаштувати код доступу на пристрої.</translation> <translation id="3227137524299004712">Мікрофон</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">Завантаження файлу… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Меню → Налаштування → Способи оплати</translation> <translation id="7108338896283013870">Сховати</translation> +<translation id="7115051913071512405">Спробувати</translation> <translation id="7128693485119315539">Адміністратор організації зможе бачити дані вебперегляду (зокрема історію і паролі) у вашому керованому обліковому записі й керувати ними.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Камера недоступна</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index 60eab96f..bfe89a4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">ڈاؤن لوڈ ہو رہی ہے… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">مینو ← ترتیبات ← ادائیگی کے طریقے</translation> <translation id="7108338896283013870">چھپائیں</translation> +<translation id="7115051913071512405">اسے آزمائیں</translation> <translation id="7128693485119315539">آپ کی تنظیم کو آپ کے نظم کردہ اکاؤنٹ سے منسلک براؤزنگ ڈیٹا کو دیکھنے اور اس کا نظم کرنے کی ضرورت پڑ سکتی ہے، جیسے آپ کی براؤزنگ کی سرگزشت اور پاس ورڈز۔</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">کیمرا دستیاب نہیں ہے</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 1d53368..7cd4122 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">Yuklab olinmoqda… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Menyu → Sozlamalar → Toʻlov usullari</translation> <translation id="7108338896283013870">Berkitish</translation> +<translation id="7115051913071512405">Sinab ko‘rish</translation> <translation id="7128693485119315539">Tashkilotingiz boshqariluvchi hisobingizga biriktirilgan brauzer tarixi va parollar kabi brauzer maʼlumotlariga kirish va boshqarishni talab qilishi mumkin.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Kamera ish faoliyatida emas</translation> @@ -1903,6 +1904,7 @@ <translation id="8786100550345425552">Ruxsatlarni tahrirlash</translation> <translation id="878871978861915380">“Narx kuzatuvi” chiqmasin</translation> <translation id="8792626944327216835">mikrofon</translation> +<translation id="8796634520835503150">Mutolaa rejimi mavjud</translation> <translation id="8803526663383843427">Qachon yoqilgan</translation> <translation id="8803639129939845298">Xavfsiz</translation> <translation id="8806823403540278281">Tashkilotingiz internetni pinhona kezishni talab qiladi. Inkognito rejimidagi varaqlar saqlanmaydi.
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 09a7dcd0..48fe347 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -1485,6 +1485,7 @@ <translation id="7102005569666697658">Đang tải xuống… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Trình đơn → Cài đặt → Phương thức thanh toán</translation> <translation id="7108338896283013870">Ẩn</translation> +<translation id="7115051913071512405">Dùng thử</translation> <translation id="7128693485119315539">Tổ chức của bạn có thể cần xem và quản lý dữ liệu duyệt web liên quan đến tài khoản được quản lý của bạn, chẳng hạn như nhật ký duyệt web và mật khẩu.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Máy ảnh không khả dụng</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index 4d31cb6e..3761b3c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">贵组织关闭了登录功能。新的书签、密码等信息将会仅保存到此设备上。</translation> <translation id="3213807041830307252">使用相机和图库购买、翻译和识别所见内容。</translation> <translation id="3214379938835224220">您在 iPad 重置过程中退出了账号。点按下方的“继续”即可登录。</translation> +<translation id="3218296450292600703">使用受管理的账号登录有助于您将与组织相关的浏览数据(包括标签页、历史记录和密码)与其他浏览数据分开</translation> <translation id="3224075676564434205">相应标签页将在此设备上保持打开状态,但该分组会从所有已登录 <ph name="USER_EMAIL" /> 的设备中删除。</translation> <translation id="3224641773458703735">要想导出密码,您必须先在设备上设置屏幕锁定。</translation> <translation id="3227137524299004712">麦克风</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">正在下载…<ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">菜单 → 设置 → 支付方式</translation> <translation id="7108338896283013870">隐藏</translation> +<translation id="7115051913071512405">试用</translation> <translation id="7128693485119315539">您的组织可能需要查看和管理与您的受管理账号相关联的浏览数据,例如您的浏览记录和密码。</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">无法使用相机</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index 7b12733a..c7692d9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">你的機構已關閉登入功能。新書籤、密碼等資料只會儲存在此裝置上。</translation> <translation id="3213807041830307252">使用相機和相片購物、翻譯及識別所見內容。</translation> <translation id="3214379938835224220">您已在重設 iPad 時登出,輕按下方的 [繼續] 即可登入。</translation> +<translation id="3218296450292600703">登入受管帳戶後,就能將機構相關的瀏覽資料 (包括分頁、記錄和密碼) 與其他瀏覽資料分開。</translation> <translation id="3224075676564434205">分頁會在此裝置上保持開啟,但群組會從所有已登入 <ph name="USER_EMAIL" /> 的裝置刪除。</translation> <translation id="3224641773458703735">如要匯出密碼,您必須先在裝置上設定密碼。</translation> <translation id="3227137524299004712">麥克風</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">正在下載…<ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">選單 → 設定 → 付款方法</translation> <translation id="7108338896283013870">隱藏</translation> +<translation id="7115051913071512405">試試看</translation> <translation id="7128693485119315539">機構可能要查看和管理與受管帳戶關聯的瀏覽資料 (例如瀏覽記錄和密碼)。</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">無法使用相機</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 13b9a4d..a545f2c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -533,6 +533,7 @@ <translation id="3208260410153224535">貴機構已關閉登入功能。新的書籤、密碼等資訊只會儲存在這部裝置上。</translation> <translation id="3213807041830307252">使用相機和相片購物、翻譯及辨識所見內容。</translation> <translation id="3214379938835224220">你已在重設 iPad 時登出,輕觸下方的「繼續」即可登入。</translation> +<translation id="3218296450292600703">登入代管帳戶後,就能將貴機構相關瀏覽資料 (包括分頁、歷史記錄和密碼) 與其他瀏覽資料分開</translation> <translation id="3224075676564434205">分頁會在這部裝置上保持開啟,但群組會從所有已登入 <ph name="USER_EMAIL" /> 的裝置刪除。</translation> <translation id="3224641773458703735">你必須先在裝置上設定螢幕解鎖密碼才能匯出密碼。</translation> <translation id="3227137524299004712">麥克風</translation> @@ -1484,6 +1485,7 @@ <translation id="7102005569666697658">下載中… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">「選單」→「設定」→「付款方式」</translation> <translation id="7108338896283013870">隱藏</translation> +<translation id="7115051913071512405">立即體驗</translation> <translation id="7128693485119315539">貴機構可能需要查看及管理與代管帳戶相關聯的瀏覽資料,例如瀏覽記錄和密碼。</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">無法使用相機</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index 38b9199..e813214 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -1484,6 +1484,7 @@ <translation id="7102005569666697658">Iyalanda… <ph name="FILE_SIZE" /></translation> <translation id="7104701424653979232">Imenyu → Amasethingi → Izindlela zokukhokha</translation> <translation id="7108338896283013870">Fihla</translation> +<translation id="7115051913071512405">Yizame</translation> <translation id="7128693485119315539">Inhlangano yakho kungase kudingeke ibone futhi iphathe idatha yopheqululo exhumene ne-akhawunti yakho ephethwe, njengomlando wokuphequlula kanye namaphasiwedi.</translation> <translation id="713215255510512027"><ph name="FILENAME" /> (<ph name="FILESIZE" />)</translation> <translation id="7136892417564438900">Ikhamera ayitholakali</translation>
diff --git a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm index d0bd000..266cae5 100644 --- a/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm +++ b/ios/chrome/browser/authentication/ui_bundled/authentication_flow/authentication_flow.mm
@@ -138,9 +138,13 @@ signin_metrics::AccessPoint access_point, NSString* gaia_id, PrefService* pref_service, + signin::IdentityManager* identity_manager, policy::ProfileSeparationDataMigrationSettings profileSeparationDataMigrationSettings) { - return access_point != signin_metrics::AccessPoint::kStartPage && + bool isSignedProfile = + identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin); + return !isSignedProfile && + access_point != signin_metrics::AccessPoint::kStartPage && !GetApplicationContext() ->GetAccountProfileMapper() ->IsProfileForGaiaIDFullyInitialized(GaiaId(gaia_id)) && @@ -609,10 +613,14 @@ _profileSeparationDataMigrationSettings == policy::ALWAYS_SEPARATE || ShouldSkipBrowsingDataMigration(_accessPoint, _identityToSignIn.gaiaID, prefService); + + signin::IdentityManager* identityManager = + IdentityManagerFactory::GetForProfile([self originalProfile]); + browsingDataMigrationDisabledByPolicy = IsBrowsingDataMigrationDisabledByPolicy( _accessPoint, _identityToSignIn.gaiaID, prefService, - _profileSeparationDataMigrationSettings); + identityManager, _profileSeparationDataMigrationSettings); // Merge browsing data by default if the data migration screen is shown to // the user and if a policy was set by the admin to merge the browsing data
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 f6d005c6..178ce458 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
@@ -207,11 +207,11 @@ GetManagementState(IdentityManagerFactory::GetForProfile(profile), AuthenticationServiceFactory::GetForProfile(profile), profile->GetPrefs()); - MDCSnackbarMessage* snackbar_title = [[IdentitySnackbarMessage alloc] - initWithName:identity.userGivenName - email:identity.userEmail - avatar:avatar - managed:management_state.is_profile_managed()]; + MDCSnackbarMessage* snackbar_title = + [[IdentitySnackbarMessage alloc] initWithName:identity.userGivenName + email:identity.userEmail + avatar:avatar + managementState:management_state]; CommandDispatcher* dispatcher = browser->GetCommandDispatcher(); id<SnackbarCommands> snackbar_commands_handler = HandlerForProtocol(dispatcher, SnackbarCommands);
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/learn_more_table_view_controller.mm b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/learn_more_table_view_controller.mm index 85b535ec..55b773a 100644 --- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/learn_more_table_view_controller.mm +++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/learn_more_table_view_controller.mm
@@ -25,7 +25,8 @@ namespace { CGFloat constexpr kTableViewSeparatorInsetHide = 10000; CGFloat constexpr kSymbolImagePointSize = 24.; -CGFloat constexpr kTextMarginTop = 6.0; +CGFloat constexpr kTextMarginTop = 8.0; +CGFloat constexpr kTextLabelSpacing = 10.0; // Section identifiers in the browsing data page table view. enum SectionIdentifier : NSInteger { @@ -116,9 +117,14 @@ cell.accessoryType = UITableViewCellAccessoryNone; cell.textLabel.text = title; + cell.textLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; [cell setDetailText:details]; cell.textLayoutConstraintAxis = UILayoutConstraintAxisVertical; [cell setTextLabelMarginTop:kTextMarginTop]; + if (title) { + [cell setTextLabelSpacing:kTextLabelSpacing]; + } cell.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; cell.iconCenteredVertically = NO; cell.detailTextNumberOfLines = 0;
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_consumer.h b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_consumer.h index 276bba3..0d3ecdd4 100644 --- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_consumer.h +++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_consumer.h
@@ -10,6 +10,8 @@ // Handles managed profile creation screen UI updates. @protocol ManagedProfileCreationConsumer <NSObject> +@property(nonatomic, assign) BOOL mergeBrowsingDataByDefault; + @property(nonatomic, assign) BOOL canShowBrowsingDataMigration; @property(nonatomic, assign) BOOL browsingDataMigrationDisabledByPolicy;
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.mm index 88c94f1..cb7d041 100644 --- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.mm +++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_mediator.mm
@@ -16,6 +16,7 @@ @interface ManagedProfileCreationMediator () < IdentityManagerObserverBridgeDelegate> { + BOOL _mergeBrowsingDataByDefault; BOOL _canShowBrowsingDataMigration; BOOL _browsingDataMigrationDisabledByPolicy; NSString* _gaiaID; @@ -56,6 +57,7 @@ !skipBrowsingDataMigration && AreSeparateProfilesForManagedAccountsEnabled() && !identityManager->HasPrimaryAccount(signin::ConsentLevel::kSignin); + _mergeBrowsingDataByDefault = mergeBrowsingDataByDefault; _browsingDataSeparate = !mergeBrowsingDataByDefault; _browsingDataMigrationDisabledByPolicy = browsingDataMigrationDisabledByPolicy; @@ -81,6 +83,7 @@ return; } _consumer = consumer; + _consumer.mergeBrowsingDataByDefault = _mergeBrowsingDataByDefault; _consumer.canShowBrowsingDataMigration = _canShowBrowsingDataMigration; _consumer.browsingDataMigrationDisabledByPolicy = _browsingDataMigrationDisabledByPolicy;
diff --git a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_view_controller.mm b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_view_controller.mm index a300ec7..271feb4 100644 --- a/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_view_controller.mm +++ b/ios/chrome/browser/authentication/ui_bundled/enterprise/managed_profile_creation/managed_profile_creation_view_controller.mm
@@ -48,7 +48,7 @@ NSLayoutConstraint* _tableViewHeightConstraint; UITableViewDiffableDataSource<NSNumber*, NSNumber*>* _dataSource; } - +@synthesize mergeBrowsingDataByDefault; @synthesize canShowBrowsingDataMigration; @synthesize browsingDataMigrationDisabledByPolicy; @@ -77,7 +77,7 @@ self.titleText = l10n_util::GetNSString(IDS_IOS_ENTERPRISE_PROFILE_CREATION_TITLE); - if (self.canShowBrowsingDataMigration) { + if (self.canShowBrowsingDataMigration && mergeBrowsingDataByDefault) { self.subtitleText = [NSString stringWithFormat: @"%@\n\n%@",
diff --git a/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm b/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm index a275042..fa1ff17 100644 --- a/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm +++ b/ios/chrome/browser/authentication/ui_bundled/separate_profiles_egtest.mm
@@ -42,7 +42,7 @@ return grey_accessibilityID(kMergeBrowsingDataCellId); } -id<GREYMatcher> ManagedProfileCreationSubtitleMatcher() { +id<GREYMatcher> ManagedProfileCreationSubtitleMergeByDefaultMatcher() { return grey_accessibilityLabel([NSString stringWithFormat: @"%@\n\n%@", @@ -51,6 +51,11 @@ IDS_IOS_ENTERPRISE_PROFILE_CREATION_ACCOUNT_KEEP_BROWSING_DATA_DESCRIPTION)]); } +id<GREYMatcher> ManagedProfileCreationSubtitleMatcher() { + return grey_accessibilityLabel( + l10n_util::GetNSString(IDS_IOS_ENTERPRISE_PROFILE_CREATION_SUBTITLE)); +} + id<GREYMatcher> ManagedProfileCreationDataMigrationDisabledSubtitleMatcher() { return grey_accessibilityLabel([NSString stringWithFormat: @@ -489,6 +494,10 @@ [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher: ManagedProfileCreationScreenMatcher()]; + // Verifies that the subtitle is the right one. + [[EarlGrey selectElementWithMatcher:ManagedProfileCreationSubtitleMergeByDefaultMatcher()] + assertWithMatcher:grey_sufficientlyVisible()]; + // Open the browsing data management screen. [[EarlGrey selectElementWithMatcher: ManagedProfileCreationBrowsingDataButtonMatcher()]
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.h b/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.h index b4365f5..ffad4e5 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.h +++ b/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.h
@@ -92,6 +92,9 @@ // Sign-in promo view state. kNeverVisible by default. @property(nonatomic, assign) SigninPromoViewState signinPromoViewState; +// YES if the sign-in flow is in progress. +@property(nonatomic, assign, readonly) BOOL signinInProgress; + // YES if the promo spinner should be displayed. Either the sign-in or the // initial sync is in progress. @property(nonatomic, assign, readonly) BOOL showSpinner;
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.mm b/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.mm index 736495a8..d8d7906 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.mm +++ b/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator.mm
@@ -573,8 +573,6 @@ // Redefined to be readwrite. See documentation in the header file. @property(nonatomic, strong, readwrite) id<SystemIdentity> displayedIdentity; -// YES if the sign-in flow is in progress. -@property(nonatomic, assign, readwrite) BOOL signinInProgress; // YES if the initial sync for a specific data type is in progress. The data // type is based on `dataTypeToWaitForInitialSync`. @property(nonatomic, assign, readwrite) BOOL initialSyncInProgress; @@ -894,6 +892,10 @@ } - (void)disconnect { + // While the sign-in is in progress, the UI should be frozen, with the + // exception of the part of the UI used for sign-in. So it should not be + // possible to disconnect the mediator. + CHECK(!self.signinInProgress, base::NotFatalUntil::M145); [self signinPromoViewIsRemoved]; self.consumer = nil; _accountManagerService = nullptr;
diff --git a/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator_unittest.mm b/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator_unittest.mm index 008e03e0..909d38d 100644 --- a/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator_unittest.mm +++ b/ios/chrome/browser/authentication/ui_bundled/signin_promo_view_mediator_unittest.mm
@@ -391,7 +391,7 @@ // identity. void CheckForImageNotification(SigninPromoViewStyle style) { configurator_ = nil; - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); fake_system_identity_manager()->WaitForServiceCallbacksToComplete(); // Check the configurator received by the consumer. @@ -483,7 +483,7 @@ TestSigninPromoWithAccount(SigninPromoViewStyleStandard); // Expect to receive a new configuration from -[Consumer // configureSigninPromoWithConfigurator:identityChanged:]. - ExpectConfiguratorNotification(YES /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/YES); // Forgetting an identity is an asynchronous operation, so we need to wait // before the notification is sent. @@ -524,7 +524,7 @@ // Start sign-in. OCMExpect([signin_presenter_ showSignin:command_arg]); OCMExpect([consumer_ promoProgressStateDidChange]); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); [mediator_ signinPromoViewDidTapSigninWithNewAccount:signin_promo_view_]; EXPECT_TRUE(mediator_.showSpinner); EXPECT_EQ(SigninPromoViewState::kUsedAtLeastOnce, @@ -533,7 +533,7 @@ // Stop sign-in. OCMExpect([consumer_ promoProgressStateDidChange]); OCMExpect([consumer_ signinDidFinish]); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); command.completion(SigninCoordinatorResultSuccess, nil); EXPECT_FALSE(mediator_.showSpinner); EXPECT_EQ(SigninPromoViewState::kUsedAtLeastOnce, @@ -554,7 +554,7 @@ }]; OCMExpect([signin_presenter_ showSignin:command_arg]); OCMExpect([consumer_ promoProgressStateDidChange]); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); // Starts sign-in without identity. [mediator_ signinPromoViewDidTapSigninWithNewAccount:signin_promo_view_]; // Adds an identity while doing sign-in. @@ -564,7 +564,7 @@ // Finishs the sign-in. OCMExpect([consumer_ promoProgressStateDidChange]); OCMExpect([consumer_ signinDidFinish]); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); command.completion(SigninCoordinatorResultSuccess, nil); } @@ -583,7 +583,7 @@ }]; OCMExpect([signin_presenter_ showSignin:command_arg]); OCMExpect([consumer_ promoProgressStateDidChange]); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); // Starts sign-in with an identity. [mediator_ signinPromoViewDidTapPrimaryButtonWithDefaultAccount:signin_promo_view_]; @@ -598,7 +598,7 @@ // Finishs the sign-in. OCMExpect([consumer_ promoProgressStateDidChange]); OCMExpect([consumer_ signinDidFinish]); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); command.completion(SigninCoordinatorResultSuccess, nil); } @@ -629,7 +629,7 @@ GetAuthenticationService()->SignIn(identity_, signin_metrics::AccessPoint::kSigninPromo); CreateMediator(signin_metrics::AccessPoint::kRecentTabs); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); [mediator_ signinPromoViewIsVisible]; EXPECT_EQ(identity_, mediator_.displayedIdentity); fake_system_identity_manager()->WaitForServiceCallbacksToComplete(); @@ -659,10 +659,17 @@ }]; OCMExpect([signin_presenter_ showSignin:command_arg]); OCMExpect([consumer_ promoProgressStateDidChange]); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); // Start sign-in with an identity. [mediator_ signinPromoViewDidTapPrimaryButtonWithDefaultAccount: signin_promo_view_]; + + // Finish the sign-in. + OCMExpect([consumer_ promoProgressStateDidChange]); + ExpectConfiguratorNotification(/*identity_changed=*/NO); + OCMExpect([consumer_ signinDidFinish]); + command.completion(SigninCoordinatorResultInterrupted, nil); + // Remove the sign-in promo. [mediator_ disconnect]; EXPECT_EQ(SigninPromoViewState::kInvalid, mediator_.signinPromoViewState); @@ -676,9 +683,6 @@ [(OCMockObject*)consumer_ clearInvocations]; } EXPECT_EQ(weak_mediator, nil); - // Finish the sign-in. - OCMExpect([consumer_ signinDidFinish]); - command.completion(SigninCoordinatorResultSuccess, nil); } // Tests that the sign-in promo view being removed, and tests the consumer is @@ -696,16 +700,20 @@ }]; OCMExpect([signin_presenter_ showSignin:command_arg]); OCMExpect([consumer_ promoProgressStateDidChange]); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); // Start sign-in with an identity. [mediator_ signinPromoViewDidTapPrimaryButtonWithDefaultAccount:signin_promo_view_]; + + // Finish the sign-in. + OCMExpect([consumer_ promoProgressStateDidChange]); + ExpectConfiguratorNotification(/*identity_changed=*/NO); + OCMExpect([consumer_ signinDidFinish]); + command.completion(SigninCoordinatorResultInterrupted, nil); + // Remove the sign-in promo. [mediator_ disconnect]; EXPECT_EQ(SigninPromoViewState::kInvalid, mediator_.signinPromoViewState); - // Finish the sign-in. - OCMExpect([consumer_ signinDidFinish]); - command.completion(SigninCoordinatorResultSuccess, nil); // Set mediator_ to nil to avoid the TearDown doesn't call // -[mediator_ disconnect] again. mediator_ = nil; @@ -717,9 +725,9 @@ SigninPromoWithSigninWithNoDefaultIdentity) { AddDefaultIdentity(); CreateMediator(signin_metrics::AccessPoint::kRecentTabs); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); [mediator_ signinPromoViewIsVisible]; - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); [mediator_ setSigninPromoAction:SigninPromoAction::kSigninWithNoDefaultIdentity]; EXPECT_EQ(identity_, mediator_.displayedIdentity); @@ -737,9 +745,9 @@ signin_metrics::AccessPoint::kSigninPromo); CreateMediator(signin_metrics::AccessPoint::kBookmarkManager); - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); [mediator_ signinPromoViewIsVisible]; - ExpectConfiguratorNotification(NO /* identity changed */); + ExpectConfiguratorNotification(/*identity_changed=*/NO); [mediator_ setSigninPromoAction:SigninPromoAction::kReviewAccountSettings]; EXPECT_EQ(identity_, mediator_.displayedIdentity); fake_system_identity_manager()->WaitForServiceCallbacksToComplete();
diff --git a/ios/chrome/browser/autofill/ui_bundled/BUILD.gn b/ios/chrome/browser/autofill/ui_bundled/BUILD.gn index 98c473f0..c5aba374 100644 --- a/ios/chrome/browser/autofill/ui_bundled/BUILD.gn +++ b/ios/chrome/browser/autofill/ui_bundled/BUILD.gn
@@ -127,6 +127,7 @@ "//components/autofill/core/browser", "//ios/chrome/browser/autofill/model/message", "//ios/chrome/browser/net/model:crurl", + "//ios/chrome/browser/shared/ui/util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/util", ]
diff --git a/ios/chrome/browser/autofill/ui_bundled/autofill_credit_card_util.mm b/ios/chrome/browser/autofill/ui_bundled/autofill_credit_card_util.mm index a67922e..82a5637 100644 --- a/ios/chrome/browser/autofill/ui_bundled/autofill_credit_card_util.mm +++ b/ios/chrome/browser/autofill/ui_bundled/autofill_credit_card_util.mm
@@ -4,6 +4,8 @@ #import "ios/chrome/browser/autofill/ui_bundled/autofill_credit_card_util.h" +#import <UIKit/UIKit.h> + #import "base/check.h" #import "base/strings/sys_string_conversions.h" #import "components/autofill/core/browser/autofill_type.h" @@ -11,6 +13,7 @@ #import "ios/chrome/browser/autofill/ui_bundled/autofill_credit_card_ui_type.h" #import "ios/chrome/browser/autofill/ui_bundled/autofill_ui_type_util.h" #import "ios/chrome/browser/net/model/crurl.h" +#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/text_view_util.h" @@ -180,9 +183,12 @@ if (!crurl || !crurl.gurl.is_valid()) { return; } - [attributedText addAttribute:NSLinkAttributeName - value:crurl.nsurl - range:rangeValue.rangeValue]; + NSDictionary* linkAttributes = @{ + NSLinkAttributeName : crurl.nsurl, + NSFontAttributeName : PreferredFontForTextStyle(UIFontTextStyleCaption2, + UIFontWeightSemibold) + }; + [attributedText addAttributes:linkAttributes range:rangeValue.rangeValue]; }]; } return attributedText;
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmark_promo_controller.h b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmark_promo_controller.h index b59dd91..d6663595 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmark_promo_controller.h +++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmark_promo_controller.h
@@ -45,6 +45,8 @@ @property(nonatomic, readonly) SigninPromoViewMediator* signinPromoViewMediator; +@property(nonatomic, readonly) BOOL signinInProgress; + // See `-[BookmarkPromoController initWithBrowser:delegate:presenter: // baseViewController:]`. - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmark_promo_controller.mm b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmark_promo_controller.mm index 4df4b11..a220aba 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmark_promo_controller.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmark_promo_controller.mm
@@ -145,6 +145,12 @@ self.shouldShowSigninPromo = YES; } +#pragma mark - Property + +- (BOOL)signinInProgress { + return _signinPromoViewMediator.signinInProgress; +} + #pragma mark - IdentityManagerObserverBridgeDelegate // Called when a user changes the syncing state.
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.h b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.h index 93d42802..71b5dc15 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.h +++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.h
@@ -108,6 +108,9 @@ // Stops mediating and disconnects from backend models. - (void)disconnect; +// Whether the view can be dismissed. +- (BOOL)canDismiss; + // Rebuilds the table view model data for the Bookmarks section. Deletes any // existing data first. - (void)computeBookmarkTableViewData;
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.mm b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.mm index 292d64d..37a055d0 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_mediator.mm
@@ -211,6 +211,13 @@ DCHECK(!_bookmarkPromoController); } +- (BOOL)canDismiss { + // While sign-in is in progress, the UI should be frozen. + // The promo manager is in charge of displaying the activity overlay, but + // we’re still in charge of stopping dismiss from occurring. + return !_bookmarkPromoController.signinInProgress; +} + #pragma mark - Initial Model Setup // Computes the bookmarks table view based on the currently displayed node.
diff --git a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_view_controller.mm b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_view_controller.mm index a383370..9d4dad45 100644 --- a/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_view_controller.mm +++ b/ios/chrome/browser/bookmarks/ui_bundled/home/bookmarks_home_view_controller.mm
@@ -294,6 +294,9 @@ } - (BOOL)canDismiss { + if (self.mediator && ![self.mediator canDismiss]) { + return NO; + } if (self.folderChooserCoordinator && ![self.folderChooserCoordinator canDismiss]) { return NO;
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 5e91e11..eb847884 100644 --- a/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm +++ b/ios/chrome/browser/browser_view/ui_bundled/browser_coordinator.mm
@@ -898,11 +898,10 @@ [self dismissLensPromo]; [self dismissEnhancedSafeBrowsingPromo]; - - [self dismissAccountMenu]; [self dismissAutoDeletionActionSheet]; [self cancelCollaborationFlows]; + [self.NTPCoordinator clearPresentedState]; [self.viewController clearPresentedStateWithCompletion:completion dismissOmnibox:dismissOmnibox]; @@ -1004,13 +1003,6 @@ self.passwordSettingsCoordinator = nil; } -// Dismisses the account menu. -- (void)dismissAccountMenu { - if (!_NTPCoordinator) { - return; - } -} - - (void)setWebUsageEnabled:(BOOL)webUsageEnabled { if (!self.profile || !self.started) { return;
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/BUILD.gn index 7f642a7..adda704 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/BUILD.gn +++ b/ios/chrome/browser/content_suggestions/ui_bundled/BUILD.gn
@@ -43,6 +43,7 @@ "//ios/chrome/app/profile", "//ios/chrome/app/strings", "//ios/chrome/browser/authentication/ui_bundled/signin:constants", + "//ios/chrome/browser/authentication/ui_bundled/signin:signin_headers", "//ios/chrome/browser/bookmarks/model", "//ios/chrome/browser/commerce/model:shopping_service", "//ios/chrome/browser/commerce/model/push_notification",
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/DEPS b/ios/chrome/browser/content_suggestions/ui_bundled/DEPS index d0d0060..b97c547 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/DEPS +++ b/ios/chrome/browser/content_suggestions/ui_bundled/DEPS
@@ -64,4 +64,5 @@ "+ios/chrome/browser/tips_notifications/ui", "+ios/chrome/browser/content_notification/model/content_notification_util.h", "+ios/chrome/browser/page_image/model/page_image_service_factory.h", + "+ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.h", ]
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.h b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.h index 3a0922f4..0e0b839f 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.h +++ b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.h
@@ -51,6 +51,9 @@ // Refreshes the contents owned by this coordinator. - (void)refresh; +// Stops child coordinators presenting UI. +- (void)clearPresentedState; + @end #endif // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_CONTENT_SUGGESTIONS_COORDINATOR_H_
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.mm b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.mm index e9ecf92..d132d25 100644 --- a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.mm +++ b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.mm
@@ -36,6 +36,7 @@ #import "ios/chrome/app/profile/profile_state.h" #import "ios/chrome/app/tests_hook.h" #import "ios/chrome/browser/authentication/ui_bundled/signin/signin_constants.h" +#import "ios/chrome/browser/authentication/ui_bundled/signin/signin_coordinator.h" #import "ios/chrome/browser/bookmarks/model/bookmark_model_factory.h" #import "ios/chrome/browser/commerce/model/push_notification/push_notification_feature.h" #import "ios/chrome/browser/commerce/model/shopping_service_factory.h" @@ -254,7 +255,7 @@ PriceTrackingPromoMediator* _priceTrackingPromoMediator; ShopCardMediator* _shopCardMediator; SendTabPromoMediator* _sendTabPromoMediator; - + SigninCoordinator* _signinCoordinator; MagicStackCollectionViewController* _magicStackCollectionView; raw_ptr<segmentation_platform::SegmentationPlatformService> @@ -565,10 +566,7 @@ self.contentSuggestionsMetricsRecorder = nil; self.contentSuggestionsViewController.audience = nil; self.contentSuggestionsViewController = nil; - [_defaultBrowserPromoCoordinator stop]; - _defaultBrowserPromoCoordinator = nil; - [_notificationsOptInAlertCoordinator stop]; - _notificationsOptInAlertCoordinator = nil; + [self clearPresentedState]; [self.browser->GetCommandDispatcher() stopDispatchingForProtocol:@protocol(ContentSuggestionsCommands)]; _started = NO; @@ -578,6 +576,14 @@ return self.contentSuggestionsViewController; } +- (void)clearPresentedState { + [_defaultBrowserPromoCoordinator stop]; + _defaultBrowserPromoCoordinator = nil; + [_notificationsOptInAlertCoordinator stop]; + _notificationsOptInAlertCoordinator = nil; + [self stopSigninCoordinator]; +} + #pragma mark - Public methods - (void)refresh { @@ -1185,14 +1191,10 @@ // Shows the SigninSync UI with the SetUpList access point. - (void)showSignIn { + __weak __typeof(self) weakSelf = self; SigninCoordinatorCompletionCallback completion = ^(SigninCoordinatorResult result, id<SystemIdentity> completionIdentity) { - if (result == SigninCoordinatorResultSuccess || - result == SigninCoordinatorResultCanceledByUser) { - PrefService* localState = GetApplicationContext()->GetLocalState(); - set_up_list_prefs::MarkItemComplete(localState, - SetUpListItemType::kSignInSync); - } + [weakSelf signinCoordinatiorCompletionWithResult:result]; }; // If there are 0 identities, kInstantSignin requires less taps. AuthenticationOperation operation = @@ -1205,9 +1207,28 @@ promoAction:signin_metrics::PromoAction:: PROMO_ACTION_NO_SIGNIN_PROMO completion:completion]; - [HandlerForProtocol(self.browser->GetCommandDispatcher(), ApplicationCommands) - showSignin:command - baseViewController:self.magicStackCollectionView]; + _signinCoordinator = + [SigninCoordinator signinCoordinatorWithCommand:command + browser:self.browser + baseViewController:self.viewController]; + [_signinCoordinator start]; +} + +// Stops the SigninCoordinator. +- (void)stopSigninCoordinator { + [_signinCoordinator stop]; + _signinCoordinator = nil; +} + +// Callback for the SigninCoordinator. +- (void)signinCoordinatiorCompletionWithResult:(SigninCoordinatorResult)result { + [self stopSigninCoordinator]; + if (result == SigninCoordinatorResultSuccess || + result == SigninCoordinatorResultCanceledByUser) { + PrefService* localState = GetApplicationContext()->GetLocalState(); + set_up_list_prefs::MarkItemComplete(localState, + SetUpListItemType::kSignInSync); + } } // Shows the Credential Provider Promo using the SetUpList trigger.
diff --git a/ios/chrome/browser/intelligence/glic/ui/BUILD.gn b/ios/chrome/browser/intelligence/glic/ui/BUILD.gn index eb111a6..ed8cefb 100644 --- a/ios/chrome/browser/intelligence/glic/ui/BUILD.gn +++ b/ios/chrome/browser/intelligence/glic/ui/BUILD.gn
@@ -13,7 +13,7 @@ "glic_promo_display_handler.mm", "glic_promo_view_controller.h", "glic_promo_view_controller.mm", - "glic_view_controller_delegate.h", + "glic_promo_view_controller_delegate.h", ] deps = [ ":constants", @@ -27,6 +27,7 @@ "//ios/chrome/browser/shared/ui/util", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/promo_style", + "//ios/chrome/common/ui/util", ] frameworks = [ "UIKit.framework" ] }
diff --git a/ios/chrome/browser/intelligence/glic/ui/glic_consent_view_controller.mm b/ios/chrome/browser/intelligence/glic/ui/glic_consent_view_controller.mm index 9f7c2e9..9ff245ec2 100644 --- a/ios/chrome/browser/intelligence/glic/ui/glic_consent_view_controller.mm +++ b/ios/chrome/browser/intelligence/glic/ui/glic_consent_view_controller.mm
@@ -7,17 +7,39 @@ #import "ios/chrome/browser/intelligence/glic/ui/glic_consent_mutator.h" #import "ios/chrome/browser/intelligence/glic/ui/glic_constants.h" #import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/promo_style/promo_style_view_controller_delegate.h" +#import "ios/chrome/common/ui/util/constraints_ui_util.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util_mac.h" namespace { -// Stack view insets and spacing. -const CGFloat kGLICConsentMainStackHorizontalInset = 20.0; -const CGFloat kGLICConsentMainStackTopInset = 24.0; -const CGFloat kGLICConsentMainStackSpacing = 16.0; +// Main Stack view insets and spacing. +const CGFloat kMainStackHorizontalInset = 20.0; +const CGFloat kMainStackTopInset = 24.0; +const CGFloat kMainStackSpacing = 16.0; + +// Icons size and names. +const CGFloat kIconSize = 16.0; +// TODO(crbug.com/414777888): Change info circle fill icon to page spark icon. +constexpr NSString* const kInfoIconName = @"info.circle.fill"; +constexpr NSString* const kClockIconName = + @"clock.arrow.trianglehead.counterclockwise.rotate.90"; +const CGFloat kIconImageViewTopPadding = 18.0; +const CGFloat kIconImageViewWidth = 32.0; + +// Boxes stack view traits. +const CGFloat kBoxesStackViewSpacing = 2.0; +const CGFloat kBoxesStackViewCornerRadius = 16.0; + +// Inner stack view spacing and padding. +const CGFloat kInnerStackViewSpacing = 6.0; +const CGFloat kInnerStackViewPadding = 12.0; + +// Line height multiple. +const CGFloat kLineHeightMultiple = 18.0 / 14.0; } // namespace @@ -44,7 +66,8 @@ // Configure all the stacks. - (void)setupStackView { [self configureMainStackView]; - [_mainStackView addArrangedSubview:[self createSubtextLabel]]; + [_mainStackView addArrangedSubview:[self createBoxesStackView]]; + [_mainStackView addArrangedSubview:[self createFootNoteLabel]]; } // Configure promo style properties to add buttons. Ignores header image type. @@ -65,7 +88,7 @@ _mainStackView.axis = UILayoutConstraintAxisVertical; _mainStackView.distribution = UIStackViewDistributionFill; _mainStackView.alignment = UIStackViewAlignmentFill; - _mainStackView.spacing = kGLICConsentMainStackSpacing; + _mainStackView.spacing = kMainStackSpacing; _mainStackView.translatesAutoresizingMaskIntoConstraints = NO; @@ -74,27 +97,153 @@ [NSLayoutConstraint activateConstraints:@[ [_mainStackView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor - constant:kGLICConsentMainStackHorizontalInset], + constant:kMainStackHorizontalInset], [_mainStackView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor - constant:-kGLICConsentMainStackHorizontalInset], + constant:-kMainStackHorizontalInset], [_mainStackView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor - constant:kGLICConsentMainStackTopInset], + constant:kMainStackTopInset], [_mainStackView.bottomAnchor constraintLessThanOrEqualToAnchor:self.view.safeAreaLayoutGuide .bottomAnchor] ]]; } -// Create the subtext label. -- (UILabel*)createSubtextLabel { - UILabel* subText = [[UILabel alloc] init]; - subText.text = kGLIConsentSubText; - subText.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]; - subText.numberOfLines = 2; - subText.textAlignment = NSTextAlignmentCenter; - return subText; +// Create the 2 horizontal boxes stack view. +- (UIStackView*)createBoxesStackView { + UIStackView* boxesStackView = [[UIStackView alloc] init]; + boxesStackView.axis = UILayoutConstraintAxisVertical; + boxesStackView.distribution = UIStackViewDistributionFill; + boxesStackView.alignment = UIStackViewAlignmentFill; + boxesStackView.spacing = kBoxesStackViewSpacing; + boxesStackView.layer.cornerRadius = kBoxesStackViewCornerRadius; + boxesStackView.clipsToBounds = YES; + boxesStackView.translatesAutoresizingMaskIntoConstraints = NO; + + UIView* box1 = [self + createHorizontalBoxWithIcon:kInfoIconName + boxView: + [self + createBoxWithTitle: + kGLICConsentFirstBoxTitleText + bodyText: + kGLICConsentFirstBoxBodyText]]; + [boxesStackView addArrangedSubview:box1]; + + UIView* box2 = [self + createHorizontalBoxWithIcon:kClockIconName + boxView: + [self + createBoxWithTitle: + kGLICConsentSecondBoxTitleText + bodyText: + kGLICConsentSecondBoxBodyText]]; + [boxesStackView addArrangedSubview:box2]; + return boxesStackView; +} + +// Create horizontal stack view with icon and box view. +- (UIView*)createHorizontalBoxWithIcon:(NSString*)iconName + boxView:(UIView*)boxView { + UIStackView* horizontalStackView = [[UIStackView alloc] init]; + horizontalStackView.axis = UILayoutConstraintAxisHorizontal; + horizontalStackView.distribution = UIStackViewDistributionFillProportionally; + horizontalStackView.alignment = UIStackViewAlignmentTop; + horizontalStackView.translatesAutoresizingMaskIntoConstraints = NO; + horizontalStackView.backgroundColor = [UIColor colorNamed:kGrey100Color]; + + UIImageSymbolConfiguration* config = [UIImageSymbolConfiguration + configurationWithPointSize:kIconSize + weight:UIImageSymbolWeightRegular]; + + UIImageView* iconImageView = [[UIImageView alloc] + initWithImage:DefaultSymbolWithConfiguration(iconName, config)]; + iconImageView.translatesAutoresizingMaskIntoConstraints = NO; + [NSLayoutConstraint activateConstraints:@[ + [iconImageView.widthAnchor constraintEqualToConstant:kIconSize], + [iconImageView.heightAnchor constraintEqualToConstant:kIconSize] + ]]; + + UIView* iconContainerView = [[UIView alloc] init]; + iconContainerView.translatesAutoresizingMaskIntoConstraints = NO; + [iconContainerView addSubview:iconImageView]; + [horizontalStackView addArrangedSubview:iconContainerView]; + + [NSLayoutConstraint activateConstraints:@[ + [iconImageView.centerXAnchor + constraintEqualToAnchor:iconContainerView.centerXAnchor], + [iconImageView.topAnchor constraintEqualToAnchor:iconContainerView.topAnchor + constant:kIconImageViewTopPadding], + [iconContainerView.widthAnchor + constraintEqualToAnchor:iconImageView.widthAnchor + constant:kIconImageViewWidth], + ]]; + + [horizontalStackView addArrangedSubview:boxView]; + + return horizontalStackView; +} + +// Create the bow view containing the text and the title. +- (UIView*)createBoxWithTitle:(NSString*)titleText + bodyText:(NSString*)bodyText { + UIView* boxView = [[UIView alloc] init]; + boxView.translatesAutoresizingMaskIntoConstraints = NO; + + UIStackView* innerStackView = [[UIStackView alloc] init]; + innerStackView.axis = UILayoutConstraintAxisVertical; + innerStackView.distribution = UIStackViewDistributionFill; + innerStackView.alignment = UIStackViewAlignmentLeading; + innerStackView.spacing = kInnerStackViewSpacing; + + innerStackView.translatesAutoresizingMaskIntoConstraints = NO; + [boxView addSubview:innerStackView]; + + CGFloat innerPadding = kInnerStackViewPadding; + AddSameConstraintsWithInsets( + innerStackView, boxView, + NSDirectionalEdgeInsetsMake(innerPadding, innerPadding, innerPadding, + innerPadding)); + + UILabel* titleLabel = [[UILabel alloc] init]; + titleLabel.text = titleText; + titleLabel.font = PreferredFontForTextStyle(UIFontTextStyleTitle3, + UIFontWeightSemibold, 14); + + NSMutableAttributedString* attributedText = + [[NSMutableAttributedString alloc] initWithString:titleText]; + NSMutableParagraphStyle* paragraphStyle = + [[NSMutableParagraphStyle alloc] init]; + paragraphStyle.lineHeightMultiple = kLineHeightMultiple; + [attributedText addAttribute:NSParagraphStyleAttributeName + value:paragraphStyle + range:NSMakeRange(0, [titleText length])]; + titleLabel.attributedText = attributedText; + titleLabel.adjustsFontForContentSizeCategory = YES; + titleLabel.numberOfLines = 0; + [innerStackView addArrangedSubview:titleLabel]; + + UILabel* bodyLabel = [[UILabel alloc] init]; + bodyLabel.text = bodyText; + bodyLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; + bodyLabel.adjustsFontForContentSizeCategory = YES; + bodyLabel.numberOfLines = 0; + bodyLabel.textColor = [UIColor colorNamed:kGrey700Color]; + [innerStackView addArrangedSubview:bodyLabel]; + + return boxView; +} + +// Create the foot note label. +- (UILabel*)createFootNoteLabel { + UILabel* footNoteLabel = [[UILabel alloc] init]; + footNoteLabel.text = kGLICConsentFootNoteText; + footNoteLabel.font = + [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]; + footNoteLabel.numberOfLines = 2; + footNoteLabel.textAlignment = NSTextAlignmentCenter; + return footNoteLabel; } #pragma mark - PromoStyleViewControllerDelegate
diff --git a/ios/chrome/browser/intelligence/glic/ui/glic_constants.h b/ios/chrome/browser/intelligence/glic/ui/glic_constants.h index 9617fc8..832797043 100644 --- a/ios/chrome/browser/intelligence/glic/ui/glic_constants.h +++ b/ios/chrome/browser/intelligence/glic/ui/glic_constants.h
@@ -9,8 +9,8 @@ #import <UIKit/UIKit.h> // Sheet detents. -extern NSString* const kGLICConsentPartialDetentIdentifier; -extern NSString* const kGLICConsentFullDetentIdentifier; +extern NSString* const kGLICPromoConsentPartialDetentIdentifier; +extern NSString* const kGLICPromoConsentFullDetentIdentifier; // Promo style strings. extern NSString* const kGLICPromoPrimaryAction; @@ -19,6 +19,12 @@ // Text constants. extern NSString* const kGLICPromoMainTitleText; -extern NSString* const kGLIConsentSubText; +extern NSString* const kGLICPromoSubTitleText; + +extern NSString* const kGLICConsentFirstBoxTitleText; +extern NSString* const kGLICConsentFirstBoxBodyText; +extern NSString* const kGLICConsentSecondBoxTitleText; +extern NSString* const kGLICConsentSecondBoxBodyText; +extern NSString* const kGLICConsentFootNoteText; #endif // IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_UI_GLIC_CONSTANTS_H_
diff --git a/ios/chrome/browser/intelligence/glic/ui/glic_constants.mm b/ios/chrome/browser/intelligence/glic/ui/glic_constants.mm index 17c39fb8..1faf3e1 100644 --- a/ios/chrome/browser/intelligence/glic/ui/glic_constants.mm +++ b/ios/chrome/browser/intelligence/glic/ui/glic_constants.mm
@@ -4,16 +4,28 @@ #import "ios/chrome/browser/intelligence/glic/ui/glic_constants.h" -NSString* const kGLICConsentPartialDetentIdentifier = +NSString* const kGLICPromoConsentPartialDetentIdentifier = @"GLICConsentPartialDetentIdentifier"; -NSString* const kGLICConsentFullDetentIdentifier = +NSString* const kGLICPromoConsentFullDetentIdentifier = @"GLICConsentFullDetentIdentifier"; NSString* const kGLICPromoPrimaryAction = @"Try it out"; NSString* const kGLICConsentPrimaryAction = @"Yes, I'm in"; NSString* const kGLICPromoConsentSecondaryAction = @"No thanks"; -NSString* const kGLIConsentSubText = +NSString* const kGLICPromoMainTitleText = @"Lorem ipsum dolor sit amet."; +NSString* const kGLICPromoSubTitleText = + @"Lorem ipsum dolor sit amet, consecte tur adipiscing purposes. Sed do."; + +NSString* const kGLICConsentFirstBoxTitleText = @"Lorem ipsum dolor sit amet, consecte tur adipiscing elit."; -NSString* const kGLICPromoMainTitleText = - @"Lorem ipsum dolor sit amet, consecte tur adipiscing purposes."; +NSString* const kGLICConsentFirstBoxBodyText = + @"Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut " + @"enim ad minim."; +NSString* const kGLICConsentSecondBoxTitleText = @"Lorem ipsum dolor sit amet"; +NSString* const kGLICConsentSecondBoxBodyText = + @"Lorem ipsum dolor sit amet, consecte tur adipiscing purposes. Sed do " + @"eiusmod tempor incididunt ut labore et dolore magna ali. eiusmod tempor " + @"incididunt ut labore et dolore magna ali."; +NSString* const kGLICConsentFootNoteText = + @"Lorem ipsum dolor sit amet, consecte tur adipiscing elit.";
diff --git a/ios/chrome/browser/intelligence/glic/ui/glic_navigation_controller.mm b/ios/chrome/browser/intelligence/glic/ui/glic_navigation_controller.mm index 3f38b989..f2ec89d 100644 --- a/ios/chrome/browser/intelligence/glic/ui/glic_navigation_controller.mm +++ b/ios/chrome/browser/intelligence/glic/ui/glic_navigation_controller.mm
@@ -8,20 +8,23 @@ #import "ios/chrome/browser/intelligence/glic/ui/glic_consent_view_controller.h" #import "ios/chrome/browser/intelligence/glic/ui/glic_constants.h" #import "ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.h" -#import "ios/chrome/browser/intelligence/glic/ui/glic_view_controller_delegate.h" +#import "ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller_delegate.h" #import "ios/chrome/browser/shared/ui/symbols/symbols.h" namespace { // Sheet detents. -const CGFloat kGLICConsentPartialDetentHeight = 500.0; -const CGFloat kGLICConsentFullDetentHeight = 700.0; +const CGFloat kPartialDetentHeight = 500.0; +const CGFloat kFullDetentHeight = 700.0; // Corner radius. -const CGFloat kGLICConsentPreferredCornerRadius = 16.0; +const CGFloat kPreferredCornerRadius = 16.0; -// Logo size. -const CGFloat kLogoPointSize = 44; +// Logos size, spacing. +const CGFloat kLogoPointSize = 44.0; +const CGFloat kPromoLogoSpacing = 8.0; +const CGFloat kPromoLogoTopGap = 16.0; +const CGFloat kPromoLogoBottomGap = -16.0; // Logo names. constexpr NSString* const kSwiftLogoName = @"swift"; @@ -29,7 +32,7 @@ } // namespace -@interface GLICNavigationController () <GLICConsentViewControllerDelegate> +@interface GLICNavigationController () <GLICPromoViewControllerDelegate> @end @@ -41,12 +44,13 @@ #pragma mark - UIViewController - (void)viewDidLoad { + [self configureNavigationController]; [super viewDidLoad]; _promoViewController = [[GLICPromoViewController alloc] init]; - _promoViewController.glicConsentDelegate = self; + _promoViewController.glicPromoDelegate = self; _promoViewController.mutator = self.mutator; [self pushViewController:_promoViewController animated:NO]; - [self configureNavigationController]; + [self createLogos]; } #pragma mark - Private @@ -68,20 +72,19 @@ // Configure the navigation controller. - (void)configureNavigationController { self.sheetPresentationController.detents = @[ - [self customHeightDetentWithIdentifier:kGLICConsentPartialDetentIdentifier - height:kGLICConsentPartialDetentHeight], - [self customHeightDetentWithIdentifier:kGLICConsentFullDetentIdentifier - height:kGLICConsentFullDetentHeight] + [self customHeightDetentWithIdentifier: + kGLICPromoConsentPartialDetentIdentifier + height:kPartialDetentHeight], + [self customHeightDetentWithIdentifier:kGLICPromoConsentFullDetentIdentifier + height:kFullDetentHeight] ]; self.modalPresentationStyle = UIModalPresentationPageSheet; self.sheetPresentationController.preferredCornerRadius = - kGLICConsentPreferredCornerRadius; + kPreferredCornerRadius; self.sheetPresentationController.prefersScrollingExpandsWhenScrolledToEdge = NO; - - [self createLogos]; } // Create logos and add it to the navigation bar. @@ -90,7 +93,7 @@ logosStackView.axis = UILayoutConstraintAxisHorizontal; logosStackView.distribution = UIStackViewDistributionFill; logosStackView.alignment = UIStackViewAlignmentCenter; - logosStackView.spacing = 8; + logosStackView.spacing = kPromoLogoSpacing; logosStackView.translatesAutoresizingMaskIntoConstraints = NO; // TODO(crbug.com/414777888): Change logo. @@ -116,11 +119,14 @@ constraintEqualToAnchor:self.navigationBar.centerXAnchor], [logosStackView.topAnchor constraintEqualToAnchor:self.navigationBar.topAnchor - constant:32] + constant:kPromoLogoTopGap], + [logosStackView.bottomAnchor + constraintEqualToAnchor:self.navigationBar.bottomAnchor + constant:-kPromoLogoBottomGap], ]]; } -#pragma mark - GLICConsentViewControllerDelegate +#pragma mark - GLICPromoViewControllerDelegate - (void)didAcceptPromo { _consentViewController = [[GLICConsentViewController alloc] init];
diff --git a/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.h b/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.h index ec5f8e5..a92267a 100644 --- a/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.h +++ b/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.h
@@ -10,7 +10,7 @@ #import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h" @protocol GLICConsentMutator; -@protocol GLICConsentViewControllerDelegate; +@protocol GLICPromoViewControllerDelegate; // GLIC consent View Controller. @interface GLICPromoViewController : PromoStyleViewController @@ -19,8 +19,8 @@ @property(nonatomic, weak) id<GLICConsentMutator> mutator; // The delegate for this view controller to communicate to the GLIC // NavigationController. -@property(nonatomic, weak) id<GLICConsentViewControllerDelegate> - glicConsentDelegate; +@property(nonatomic, weak) id<GLICPromoViewControllerDelegate> + glicPromoDelegate; @end
diff --git a/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.mm b/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.mm index a01bd7a..11b3693 100644 --- a/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.mm +++ b/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller.mm
@@ -6,7 +6,7 @@ #import "ios/chrome/browser/intelligence/glic/ui/glic_consent_mutator.h" #import "ios/chrome/browser/intelligence/glic/ui/glic_constants.h" -#import "ios/chrome/browser/intelligence/glic/ui/glic_view_controller_delegate.h" +#import "ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller_delegate.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/promo_style/promo_style_view_controller_delegate.h" #import "ios/chrome/grit/ios_strings.h" @@ -17,10 +17,11 @@ // Stack view insets and spacing. const CGFloat kGLICConsentMainStackHorizontalInset = 20.0; const CGFloat kGLICConsentMainStackTopInset = 24.0; -const CGFloat kGLICConsentMainStackSpacing = 16.0; +const CGFloat kGLICConsentMainStackSpacing = 5.0; -// Spacing the title label. +// Spacing the title labels. const CGFloat kMainTitleLabelSpacing = 8.0; +const CGFloat kSubTitleLabelSpacing = 12.0; } // namespace @@ -38,6 +39,7 @@ [self configurePromoStyleProperties]; [self configureMainStackView]; [_mainStackView addArrangedSubview:[self createMainTitle]]; + [_mainStackView addArrangedSubview:[self createSubTitle]]; [super viewDidLoad]; } @@ -87,7 +89,6 @@ - (UIView*)createMainTitle { UILabel* mainTitleLabel = [[UILabel alloc] init]; mainTitleLabel.text = kGLICPromoMainTitleText; - mainTitleLabel.numberOfLines = 2; mainTitleLabel.textAlignment = NSTextAlignmentCenter; mainTitleLabel.adjustsFontSizeToFitWidth = YES; mainTitleLabel.translatesAutoresizingMaskIntoConstraints = NO; @@ -113,10 +114,37 @@ return titleContainer; } +// Create a view containing the sub title label. +- (UIView*)createSubTitle { + UILabel* subTitleLabel = [[UILabel alloc] init]; + subTitleLabel.text = kGLICPromoSubTitleText; + subTitleLabel.numberOfLines = 2; + subTitleLabel.textAlignment = NSTextAlignmentCenter; + subTitleLabel.adjustsFontSizeToFitWidth = YES; + subTitleLabel.translatesAutoresizingMaskIntoConstraints = NO; + + subTitleLabel.font = PreferredFontForTextStyle(UIFontTextStyleTitle3, + UIFontWeightRegular, 15.0); + + UIView* subTitleContainer = [[UIView alloc] init]; + subTitleContainer.translatesAutoresizingMaskIntoConstraints = NO; + [subTitleContainer addSubview:subTitleLabel]; + + [NSLayoutConstraint activateConstraints:@[ + [subTitleLabel.leadingAnchor + constraintEqualToAnchor:subTitleContainer.leadingAnchor + constant:kSubTitleLabelSpacing], + [subTitleLabel.trailingAnchor + constraintEqualToAnchor:subTitleContainer.trailingAnchor + constant:-kSubTitleLabelSpacing] + ]]; + return subTitleLabel; +} + #pragma mark - PromoStyleViewControllerDelegate - (void)didTapPrimaryActionButton { - [self.glicConsentDelegate didAcceptPromo]; + [self.glicPromoDelegate didAcceptPromo]; } - (void)didTapSecondaryActionButton {
diff --git a/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller_delegate.h b/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller_delegate.h new file mode 100644 index 0000000..938e0671 --- /dev/null +++ b/ios/chrome/browser/intelligence/glic/ui/glic_promo_view_controller_delegate.h
@@ -0,0 +1,19 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_UI_GLIC_PROMO_VIEW_CONTROLLER_DELEGATE_H_ +#define IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_UI_GLIC_PROMO_VIEW_CONTROLLER_DELEGATE_H_ + +#import <Foundation/Foundation.h> + +// Declare the delegate protocol to communicate between the GLIC Promo VC and +// the GLIC NavigationController. +@protocol GLICPromoViewControllerDelegate <NSObject> + +// Did accept the GLIC Promo. +- (void)didAcceptPromo; + +@end + +#endif // IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_UI_GLIC_PROMO_VIEW_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/intelligence/glic/ui/glic_view_controller_delegate.h b/ios/chrome/browser/intelligence/glic/ui/glic_view_controller_delegate.h deleted file mode 100644 index 6175435c..0000000 --- a/ios/chrome/browser/intelligence/glic/ui/glic_view_controller_delegate.h +++ /dev/null
@@ -1,21 +0,0 @@ -// 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_INTELLIGENCE_GLIC_UI_GLIC_VIEW_CONTROLLER_DELEGATE_H_ -#define IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_UI_GLIC_VIEW_CONTROLLER_DELEGATE_H_ - -#import <Foundation/Foundation.h> - -@class GLICConsentViewController; - -// Declare the delegate protocol to communicate between the GLIC Consent VC and -// the GLIC NavigationController. -@protocol GLICConsentViewControllerDelegate <NSObject> - -// Did accept the GLIC Promo. -- (void)didAcceptPromo; - -@end - -#endif // IOS_CHROME_BROWSER_INTELLIGENCE_GLIC_UI_GLIC_VIEW_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.h index e1ff84a..3f5134e 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.h +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.h
@@ -108,6 +108,9 @@ // Returns `YES` if the feed is currently visible on the NTP. - (BOOL)isFeedVisible; +// Dismisses all presented views owned by the NTP. +- (void)clearPresentedState; + @end #endif // IOS_CHROME_BROWSER_NTP_UI_BUNDLED_NEW_TAB_PAGE_COORDINATOR_H_
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm index 4cab199..d38dfba 100644 --- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm +++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_coordinator.mm
@@ -432,9 +432,7 @@ _discoverFeedObserverBridge.reset(); _identityObserverBridge.reset(); _authServiceObserverBridge.reset(); - - [_sharingCoordinator stop]; - _sharingCoordinator = nil; + [self clearPresentedState]; [_customizationCoordinator stop]; _customizationCoordinator = nil; @@ -579,6 +577,13 @@ return self.NTPMediator.feedHeaderVisible && self.feedViewController; } +- (void)clearPresentedState { + [self.contentSuggestionsCoordinator clearPresentedState]; + [self stopSharingCoordinator]; + [self stopAccountMenuCoordinator]; + [self stopSigninCoordinator]; +} + #pragma mark - Setters - (void)setSelectedFeed:(FeedType)selectedFeed { @@ -1545,6 +1550,11 @@ #pragma mark - Private +- (void)stopSharingCoordinator { + [_sharingCoordinator stop]; + _sharingCoordinator = nil; +} + - (void)stopAccountMenuCoordinator { [_accountMenuCoordinator stop]; _accountMenuCoordinator.delegate = nil;
diff --git a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h index 1d8d1d5..c45e2a50 100644 --- a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h +++ b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.h
@@ -170,9 +170,8 @@ // Clears additional text. void ClearAdditionalText(); - // Called when the view is gaining focus. `control_down` is whether the - // control key is down (at the time we're gaining focus). - void OnSetFocus(bool control_down); + // Called when the view is gaining focus. + void OnSetFocus(); // Starts a request for zero-prefix suggestions if no query is currently // running and the popup is closed. This can be called multiple times without @@ -192,20 +191,12 @@ // switching tabs. void SetCaretVisibility(bool visible); - // If the ctrl key is down, marks it as consumed to prevent it from triggering - // ctrl-enter behavior unless it is released and re-pressed. - void ConsumeCtrlKey(); - // Sent before `OnKillFocus` and before the popup is closed. void OnWillKillFocus(); // Called when the view is losing focus. Resets some state. void OnKillFocus(); - // Called when the user presses or releases the control key. Changes state as - // necessary. - void OnControlKeyChanged(bool pressed); - // Called when the user pastes in text. void OnPaste(); @@ -293,10 +284,6 @@ private: friend class OmniboxControllerIOSTest; friend class TestOmniboxEditModelIOS; - FRIEND_TEST_ALL_PREFIXES(OmniboxEditModelIOSTest, ConsumeCtrlKey); - FRIEND_TEST_ALL_PREFIXES(OmniboxEditModelIOSTest, - ConsumeCtrlKeyOnRequestFocus); - FRIEND_TEST_ALL_PREFIXES(OmniboxEditModelIOSTest, ConsumeCtrlKeyOnCtrlAction); enum PasteState { NONE, // Most recent edit was not a paste. @@ -309,17 +296,6 @@ PASTED, // Most recent edit was a paste. }; - enum ControlKeyState { - UP, // The control key is not depressed. - DOWN, // The control key is depressed and should trigger the - // "ctrl-enter" behavior when the user hits enter. - DOWN_AND_CONSUMED // The control key is depressed, but has been consumed - // and should not trigger the "ctrl-enter" behavior. - // The control key becomes consumed if it has been used - // for another action such as focusing the location bar - // with ctrl-l or copying the selected text with ctrl-c. - }; - AutocompleteController* autocomplete_controller() const; // If no query is in progress, starts working on an autocomplete query. @@ -462,11 +438,6 @@ // one, and in either case inline autocomplete would get in the way). PasteState paste_state_; - // Whether the control key is depressed. We track this to avoid calling - // UpdatePopup() repeatedly if the user holds down the key, and to know - // whether to trigger "ctrl-enter" behavior. - ControlKeyState control_key_state_; - // This is needed to properly update the SearchModel state when the user // presses escape. bool in_revert_;
diff --git a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.mm b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.mm index 4076fdc..4912dffb6 100644 --- a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.mm +++ b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios.mm
@@ -245,7 +245,6 @@ focus_resulted_in_navigation_(false), just_deleted_text_(false), paste_state_(NONE), - control_key_state_(UP), in_revert_(false), close_lens_(false) {} @@ -599,7 +598,7 @@ } } -void OmniboxEditModelIOS::OnSetFocus(bool control_down) { +void OmniboxEditModelIOS::OnSetFocus() { TRACE_EVENT0("omnibox", "OmniboxEditModelIOS::OnSetFocus"); last_omnibox_focus_ = base::TimeTicks::Now(); focus_resulted_in_navigation_ = false; @@ -609,10 +608,6 @@ // focus can be regained without an accompanying call to // OmniboxViewBase::SetFocus(), e.g. by tabbing in. SetFocusState(OMNIBOX_FOCUS_VISIBLE, OMNIBOX_FOCUS_CHANGE_EXPLICIT); - // On focusing the omnibox, if the ctrl key is pressed, we don't want to - // trigger ctrl-enter behavior unless it is released and re-pressed. For - // example, if the user presses ctrl-l to focus the omnibox. - control_key_state_ = control_down ? DOWN_AND_CONSUMED : UP; if (user_input_in_progress_ || !in_revert_) { controller_->client()->OnInputStateChanged(); @@ -675,12 +670,6 @@ } } -void OmniboxEditModelIOS::ConsumeCtrlKey() { - if (control_key_state_ == DOWN) { - control_key_state_ = DOWN_AND_CONSUMED; - } -} - void OmniboxEditModelIOS::OnWillKillFocus() { if (user_input_in_progress_ || !in_revert_) { controller_->client()->OnInputStateChanged(); @@ -693,18 +682,6 @@ SetFocusState(OMNIBOX_FOCUS_NONE, OMNIBOX_FOCUS_CHANGE_EXPLICIT); last_omnibox_focus_ = base::TimeTicks(); paste_state_ = NONE; - control_key_state_ = UP; -#if BUILDFLAG(IS_WIN) - if (view_) { - view_->HideImeIfNeeded(); - } -#endif -} - -void OmniboxEditModelIOS::OnControlKeyChanged(bool pressed) { - if (pressed == (control_key_state_ == UP)) { - control_key_state_ = pressed ? DOWN : UP; - } } void OmniboxEditModelIOS::OnPaste() { @@ -769,11 +746,6 @@ SetFocusState(OMNIBOX_FOCUS_VISIBLE, OMNIBOX_FOCUS_CHANGE_TYPING); } - // When the user performs an action with the ctrl key pressed down, we assume - // the ctrl key was intended for that action. If they then press enter without - // releasing the ctrl key, we prevent "ctrl-enter" behavior. - ConsumeCtrlKey(); - // If the user text does not need to be changed, return now, so we don't // change any other state, lest arrowing around the omnibox do something like // reset `just_deleted_text_`. Note that modifying the selection accepts any @@ -940,58 +912,6 @@ GURL alternate_nav_url; AutocompleteMatch match = CurrentMatch(&alternate_nav_url); - // If CTRL is down it means the user wants to append ".com" to the text they - // typed. If we can successfully generate a URL_WHAT_YOU_TYPED match doing - // that, then we use this. These matches are marked as generated by the - // HistoryURLProvider so we only generate them if this provider is present. - bool accept_via_control_enter = - control_key_state_ == DOWN && - autocomplete_controller()->history_url_provider(); - base::UmaHistogramBoolean("Omnibox.Search.CtrlEnter.Used", - accept_via_control_enter); - if (accept_via_control_enter) { - // For generating the hostname of the URL, we use the most recent - // input instead of the currently visible text. This means we'll ignore any - // visible inline autocompletion: if a user types "foo" and is autocompleted - // to "foodnetwork.com", ctrl-enter will navigate to "foo.com", not - // "foodnetwork.com". At the time of writing, this behavior matches - // Internet Explorer, but not Firefox. Two exceptions to our own rule: - // 1. If the user has selected a suggestion, use the suggestion text. - // 2. If the user has never edited the text, use the current page's full - // URL instead of the elided URL to avoid HTTPS downgrading. - std::u16string text_for_desired_tld_navigation = input_.text(); - if (!user_input_in_progress()) { - text_for_desired_tld_navigation = url_for_editing_; - } - - // Generate a new AutocompleteInput, copying the latest one but using "com" - // as the desired TLD. Then use this autocomplete input to generate a - // URL_WHAT_YOU_TYPED AutocompleteMatch. - AutocompleteInput input( - text_for_desired_tld_navigation, input_.cursor_position(), "com", - input_.current_page_classification(), - controller_->client()->GetSchemeClassifier(), - controller_->client()->ShouldDefaultTypedNavigationsToHttps(), 0, - false); - input.set_prevent_inline_autocomplete(input_.prevent_inline_autocomplete()); - input.set_omit_asynchronous_matches(input_.omit_asynchronous_matches()); - input.set_focus_type(input_.focus_type()); - input_ = input; - AutocompleteMatch url_match(VerbatimMatchForInput( - autocomplete_controller()->history_url_provider(), - autocomplete_controller()->autocomplete_provider_client(), input_, - input_.canonicalized_url(), false)); - - base::UmaHistogramBoolean("Omnibox.Search.CtrlEnter.ResolvedAsUrl", - url_match.destination_url.is_valid()); - - if (url_match.destination_url.is_valid()) { - // We have a valid URL, we use this newly generated AutocompleteMatch. - match = url_match; - alternate_nav_url = GURL(); - } - } - if (!match.destination_url.is_valid()) { return; }
diff --git a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios_unittest.mm b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios_unittest.mm index 6342380..82de241 100644 --- a/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios_unittest.mm +++ b/ios/chrome/browser/omnibox/model/omnibox_edit_model_ios_unittest.mm
@@ -76,7 +76,7 @@ } else { model->SetUserText(url_text); } - model->OnSetFocus(false); + model->OnSetFocus(); model->OpenMatchForTesting(match, WindowOpenDisposition::CURRENT_TAB, GURL(), std::u16string(), 0); } @@ -299,7 +299,7 @@ OnAutocompleteAccept(_, _, _, _, _, _, _, _, _, _, _)) .WillOnce(SaveArg<10>(&alternate_nav_match)); - model()->OnSetFocus(false); // Avoids DCHECK in OpenMatch(). + model()->OnSetFocus(); // Avoids DCHECK in OpenMatch(). model()->SetUserText(u"http://abcd"); model()->OpenMatchForTesting(match, WindowOpenDisposition::CURRENT_TAB, alternate_nav_url, std::u16string(), 0); @@ -372,67 +372,6 @@ EXPECT_TRUE(model()->CurrentTextIsURL()); } -// Tests ConsumeCtrlKey() consumes ctrl key when down, but does not affect ctrl -// state otherwise. -TEST_F(OmniboxEditModelIOSTest, ConsumeCtrlKey) { - model()->control_key_state_ = TestOmniboxEditModelIOS::UP; - model()->ConsumeCtrlKey(); - EXPECT_EQ(model()->control_key_state_, TestOmniboxEditModelIOS::UP); - model()->control_key_state_ = TestOmniboxEditModelIOS::DOWN; - model()->ConsumeCtrlKey(); - EXPECT_EQ(model()->control_key_state_, - TestOmniboxEditModelIOS::DOWN_AND_CONSUMED); - model()->ConsumeCtrlKey(); - EXPECT_EQ(model()->control_key_state_, - TestOmniboxEditModelIOS::DOWN_AND_CONSUMED); -} - -// Tests ctrl_key_state_ is set consumed if the ctrl key is down on focus. -TEST_F(OmniboxEditModelIOSTest, ConsumeCtrlKeyOnRequestFocus) { - model()->control_key_state_ = TestOmniboxEditModelIOS::DOWN; - model()->OnSetFocus(false); - EXPECT_EQ(model()->control_key_state_, TestOmniboxEditModelIOS::UP); - model()->OnSetFocus(true); - EXPECT_EQ(model()->control_key_state_, - TestOmniboxEditModelIOS::DOWN_AND_CONSUMED); -} - -// Tests the ctrl key is consumed on a ctrl-action (e.g. ctrl-c to copy) -TEST_F(OmniboxEditModelIOSTest, ConsumeCtrlKeyOnCtrlAction) { - model()->control_key_state_ = TestOmniboxEditModelIOS::DOWN; - OmniboxViewBase::StateChanges state_changes{nullptr, nullptr, 0, 0, - false, false, false}; - model()->OnAfterPossibleChange(state_changes); - EXPECT_EQ(model()->control_key_state_, - TestOmniboxEditModelIOS::DOWN_AND_CONSUMED); -} - -TEST_F(OmniboxEditModelIOSTest, CtrlEnterNavigatesToDesiredTLD) { - // Set the edit model into an inline autocomplete state. - view()->SetUserText(u"foo"); - model()->StartAutocomplete(false, false); - view()->OnInlineAutocompleteTextMaybeChanged(u"foo", u"bar"); - - model()->OnControlKeyChanged(true); - model()->OpenSelection(); - EXPECT_EQ(GURL("http://www.foo.com/"), - model()->GetInputForTesting().canonicalized_url()); -} - -TEST_F(OmniboxEditModelIOSTest, - CtrlEnterNavigatesToDesiredTLDSteadyStateElisions) { - location_bar_model()->set_url(GURL("https://www.example.com/")); - location_bar_model()->set_url_for_display(u"example.com"); - - EXPECT_TRUE(model()->ResetDisplayTexts()); - model()->Revert(); - - model()->OnControlKeyChanged(true); - model()->OpenSelection(); - EXPECT_EQ(GURL("https://www.example.com/"), - model()->GetInputForTesting().canonicalized_url()); -} - /////////////////////////////////////////////////////////////////////////////// // Popup-related tests
diff --git a/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm b/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm index ad5ec4ed..7bbf264 100644 --- a/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm +++ b/ios/chrome/browser/omnibox/model/omnibox_text_controller.mm
@@ -253,7 +253,7 @@ } if (_omniboxEditModel) { - _omniboxEditModel->OnSetFocus(/*control_down=*/false); + _omniboxEditModel->OnSetFocus(); if (_inLensOverlay && textField.userText.length) { _omniboxEditModel->SetUserText(textField.userText.cr_UTF16String);
diff --git a/ios/chrome/browser/reading_list/ui_bundled/reading_list_coordinator.mm b/ios/chrome/browser/reading_list/ui_bundled/reading_list_coordinator.mm index d6b659cf..e0490cb 100644 --- a/ios/chrome/browser/reading_list/ui_bundled/reading_list_coordinator.mm +++ b/ios/chrome/browser/reading_list/ui_bundled/reading_list_coordinator.mm
@@ -84,7 +84,8 @@ ReadingListListViewControllerAudience, ReadingListListViewControllerDelegate, SigninPresenter, - SigninPromoViewConsumer> + SigninPromoViewConsumer, + UIAdaptivePresentationControllerDelegate> // Whether the coordinator is started. @property(nonatomic, assign, getter=isStarted) BOOL started; @@ -183,8 +184,7 @@ [self.navigationController setModalPresentationStyle:UIModalPresentationFormSheet]; - self.navigationController.presentationController.delegate = - self.tableViewController; + self.navigationController.presentationController.delegate = self; [self.baseViewController presentViewController:self.navigationController animated:YES @@ -283,8 +283,7 @@ - (void)dismissReadingListListViewController:(UIViewController*)viewController { DCHECK_EQ(self.tableViewController, viewController); - [self.tableViewController willBeDismissed]; - [_delegate closeReadingList]; + [self dismissReadingList]; } - (void)readingListListViewController:(UIViewController*)viewController @@ -337,6 +336,10 @@ promoText:[self promoTextForPromoAction]]; } +- (BOOL)canDismiss { + return !_signinPromoViewMediator.signinInProgress; +} + #pragma mark - URL Loading Helpers // Loads reading list URLs. If `offlineURL` is valid and `loadOfflineVersion` is @@ -542,7 +545,7 @@ - (void)showSignin:(ShowSigninCommand*)command { [_applicationCommandsHandler showSignin:command - baseViewController:self.tableViewController]; + baseViewController:self.navigationController]; } #pragma mark - AccountSettingsPresenter @@ -600,6 +603,12 @@ #pragma mark - Private +- (void)dismissReadingList { + CHECK([self canDismiss], base::NotFatalUntil::M145); + [self.tableViewController willBeDismissed]; + [_delegate closeReadingList]; +} + // Computes whether the sign-in promo should be visible in the reading list and // updates the view accordingly. - (void)updateSignInPromoVisibility { @@ -718,4 +727,19 @@ return !IsIncognitoModeDisabled(_prefService); } +#pragma mark - UIAdaptivePresentationControllerDelegate + +- (void)presentationControllerDidDismiss: + (UIPresentationController*)presentationController { + base::RecordAction(base::UserMetricsAction("IOSReadingListCloseWithSwipe")); + // Call the delegate dismissReadingListListViewController to clean up state + // and stop the Coordinator. + [self dismissReadingList]; +} + +- (BOOL)presentationControllerShouldDismiss: + (UIPresentationController*)presentationController { + return [self canDismiss]; +} + @end
diff --git a/ios/chrome/browser/reading_list/ui_bundled/reading_list_list_view_controller_delegate.h b/ios/chrome/browser/reading_list/ui_bundled/reading_list_list_view_controller_delegate.h index 3bf390f..d10d606 100644 --- a/ios/chrome/browser/reading_list/ui_bundled/reading_list_list_view_controller_delegate.h +++ b/ios/chrome/browser/reading_list/ui_bundled/reading_list_list_view_controller_delegate.h
@@ -36,6 +36,9 @@ // Notifies the delegate that the reading list has been loaded. - (void)didLoadContent; +// Whether the view can be dismissed. +- (BOOL)canDismiss; + @end #endif // IOS_CHROME_BROWSER_READING_LIST_UI_BUNDLED_READING_LIST_LIST_VIEW_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.h b/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.h index 33ccb50..796e46c 100644 --- a/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.h +++ b/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.h
@@ -19,8 +19,7 @@ // View controller that displays reading list items in a table view. @interface ReadingListTableViewController - : LegacyChromeTableViewController <ReadingListListItemAccessibilityDelegate, - UIAdaptivePresentationControllerDelegate> + : LegacyChromeTableViewController <ReadingListListItemAccessibilityDelegate> // The delegate. @property(nonatomic, weak) id<ReadingListListViewControllerDelegate> delegate;
diff --git a/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.mm b/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.mm index e4eae0ce..e13a970 100644 --- a/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.mm +++ b/ios/chrome/browser/reading_list/ui_bundled/reading_list_table_view_controller.mm
@@ -405,16 +405,6 @@ } } -#pragma mark - UIAdaptivePresentationControllerDelegate - -- (void)presentationControllerDidDismiss: - (UIPresentationController*)presentationController { - base::RecordAction(base::UserMetricsAction("IOSReadingListCloseWithSwipe")); - // Call the delegate dismissReadingListListViewController to clean up state - // and stop the Coordinator. - [self.delegate dismissReadingListListViewController:self]; -} - #pragma mark - LegacyChromeTableViewController - (void)loadModel { @@ -437,10 +427,15 @@ } - (NSArray*)keyCommands { - return @[ UIKeyCommand.cr_close ]; + if (self.delegate.canDismiss) { + return @[ UIKeyCommand.cr_close ]; + } else { + return @[]; + } } - (void)keyCommand_close { + CHECK(self.delegate.canDismiss, base::NotFatalUntil::M145); base::RecordAction(base::UserMetricsAction("MobileKeyCommandClose")); [self.delegate dismissReadingListListViewController:self]; } @@ -1175,6 +1170,9 @@ #pragma mark - Accessibility - (BOOL)accessibilityPerformEscape { + if (!self.delegate.canDismiss) { + return NO; + } base::RecordAction( base::UserMetricsAction("MobileReadingListAccessibilityClose")); [self.delegate dismissReadingListListViewController:self];
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.h b/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.h index 0b27a31..3f7a86bb 100644 --- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.h +++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.h
@@ -91,6 +91,9 @@ // Margin on top of `textLabel`. This is 0 by default. @property(nonatomic, assign) CGFloat textLabelMarginTop; +// Spacing between the text labels when no notification dot is present. +@property(nonatomic, assign) CGFloat textLabelSpacing; + // Sets the `image` that should be displayed at the leading edge of the cell // with a `tintColor`. If set to nil, the icon will be hidden and the text // labels will expand to fill the full width of the cell. The image view will be
diff --git a/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.mm b/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.mm index a0962f1..079d063 100644 --- a/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.mm +++ b/ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.mm
@@ -161,6 +161,7 @@ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { _detailTextNumberOfLines = kDefaultDetailTextNumberOfLines; + _textLabelSpacing = kDefaultTextLabelSpacing; _iconCenteredVertically = YES; self.isAccessibilityElement = YES; @@ -189,7 +190,7 @@ _textStackView = [[UIStackView alloc] initWithArrangedSubviews:@[ _textLabel ]]; _textStackView.translatesAutoresizingMaskIntoConstraints = NO; - _textStackView.spacing = kDefaultTextLabelSpacing; + _textStackView.spacing = _textLabelSpacing; [contentView addSubview:_textStackView]; // Set up the constraints for when the icon is visible and hidden. One of @@ -288,6 +289,12 @@ [self.textStackView setNeedsLayout]; } +- (void)setTextLabelSpacing:(CGFloat)spacing { + _textLabelSpacing = spacing; + _textStackView.spacing = _textLabelSpacing; + [self.contentView setNeedsLayout]; +} + - (void)setIconImage:(UIImage*)image tintColor:(UIColor*)tintColor backgroundColor:(UIColor*)backgroundColor
diff --git a/ios/chrome/browser/shared/ui/util/identity_snackbar/BUILD.gn b/ios/chrome/browser/shared/ui/util/identity_snackbar/BUILD.gn index 0b749f17..dd9e0cb 100644 --- a/ios/chrome/browser/shared/ui/util/identity_snackbar/BUILD.gn +++ b/ios/chrome/browser/shared/ui/util/identity_snackbar/BUILD.gn
@@ -15,6 +15,8 @@ "//base", "//ios/chrome/app:tests_hook", "//ios/chrome/app/strings", + "//ios/chrome/browser/policy/model", + "//ios/chrome/browser/shared/model/profile:features", "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/common/ui/colors",
diff --git a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.h b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.h index 2e5d294..35fe6b7 100644 --- a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.h +++ b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.h
@@ -7,6 +7,8 @@ #import <MaterialComponents/MaterialSnackbar.h> +#import "ios/chrome/browser/policy/model/management_state.h" + // A snackbar message that contains profile information of the current logged in // account. @interface IdentitySnackbarMessage : MDCSnackbarMessage @@ -22,12 +24,12 @@ @property(nonatomic, readonly) NSString* email; // True if the profile is managed by an enterprise admin. -@property(nonatomic, readonly) BOOL managed; +@property(nonatomic, readonly) ManagementState managementState; - (instancetype)initWithName:(NSString*)name email:(NSString*)email avatar:(UIImage*)avatar - managed:(BOOL)managed; + managementState:(ManagementState)managementState; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.mm b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.mm index ee265134..7ce7070 100644 --- a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.mm +++ b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.mm
@@ -8,6 +8,7 @@ #import "base/metrics/histogram_functions.h" #import "base/time/time.h" #import "ios/chrome/app/tests_hook.h" +#import "ios/chrome/browser/policy/model/management_state.h" #import "ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.h" @interface IdentitySnackbarMessage () @@ -15,7 +16,7 @@ @property(nonatomic, readwrite) UIImage* avatar; @property(nonatomic, readwrite) NSString* name; @property(nonatomic, readwrite) NSString* email; -@property(nonatomic, readwrite) BOOL managed; +@property(nonatomic, readwrite) ManagementState managementState; @end namespace { @@ -30,7 +31,7 @@ - (instancetype)initWithName:(NSString*)name email:(NSString*)email avatar:(UIImage*)avatar - managed:(BOOL)managed { + managementState:(ManagementState)managementState { self = [super init]; if (self) { CHECK(avatar); @@ -38,7 +39,7 @@ _avatar = avatar; _name = name; _email = email; - _managed = managed; + _managementState = managementState; // Ensure the absence of the standard MDCSnacbarMessage’s text. self.text = @""; // Allows snackbar to stay longer in some tests. @@ -67,7 +68,7 @@ instance.avatar = _avatar; instance.name = _name; instance.email = _email; - instance.managed = _managed; + instance.managementState = _managementState; return instance; }
diff --git a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.mm b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.mm index fc368737..9648fd24 100644 --- a/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.mm +++ b/ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.mm
@@ -5,6 +5,8 @@ #import "ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message_view.h" #import "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/policy/model/management_state.h" +#import "ios/chrome/browser/shared/model/profile/features.h" #import "ios/chrome/browser/shared/ui/symbols/symbols.h" #import "ios/chrome/browser/shared/ui/util/identity_snackbar/identity_snackbar_message.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" @@ -62,6 +64,12 @@ // The offset between texts. const CGFloat kTextOffset = 2.; +bool CanShowManagementMessaging(const ManagementState& management_state) { + return management_state.is_profile_managed() || + (AreSeparateProfilesForManagedAccountsEnabled() && + management_state.is_managed()); +} + } // namespace @interface MDCSnackbarMessageView (internal) @@ -103,7 +111,8 @@ IdentitySnackbarMessage* snackbarMessage = (IdentitySnackbarMessage*)message; _snackbarMessage = snackbarMessage; - BOOL managed = snackbarMessage.managed; + BOOL showManagementMessaging = + CanShowManagementMessaging(_snackbarMessage.managementState); // Avatar view. _avatarView = [[UIImageView alloc] init]; @@ -131,7 +140,7 @@ kInvertedTextSecondaryColor); _emailView = CreateSingleLineLabel(nil, UIFontTextStyleFootnote, kInvertedTextSecondaryColor); - if (managed) { + if (showManagementMessaging) { [self updateManagedLabels]; } else { _emailView.text = snackbarMessage.email; @@ -154,7 +163,7 @@ [self addSubview:_textViews]; - UIImage* accountBadge = snackbarMessage.managed + UIImage* accountBadge = showManagementMessaging ? GetEnterpriseIcon() : GetBrandedGoogleServicesSymbol(); _accountBadgeView = [[UIImageView alloc] initWithImage:accountBadge]; @@ -223,7 +232,7 @@ AddSameCenterYConstraint(self, _accountBadgeView); if (@available(iOS 17, *)) { - if (_snackbarMessage.managed) { + if (showManagementMessaging) { NSArray<UITrait>* traits = TraitCollectionSetForTraits(@[ UITraitLayoutDirection.class ]); __weak __typeof(self) weakSelf = self; @@ -273,7 +282,7 @@ // Reset the 2nd and 3rd labels if the identity is managed. Do nothing if it is // not. - (void)updateLabels { - if (_snackbarMessage.managed) { + if (CanShowManagementMessaging(_snackbarMessage.managementState)) { [self updateManagedLabels]; } } @@ -284,16 +293,26 @@ UIDevice.currentDevice.userInterfaceIdiom == UIUserInterfaceIdiomPhone && UIDeviceOrientationIsPortrait(UIDevice.currentDevice.orientation); NSString* email = _snackbarMessage.email; - _emailView.text = useShortLabels - ? email - : l10n_util::GetNSStringF( - IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_WIDE_SCREEN, - base::SysNSStringToUTF16(email)); + _emailView.text = + useShortLabels + ? email + : l10n_util::GetNSStringF( + _snackbarMessage.managementState.is_browser_managed() + ? IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_BROWSER_WIDE_SCREEN + : IDS_IOS_ENTERPRISE_SWITCH_TO_MANAGED_WIDE_SCREEN, + base::SysNSStringToUTF16(email)); - _managementView.text = - useShortLabels ? l10n_util::GetNSString( - IDS_IOS_ENTERPRISE_MANAGED_BY_YOUR_ORGANIZATION) - : nil; + if (!useShortLabels) { + _managementView.text = nil; + } else if (AreSeparateProfilesForManagedAccountsEnabled()) { + _managementView.text = l10n_util::GetNSString( + _snackbarMessage.managementState.is_browser_managed() + ? IDS_IOS_ENTERPRISE_BROWSER_MANAGED + : IDS_IOS_ENTERPRISE_MANAGED_BY_YOUR_ORGANIZATION); + } else { + _managementView.text = + l10n_util::GetNSString(IDS_IOS_ENTERPRISE_MANAGED_BY_YOUR_ORGANIZATION); + } // In case there is no third label, the second might be long. Let’s display it // on two lines if needed. _emailView.numberOfLines = useShortLabels ? 1 : 2;
diff --git a/ios/chrome/browser/signin/model/system_account_updater.mm b/ios/chrome/browser/signin/model/system_account_updater.mm index 87c846d0..3f384d3c 100644 --- a/ios/chrome/browser/signin/model/system_account_updater.mm +++ b/ios/chrome/browser/signin/model/system_account_updater.mm
@@ -40,8 +40,32 @@ base::BlockingType::WILL_BLOCK); if (png_data) { [png_data writeToURL:identity_file atomically:YES]; - } else { - [[NSFileManager defaultManager] removeItemAtURL:identity_file error:nil]; + } +} + +// Remove legacy avatar data from disk. +void RemoveAvatarDataFromDisk(NSDictionary* avatars) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::WILL_BLOCK); + NSURL* avatars_folder = app_group::WidgetsAvatarFolder(); + if (!avatars_folder) { + return; + } + NSFileManager* manager = [NSFileManager defaultManager]; + NSArray<NSURL*>* contents = + [manager contentsOfDirectoryAtURL:avatars_folder + includingPropertiesForKeys:nil + options:NSDirectoryEnumerationSkipsHiddenFiles + error:nil]; + + for (NSURL* url in contents) { + if ([url.pathExtension.lowercaseString isEqualToString:@"png"]) { + NSString* file_name = + [[url lastPathComponent] stringByDeletingPathExtension]; + if (avatars[file_name] == nil) { + [manager removeItemAtURL:url error:nil]; + } + } } } @@ -54,6 +78,8 @@ NSData* avatar_data = avatars[gaia]; StoreAvatarDataToDisk(identity_file, avatar_data); } + // Check if disk cleanup in WidgetsAvatarFolder folder is needed. + RemoveAvatarDataFromDisk(avatars); } } // namespace
diff --git a/ios/chrome/browser/supervised_user/model/supervised_user_url_filter_tab_helper_unittest.mm b/ios/chrome/browser/supervised_user/model/supervised_user_url_filter_tab_helper_unittest.mm index 8a1af77..6d1d66d 100644 --- a/ios/chrome/browser/supervised_user/model/supervised_user_url_filter_tab_helper_unittest.mm +++ b/ios/chrome/browser/supervised_user/model/supervised_user_url_filter_tab_helper_unittest.mm
@@ -109,16 +109,16 @@ } void AllowExampleSiteForSupervisedUser() { - supervised_user::SupervisedUserService* supervised_user_service = - SupervisedUserServiceFactory::GetForProfile(profile_.get()); + // This single host is allowed. + base::Value::Dict hosts; + hosts.Set("example.com", true); + profile_->GetPrefs()->SetDict(prefs::kSupervisedUserManualHosts, + hosts.Clone()); - std::map<std::string, bool> hosts; - hosts["example.com"] = true; - supervised_user_service->GetURLFilter()->SetManualHosts(hosts); - + // But default behavior will block everything else. profile_->GetPrefs()->SetInteger( prefs::kDefaultSupervisedUserFilteringBehavior, - static_cast<int>(supervised_user::FilteringBehavior::kAllow)); + static_cast<int>(supervised_user::FilteringBehavior::kBlock)); profile_->GetPrefs()->SetBoolean(prefs::kSupervisedUserSafeSites, false); }
diff --git a/ios/chrome/browser/sync/model/prefs/sync_preferences_egtest.mm b/ios/chrome/browser/sync/model/prefs/sync_preferences_egtest.mm index 78407483..2b0f6f3 100644 --- a/ios/chrome/browser/sync/model/prefs/sync_preferences_egtest.mm +++ b/ios/chrome/browser/sync/model/prefs/sync_preferences_egtest.mm
@@ -358,8 +358,9 @@ // Restart with MigrateAccountPrefs flag enabled. [self restartWithMigrateAccountPrefsEnabled:fakeIdentity]; - GREYAssertEqual([ChromeEarlGrey userIntegerPref:kTestSyncablePref], - kTestPrefValue1, @"Incorrect local pref value."); + // The account values are loaded upon sync initialization, thus wait for the + // pref value to be set. + WaitForPreferenceValue(kTestPrefValue1); // Sign out and validate that the pref is not set locally. [SigninEarlGrey signOut];
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 00dc88d..4677bdf 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
@@ -210,6 +210,11 @@ // `fakeIdentity2` joins shared groups as member. FakeSystemIdentity* identity = [FakeSystemIdentity fakeIdentity1]; [SigninEarlGreyUI signinWithFakeIdentity:identity enableHistorySync:YES]; + + // Make sure that the MessagingBackendService is fully initialized. + NSError* error = [ChromeEarlGrey waitForMessagingBackendServiceInitialized]; + GREYAssertNil(error, @"Failed to initialize MessagingBackendService: %@", + error); } - (void)tearDownHelper {
diff --git a/ios/chrome/browser/toolbar/ui_bundled/adaptive_toolbar_app_interface.mm b/ios/chrome/browser/toolbar/ui_bundled/adaptive_toolbar_app_interface.mm index 2645a80..5830fdd 100644 --- a/ios/chrome/browser/toolbar/ui_bundled/adaptive_toolbar_app_interface.mm +++ b/ios/chrome/browser/toolbar/ui_bundled/adaptive_toolbar_app_interface.mm
@@ -22,20 +22,38 @@ + (UITraitCollection*)changeTraitCollection:(UITraitCollection*)traitCollection forViewController:(UIViewController*)viewController { // Change the orientation or the trait collection. - UITraitCollection* secondTraitCollection = nil; - // Simulate a multitasking by overriding the trait collections of the view - // controllers. - UITraitCollection* horizontalCompact = [UITraitCollection - traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact]; - secondTraitCollection = - [UITraitCollection traitCollectionWithTraitsFromCollections:@[ - traitCollection, horizontalCompact - ]]; - for (UIViewController* child in viewController.childViewControllers) { - [viewController setOverrideTraitCollection:secondTraitCollection - forChildViewController:child]; + if (@available(iOS 17, *)) { + for (UIViewController* child in viewController.childViewControllers) { + child.traitOverrides.horizontalSizeClass = + UIUserInterfaceSizeClassCompact; + } + + return [UITraitCollection + traitCollectionWithTraits:^(id<UIMutableTraits> mutableTraits) { + mutableTraits.horizontalSizeClass = UIUserInterfaceSizeClassCompact; + }]; + ; } - return secondTraitCollection; +#if !defined(__IPHONE_17_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_17_0 + else { + UITraitCollection* secondTraitCollection = nil; + // Simulate a multitasking by overriding the trait collections of the view + // controllers. + UITraitCollection* horizontalCompact = [UITraitCollection + traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassCompact]; + secondTraitCollection = + [UITraitCollection traitCollectionWithTraitsFromCollections:@[ + traitCollection, horizontalCompact + ]]; + + for (UIViewController* child in viewController.childViewControllers) { + [viewController setOverrideTraitCollection:secondTraitCollection + forChildViewController:child]; + } + + return secondTraitCollection; + } +#endif } @end
diff --git a/ios/chrome/browser/toolbar/ui_bundled/adaptive_toolbar_egtest.mm b/ios/chrome/browser/toolbar/ui_bundled/adaptive_toolbar_egtest.mm index d82364b..bcf0ef70 100644 --- a/ios/chrome/browser/toolbar/ui_bundled/adaptive_toolbar_egtest.mm +++ b/ios/chrome/browser/toolbar/ui_bundled/adaptive_toolbar_egtest.mm
@@ -439,9 +439,18 @@ if ([ChromeEarlGrey isIPadIdiom]) { // Remove the override. for (UIViewController* child in topViewController.childViewControllers) { - [topViewController setOverrideTraitCollection:originalTraitCollection - forChildViewController:child]; + if (@available(iOS 17, *)) { + child.traitOverrides.horizontalSizeClass = + originalTraitCollection.horizontalSizeClass; + } +#if !defined(__IPHONE_17_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_17_0 + else { + [topViewController setOverrideTraitCollection:originalTraitCollection + forChildViewController:child]; + } } +#endif + } else { // Cancel the rotation. [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationPortrait error:nil]; @@ -483,9 +492,18 @@ if ([ChromeEarlGrey isIPadIdiom]) { // Remove the override. for (UIViewController* child in topViewController.childViewControllers) { - [topViewController setOverrideTraitCollection:originalTraitCollection - forChildViewController:child]; + if (@available(iOS 17, *)) { + child.traitOverrides.horizontalSizeClass = + originalTraitCollection.horizontalSizeClass; + } +#if !defined(__IPHONE_17_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_17_0 + else { + [topViewController setOverrideTraitCollection:originalTraitCollection + forChildViewController:child]; + } } +#endif + } else { // Cancel the rotation. [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationPortrait error:nil]; @@ -649,9 +667,18 @@ if ([ChromeEarlGrey isIPadIdiom]) { // Remove the override. for (UIViewController* child in topViewController.childViewControllers) { - [topViewController setOverrideTraitCollection:originalTraitCollection - forChildViewController:child]; + if (@available(iOS 17, *)) { + child.traitOverrides.horizontalSizeClass = + originalTraitCollection.horizontalSizeClass; + } +#if !defined(__IPHONE_17_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_17_0 + else { + [topViewController setOverrideTraitCollection:originalTraitCollection + forChildViewController:child]; + } } +#endif + } else { // Cancel the rotation. [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationPortrait error:nil]; @@ -689,9 +716,18 @@ // Revert the orientation/trait collection to the original. if ([ChromeEarlGrey isIPadIdiom]) { // Remove the override. + for (UIViewController* child in topViewController.childViewControllers) { - [topViewController setOverrideTraitCollection:originalTraitCollection - forChildViewController:child]; + if (@available(iOS 17, *)) { + child.traitOverrides.horizontalSizeClass = + originalTraitCollection.horizontalSizeClass; + } +#if !defined(__IPHONE_17_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_17_0 + else { + [topViewController setOverrideTraitCollection:originalTraitCollection + forChildViewController:child]; + } +#endif } } else { // Cancel the rotation.
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index ff54108..d3ba8fc 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -95,6 +95,7 @@ "//base/test:test_support", "//components/autofill/core/browser", "//components/browsing_data/core", + "//components/collaboration/public", "//components/content_settings/core/browser", "//components/feature_engagement/public", "//components/language/ios/browser", @@ -126,6 +127,7 @@ "//ios/chrome/browser/bring_android_tabs/ui_bundled:eg_app_support+eg2", "//ios/chrome/browser/browser_container/ui_bundled:eg_app_support+eg2", "//ios/chrome/browser/browser_view/test:eg_app_support+eg2", + "//ios/chrome/browser/collaboration/model/messaging", "//ios/chrome/browser/content_settings/model", "//ios/chrome/browser/content_suggestions/ui_bundled:constants", "//ios/chrome/browser/content_suggestions/ui_bundled:content_suggestions_constant",
diff --git a/ios/chrome/test/earl_grey/DEPS b/ios/chrome/test/earl_grey/DEPS index 0c44192..20fb4c7a 100644 --- a/ios/chrome/test/earl_grey/DEPS +++ b/ios/chrome/test/earl_grey/DEPS
@@ -2,6 +2,7 @@ # To compile base::Feature under EG2 "chrome_earl_grey_app_interface\.mm":[ "+components/autofill/core/common/autofill_features.h", + "+components/collaboration/public/messaging/messaging_backend_service.h", "+components/safe_browsing/core/common/features.h", "+components/search_engines/template_url_service.h", "+components/password_manager/core/common/password_manager_features.h",
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h index 5312e6c..8a9565f 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -997,6 +997,11 @@ // Forces an override of the variations stored permanent country. - (void)overrideVariationsServiceStoredPermanentCountry:(NSString*)country; +#pragma mark - Shared Tab Groups Utilities + +// Waits for the MessagingBackendService to be initialized. +- (NSError*)waitForMessagingBackendServiceInitialized; + @end #endif // IOS_CHROME_TEST_EARL_GREY_CHROME_EARL_GREY_H_
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm index d19fa84..1577ed0 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -1921,4 +1921,10 @@ overrideVariationsServiceStoredPermanentCountry:country]; } +#pragma mark - Shared Tab Groups Utilities + +- (NSError*)waitForMessagingBackendServiceInitialized { + return [ChromeEarlGreyAppInterface waitForMessagingBackendServiceInitialized]; +} + @end
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h index 17d7bb9..45eb067d 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.h
@@ -746,6 +746,11 @@ // Forces an override of the variations stored permanent country. + (void)overrideVariationsServiceStoredPermanentCountry:(NSString*)country; +#pragma mark - Shared Tab Groups Utilities + +// Waits for the MessagingBackendService to be initialized. ++ (NSError*)waitForMessagingBackendServiceInitialized; + @end #endif // IOS_CHROME_TEST_EARL_GREY_CHROME_EARL_GREY_APP_INTERFACE_H_
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm index 085837f..744c1b2 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -24,6 +24,7 @@ #import "components/autofill/core/browser/data_manager/personal_data_manager.h" #import "components/autofill/core/common/autofill_features.h" #import "components/browsing_data/core/pref_names.h" +#import "components/collaboration/public/messaging/messaging_backend_service.h" #import "components/content_settings/core/browser/host_content_settings_map.h" #import "components/metrics/demographics/demographic_metrics_provider.h" #import "components/metrics/dwa/dwa_recorder.h" @@ -42,6 +43,7 @@ #import "ios/chrome/app/application_delegate/app_state.h" #import "ios/chrome/app/main_controller.h" #import "ios/chrome/browser/autofill/model/personal_data_manager_factory.h" +#import "ios/chrome/browser/collaboration/model/messaging/messaging_backend_service_factory.h" #import "ios/chrome/browser/content_settings/model/host_content_settings_map_factory.h" #import "ios/chrome/browser/default_browser/model/utils.h" #import "ios/chrome/browser/default_browser/model/utils_test_support.h" @@ -108,6 +110,8 @@ using base::test::ios::kWaitForJSCompletionTimeout; using base::test::ios::kWaitForPageLoadTimeout; using base::test::ios::WaitUntilConditionOrTimeout; +using collaboration::messaging::MessagingBackendService; +using collaboration::messaging::MessagingBackendServiceFactory; namespace { @@ -1582,4 +1586,24 @@ variationsService->OverrideStoredPermanentCountry(UTF8Country); } +#pragma mark - Shared Tab Groups Utilities + ++ (NSError*)waitForMessagingBackendServiceInitialized { + bool success = WaitUntilConditionOrTimeout(kWaitForActionTimeout, ^bool { + ProfileIOS* profile = chrome_test_util::GetOriginalProfile(); + CHECK(profile); + MessagingBackendService* service = + MessagingBackendServiceFactory::GetForProfile(profile); + CHECK(service); + return service->IsInitialized(); + }); + if (!success) { + NSString* NSErrorDescription = [NSString + stringWithFormat: + @"Failed waiting for MessagingBackendService to initialize"]; + return testing::NSErrorWithLocalizedDescription(NSErrorDescription); + } + return nil; +} + @end
diff --git a/ios/web/web_state/ui/wk_content_rule_list_util.mm b/ios/web/web_state/ui/wk_content_rule_list_util.mm index bfa75957..9dde97c 100644 --- a/ios/web/web_state/ui/wk_content_rule_list_util.mm +++ b/ios/web/web_state/ui/wk_content_rule_list_util.mm
@@ -38,7 +38,7 @@ ], } mutableCopy], @"action" : @{ - @"type" : @"allow", + @"type" : @"ignore-previous-rules", }, } mutableCopy];
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index 8b70bb8..a1741a2 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc
@@ -136,7 +136,6 @@ case Plane::kV: // and Plane::kATriPlanar: switch (format) { case PIXEL_FORMAT_I444: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV444P12: case PIXEL_FORMAT_Y16: @@ -147,7 +146,6 @@ return gfx::Size(1, 1); case PIXEL_FORMAT_I422: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: case PIXEL_FORMAT_YUV422P12: case PIXEL_FORMAT_I422A: @@ -161,7 +159,6 @@ case PIXEL_FORMAT_I420A: case PIXEL_FORMAT_NV12: case PIXEL_FORMAT_NV21: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_P010LE: @@ -1222,9 +1219,6 @@ case PIXEL_FORMAT_Y16: case PIXEL_FORMAT_UYVY: case PIXEL_FORMAT_YUY2: - case PIXEL_FORMAT_YUV420P9: - case PIXEL_FORMAT_YUV422P9: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV420P10: case PIXEL_FORMAT_YUV422P10: case PIXEL_FORMAT_YUV444P10:
diff --git a/media/base/video_frame_layout.cc b/media/base/video_frame_layout.cc index c17e103..5120fc36 100644 --- a/media/base/video_frame_layout.cc +++ b/media/base/video_frame_layout.cc
@@ -77,9 +77,6 @@ case PIXEL_FORMAT_I422: case PIXEL_FORMAT_I444: case PIXEL_FORMAT_NV12A: - case PIXEL_FORMAT_YUV420P9: - case PIXEL_FORMAT_YUV422P9: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV420P10: case PIXEL_FORMAT_YUV422P10: case PIXEL_FORMAT_YUV444P10:
diff --git a/media/base/video_frame_unittest.cc b/media/base/video_frame_unittest.cc index 04c0c91..f96df0c 100644 --- a/media/base/video_frame_unittest.cc +++ b/media/base/video_frame_unittest.cc
@@ -770,7 +770,6 @@ for (unsigned int i = 1u; i <= PIXEL_FORMAT_MAX; ++i) { const VideoPixelFormat format = static_cast<VideoPixelFormat>(i); switch (format) { - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV444P12: case PIXEL_FORMAT_P410LE: @@ -790,7 +789,6 @@ EXPECT_EQ(84u, VideoFrame::AllocationSize(format, size)) << VideoPixelFormatToString(format); break; - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: case PIXEL_FORMAT_YUV422P12: case PIXEL_FORMAT_P210LE: @@ -803,7 +801,6 @@ EXPECT_EQ(45u, VideoFrame::AllocationSize(format, size)) << VideoPixelFormatToString(format); break; - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_P010LE: @@ -861,7 +858,7 @@ const auto max_size = gfx::Size(max_dimension, max_dimension); for (unsigned int i = 1u; i <= PIXEL_FORMAT_MAX; ++i) { // Deprecated pixel formats. - if (i == 13 || i == 15 || i == 25) { + if (i == 13 || i == 15 || i == 16 || i == 18 || i == 20 || i == 25) { continue; }
diff --git a/media/base/video_types.cc b/media/base/video_types.cc index 421db3a3..6107596f 100644 --- a/media/base/video_types.cc +++ b/media/base/video_types.cc
@@ -41,16 +41,10 @@ return "PIXEL_FORMAT_RGB24"; case PIXEL_FORMAT_MJPEG: return "PIXEL_FORMAT_MJPEG"; - case PIXEL_FORMAT_YUV420P9: - return "PIXEL_FORMAT_YUV420P9"; case PIXEL_FORMAT_YUV420P10: return "PIXEL_FORMAT_YUV420P10"; - case PIXEL_FORMAT_YUV422P9: - return "PIXEL_FORMAT_YUV422P9"; case PIXEL_FORMAT_YUV422P10: return "PIXEL_FORMAT_YUV422P10"; - case PIXEL_FORMAT_YUV444P9: - return "PIXEL_FORMAT_YUV444P9"; case PIXEL_FORMAT_YUV444P10: return "PIXEL_FORMAT_YUV444P10"; case PIXEL_FORMAT_YUV420P12: @@ -139,7 +133,6 @@ case PIXEL_FORMAT_I420A: case PIXEL_FORMAT_NV12: case PIXEL_FORMAT_NV21: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_P010LE: @@ -149,7 +142,6 @@ case PIXEL_FORMAT_I422: case PIXEL_FORMAT_UYVY: case PIXEL_FORMAT_YUY2: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: case PIXEL_FORMAT_YUV422P12: case PIXEL_FORMAT_I422A: @@ -158,7 +150,6 @@ case PIXEL_FORMAT_P210LE: return VideoChromaSampling::k422; case PIXEL_FORMAT_I444: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV444P12: case PIXEL_FORMAT_I444A: @@ -195,11 +186,8 @@ case PIXEL_FORMAT_NV16: case PIXEL_FORMAT_NV21: case PIXEL_FORMAT_NV24: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_YUV422P12: @@ -260,11 +248,8 @@ case PIXEL_FORMAT_UYVY: case PIXEL_FORMAT_YUY2: case PIXEL_FORMAT_MJPEG: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_YUV422P12: @@ -299,11 +284,8 @@ case PIXEL_FORMAT_XRGB: case PIXEL_FORMAT_RGB24: case PIXEL_FORMAT_MJPEG: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_YUV422P12: @@ -358,10 +340,6 @@ case PIXEL_FORMAT_I422A: case PIXEL_FORMAT_I444A: return 8; - case PIXEL_FORMAT_YUV420P9: - case PIXEL_FORMAT_YUV422P9: - case PIXEL_FORMAT_YUV444P9: - return 9; case PIXEL_FORMAT_YUV420P10: case PIXEL_FORMAT_YUV422P10: case PIXEL_FORMAT_YUV444P10:
diff --git a/media/base/video_types.h b/media/base/video_types.h index 13d6271..8b1304d 100644 --- a/media/base/video_types.h +++ b/media/base/video_types.h
@@ -51,11 +51,11 @@ // The P* in the formats below designates the number of bits per pixel // component. I.e. P9 is 9-bits per pixel component, P10 is 10-bits per pixel // component, etc. - PIXEL_FORMAT_YUV420P9 = 16, // 13.5bpp YUV planar. + /* PIXEL_FORMAT_YUV420P9 = 16, Deprecated // 13.5bpp YUV planar. */ PIXEL_FORMAT_YUV420P10 = 17, // 15bpp YUV planar, also known as I010 - PIXEL_FORMAT_YUV422P9 = 18, // 18bpp YUV planar. + /* PIXEL_FORMAT_YUV422P9 = 18, Deprecated // 18bpp YUV planar. */ PIXEL_FORMAT_YUV422P10 = 19, // 20bpp YUV planar. - PIXEL_FORMAT_YUV444P9 = 20, // 27bpp YUV planar. + /* PIXEL_FORMAT_YUV444P9 = 20, Deprecated // 27bpp YUV planar. */ PIXEL_FORMAT_YUV444P10 = 21, // 30bpp YUV planar. PIXEL_FORMAT_YUV420P12 = 22, // 18bpp YUV planar. PIXEL_FORMAT_YUV422P12 = 23, // 24bpp YUV planar.
diff --git a/media/capture/mojom/video_capture_types.mojom b/media/capture/mojom/video_capture_types.mojom index 993841b..fa0dceb 100644 --- a/media/capture/mojom/video_capture_types.mojom +++ b/media/capture/mojom/video_capture_types.mojom
@@ -22,11 +22,11 @@ XRGB, RGB24, MJPEG, - YUV420P9, + YUV420P9_DEPRECATED, YUV420P10, - YUV422P9, + YUV422P9_DEPRECATED, YUV422P10, - YUV444P9, + YUV444P9_DEPRECATED, YUV444P10, YUV420P12, YUV422P12,
diff --git a/media/capture/mojom/video_capture_types_mojom_traits.cc b/media/capture/mojom/video_capture_types_mojom_traits.cc index 149ca77..1e8781d 100644 --- a/media/capture/mojom/video_capture_types_mojom_traits.cc +++ b/media/capture/mojom/video_capture_types_mojom_traits.cc
@@ -116,16 +116,10 @@ return media::mojom::VideoCapturePixelFormat::RGB24; case media::VideoPixelFormat::PIXEL_FORMAT_MJPEG: return media::mojom::VideoCapturePixelFormat::MJPEG; - case media::VideoPixelFormat::PIXEL_FORMAT_YUV420P9: - return media::mojom::VideoCapturePixelFormat::YUV420P9; case media::VideoPixelFormat::PIXEL_FORMAT_YUV420P10: return media::mojom::VideoCapturePixelFormat::YUV420P10; - case media::VideoPixelFormat::PIXEL_FORMAT_YUV422P9: - return media::mojom::VideoCapturePixelFormat::YUV422P9; case media::VideoPixelFormat::PIXEL_FORMAT_YUV422P10: return media::mojom::VideoCapturePixelFormat::YUV422P10; - case media::VideoPixelFormat::PIXEL_FORMAT_YUV444P9: - return media::mojom::VideoCapturePixelFormat::YUV444P9; case media::VideoPixelFormat::PIXEL_FORMAT_YUV444P10: return media::mojom::VideoCapturePixelFormat::YUV444P10; case media::VideoPixelFormat::PIXEL_FORMAT_YUV420P12: @@ -220,21 +214,18 @@ case media::mojom::VideoCapturePixelFormat::MJPEG: *output = media::PIXEL_FORMAT_MJPEG; return true; - case media::mojom::VideoCapturePixelFormat::YUV420P9: - *output = media::PIXEL_FORMAT_YUV420P9; - return true; + case media::mojom::VideoCapturePixelFormat::YUV420P9_DEPRECATED: + NOTREACHED(); case media::mojom::VideoCapturePixelFormat::YUV420P10: *output = media::PIXEL_FORMAT_YUV420P10; return true; - case media::mojom::VideoCapturePixelFormat::YUV422P9: - *output = media::PIXEL_FORMAT_YUV422P9; - return true; + case media::mojom::VideoCapturePixelFormat::YUV422P9_DEPRECATED: + NOTREACHED(); case media::mojom::VideoCapturePixelFormat::YUV422P10: *output = media::PIXEL_FORMAT_YUV422P10; return true; - case media::mojom::VideoCapturePixelFormat::YUV444P9: - *output = media::PIXEL_FORMAT_YUV444P9; - return true; + case media::mojom::VideoCapturePixelFormat::YUV444P9_DEPRECATED: + NOTREACHED(); case media::mojom::VideoCapturePixelFormat::YUV444P10: *output = media::PIXEL_FORMAT_YUV444P10; return true;
diff --git a/media/capture/video/fake_video_capture_device.cc b/media/capture/video/fake_video_capture_device.cc index f23ba12f..ca77770 100644 --- a/media/capture/video/fake_video_capture_device.cc +++ b/media/capture/video/fake_video_capture_device.cc
@@ -150,11 +150,8 @@ case PIXEL_FORMAT_NV16: case PIXEL_FORMAT_NV21: case PIXEL_FORMAT_NV24: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_YUV422P12:
diff --git a/media/cast/openscreen/remoting_proto_enum_utils.cc b/media/cast/openscreen/remoting_proto_enum_utils.cc index 4b5ae69..66efa0c 100644 --- a/media/cast/openscreen/remoting_proto_enum_utils.cc +++ b/media/cast/openscreen/remoting_proto_enum_utils.cc
@@ -356,11 +356,8 @@ CASE_RETURN_OTHER(PIXEL_FORMAT_XRGB); CASE_RETURN_OTHER(PIXEL_FORMAT_RGB24); CASE_RETURN_OTHER(PIXEL_FORMAT_MJPEG); - CASE_RETURN_OTHER(PIXEL_FORMAT_YUV420P9); CASE_RETURN_OTHER(PIXEL_FORMAT_YUV420P10); - CASE_RETURN_OTHER(PIXEL_FORMAT_YUV422P9); CASE_RETURN_OTHER(PIXEL_FORMAT_YUV422P10); - CASE_RETURN_OTHER(PIXEL_FORMAT_YUV444P9); CASE_RETURN_OTHER(PIXEL_FORMAT_YUV444P10); CASE_RETURN_OTHER(PIXEL_FORMAT_YUV420P12); CASE_RETURN_OTHER(PIXEL_FORMAT_YUV422P12);
diff --git a/media/cdm/cdm_type_conversion.cc b/media/cdm/cdm_type_conversion.cc index 84a1348..2edaea87 100644 --- a/media/cdm/cdm_type_conversion.cc +++ b/media/cdm/cdm_type_conversion.cc
@@ -500,16 +500,10 @@ return cdm::kYv12; case PIXEL_FORMAT_I420: return cdm::kI420; - case PIXEL_FORMAT_YUV420P9: - return cdm::kYUV420P9; case PIXEL_FORMAT_YUV420P10: return cdm::kYUV420P10; - case PIXEL_FORMAT_YUV422P9: - return cdm::kYUV422P9; case PIXEL_FORMAT_YUV422P10: return cdm::kYUV422P10; - case PIXEL_FORMAT_YUV444P9: - return cdm::kYUV444P9; case PIXEL_FORMAT_YUV444P10: return cdm::kYUV444P10; case PIXEL_FORMAT_YUV420P12: @@ -530,16 +524,10 @@ return PIXEL_FORMAT_YV12; case cdm::kI420: return PIXEL_FORMAT_I420; - case cdm::kYUV420P9: - return PIXEL_FORMAT_YUV420P9; case cdm::kYUV420P10: return PIXEL_FORMAT_YUV420P10; - case cdm::kYUV422P9: - return PIXEL_FORMAT_YUV422P9; case cdm::kYUV422P10: return PIXEL_FORMAT_YUV422P10; - case cdm::kYUV444P9: - return PIXEL_FORMAT_YUV444P9; case cdm::kYUV444P10: return PIXEL_FORMAT_YUV444P10; case cdm::kYUV420P12:
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index 23ba2cc..023b25c 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc
@@ -975,15 +975,15 @@ case AV_PIX_FMT_YUVA420P: return PIXEL_FORMAT_I420A; + // Default to 10-bit pixel formats for 9-bits since they are non-standard + // and were never seen in the wild. case AV_PIX_FMT_YUV420P9LE: - return PIXEL_FORMAT_YUV420P9; case AV_PIX_FMT_YUV420P10LE: return PIXEL_FORMAT_YUV420P10; case AV_PIX_FMT_YUV420P12LE: return PIXEL_FORMAT_YUV420P12; case AV_PIX_FMT_YUV422P9LE: - return PIXEL_FORMAT_YUV422P9; case AV_PIX_FMT_YUV422P10LE: return PIXEL_FORMAT_YUV422P10; case AV_PIX_FMT_YUV422P12LE: @@ -991,7 +991,6 @@ case AV_PIX_FMT_YUV444P9LE: case AV_PIX_FMT_GBRP9LE: - return PIXEL_FORMAT_YUV444P9; case AV_PIX_FMT_YUV444P10LE: case AV_PIX_FMT_GBRP10LE: return PIXEL_FORMAT_YUV444P10;
diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc index 331d1e77..276591c 100644 --- a/media/filters/ffmpeg_video_decoder.cc +++ b/media/filters/ffmpeg_video_decoder.cc
@@ -153,11 +153,10 @@ if (format == PIXEL_FORMAT_UNKNOWN) return AVERROR(EINVAL); DCHECK(format == PIXEL_FORMAT_I420 || format == PIXEL_FORMAT_I422 || - format == PIXEL_FORMAT_I444 || format == PIXEL_FORMAT_YUV420P9 || - format == PIXEL_FORMAT_YUV420P10 || format == PIXEL_FORMAT_YUV422P9 || - format == PIXEL_FORMAT_YUV422P10 || format == PIXEL_FORMAT_YUV444P9 || - format == PIXEL_FORMAT_YUV444P10 || format == PIXEL_FORMAT_YUV420P12 || - format == PIXEL_FORMAT_YUV422P12 || format == PIXEL_FORMAT_YUV444P12); + format == PIXEL_FORMAT_I444 || format == PIXEL_FORMAT_YUV420P10 || + format == PIXEL_FORMAT_YUV422P10 || format == PIXEL_FORMAT_YUV444P10 || + format == PIXEL_FORMAT_YUV420P12 || format == PIXEL_FORMAT_YUV422P12 || + format == PIXEL_FORMAT_YUV444P12); // Do not trust `codec_context` sizes either. Use whatever `frame` requests. gfx::Size coded_size(frame->width, frame->height);
diff --git a/media/gpu/chromeos/fourcc.cc b/media/gpu/chromeos/fourcc.cc index ba58b51..66da1c4 100644 --- a/media/gpu/chromeos/fourcc.cc +++ b/media/gpu/chromeos/fourcc.cc
@@ -80,11 +80,8 @@ case PIXEL_FORMAT_NV24: case PIXEL_FORMAT_P210LE: case PIXEL_FORMAT_P410LE: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_YUV422P12: @@ -127,11 +124,8 @@ case PIXEL_FORMAT_NV24: case PIXEL_FORMAT_P210LE: case PIXEL_FORMAT_P410LE: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_YUV422P12:
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc index 66d5fedd..b29fbe92 100644 --- a/media/renderers/paint_canvas_video_renderer.cc +++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -567,9 +567,6 @@ libyuv::ARGBToABGR(pixels, row_bytes, pixels, row_bytes, width, rows); break; - case PIXEL_FORMAT_YUV420P9: - case PIXEL_FORMAT_YUV422P9: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV422P12: case PIXEL_FORMAT_YUV444P12: case PIXEL_FORMAT_Y16: @@ -1127,19 +1124,16 @@ switch (video_frame->format()) { case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_YUV420P10: - case PIXEL_FORMAT_YUV420P9: format = PIXEL_FORMAT_I420; break; case PIXEL_FORMAT_YUV422P12: case PIXEL_FORMAT_YUV422P10: - case PIXEL_FORMAT_YUV422P9: format = PIXEL_FORMAT_I422; break; case PIXEL_FORMAT_YUV444P12: case PIXEL_FORMAT_YUV444P10: - case PIXEL_FORMAT_YUV444P9: format = PIXEL_FORMAT_I444; break; @@ -1335,9 +1329,6 @@ scoped_refptr<VideoFrame> temporary_frame; // TODO(thomasanderson): Parallelize converting these formats. switch (video_frame->format()) { - case PIXEL_FORMAT_YUV420P9: - case PIXEL_FORMAT_YUV422P9: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV422P12: case PIXEL_FORMAT_YUV444P12: temporary_frame = DownShiftHighbitVideoFrame(video_frame);
diff --git a/media/renderers/paint_canvas_video_renderer_unittest.cc b/media/renderers/paint_canvas_video_renderer_unittest.cc index 2ca5b03e..cbeff707 100644 --- a/media/renderers/paint_canvas_video_renderer_unittest.cc +++ b/media/renderers/paint_canvas_video_renderer_unittest.cc
@@ -649,8 +649,7 @@ struct params { int bit_depth; VideoPixelFormat format; - } kBitDepthAndFormats[] = {{9, PIXEL_FORMAT_YUV420P9}, - {10, PIXEL_FORMAT_YUV420P10}, + } kBitDepthAndFormats[] = {{10, PIXEL_FORMAT_YUV420P10}, {12, PIXEL_FORMAT_YUV420P12}}; for (const auto param : kBitDepthAndFormats) { // Copy cropped_frame into a highbit frame.
diff --git a/media/renderers/video_frame_yuv_converter.cc b/media/renderers/video_frame_yuv_converter.cc index 9616bb82..b437056 100644 --- a/media/renderers/video_frame_yuv_converter.cc +++ b/media/renderers/video_frame_yuv_converter.cc
@@ -38,11 +38,8 @@ case PIXEL_FORMAT_YV12: case PIXEL_FORMAT_I422: case PIXEL_FORMAT_I444: - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV420P12: case PIXEL_FORMAT_YUV422P12:
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc index 2cfde672..43c55fc 100644 --- a/media/renderers/video_resource_updater.cc +++ b/media/renderers/video_resource_updater.cc
@@ -138,9 +138,6 @@ case PIXEL_FORMAT_YUY2: case PIXEL_FORMAT_RGB24: case PIXEL_FORMAT_MJPEG: - case PIXEL_FORMAT_YUV420P9: - case PIXEL_FORMAT_YUV422P9: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV420P10: case PIXEL_FORMAT_YUV422P10: case PIXEL_FORMAT_YUV444P10: @@ -248,15 +245,12 @@ PlaneConfig::kY_U_V, Subsampling::k444, ChannelFormat::k8); case PIXEL_FORMAT_NV12: return viz::MultiPlaneFormat::kNV12; - case PIXEL_FORMAT_YUV420P9: case PIXEL_FORMAT_YUV420P10: return viz::SharedImageFormat::MultiPlane( PlaneConfig::kY_U_V, Subsampling::k420, ChannelFormat::k10); - case PIXEL_FORMAT_YUV422P9: case PIXEL_FORMAT_YUV422P10: return viz::SharedImageFormat::MultiPlane( PlaneConfig::kY_U_V, Subsampling::k422, ChannelFormat::k10); - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV444P10: return viz::SharedImageFormat::MultiPlane( PlaneConfig::kY_U_V, Subsampling::k444, ChannelFormat::k10);
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc index 3d7c7c1..1791a3d 100644 --- a/media/video/gpu_memory_buffer_video_frame_pool.cc +++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
@@ -688,9 +688,6 @@ case PIXEL_FORMAT_XRGB: case PIXEL_FORMAT_RGB24: case PIXEL_FORMAT_MJPEG: - case PIXEL_FORMAT_YUV422P9: - case PIXEL_FORMAT_YUV420P9: - case PIXEL_FORMAT_YUV444P9: case PIXEL_FORMAT_YUV422P10: case PIXEL_FORMAT_YUV444P10: case PIXEL_FORMAT_YUV420P12:
diff --git a/net/cert/internal/trust_store_chrome.h b/net/cert/internal/trust_store_chrome.h index cade929f..593fc5f0 100644 --- a/net/cert/internal/trust_store_chrome.h +++ b/net/cert/internal/trust_store_chrome.h
@@ -42,12 +42,12 @@ // True if the certificate verifier should enforce X.509 constraints encoded // in the certificate. bool enforce_anchor_constraints; - // If non-empty, the ASCII representation of the Trust Anchor ID + // If non-empty, the binary representation of the Trust Anchor ID // (https://tlswg.org/tls-trust-anchor-ids/draft-ietf-tls-trust-anchor-ids.html) // associated with this anchor -- that is, a relative object identifier in - // dotted decimal form (e.g., "1234.1"). If empty, this anchor has no - // associated Trust Anchor ID. - std::string trust_anchor_id; + // binary representation. If empty, this anchor has no associated Trust Anchor + // ID. + base::span<const uint8_t> trust_anchor_id; }; struct NET_EXPORT ChromeRootCertConstraints {
diff --git a/net/cert/internal/trust_store_chrome_unittest.cc b/net/cert/internal/trust_store_chrome_unittest.cc index effb34d..8ca83d6 100644 --- a/net/cert/internal/trust_store_chrome_unittest.cc +++ b/net/cert/internal/trust_store_chrome_unittest.cc
@@ -422,7 +422,7 @@ anchor->set_enforce_anchor_expiry(enforce_anchor_expiry); anchor->set_enforce_anchor_constraints(enforce_anchor_constraints); anchor->set_tls_trust_anchor(true); - anchor->set_trust_anchor_id("1.2.3.4"); + anchor->set_trust_anchor_id("\x01\x02\x03\x04"); std::optional<ChromeRootStoreData> root_store_data = ChromeRootStoreData::CreateFromRootStoreProto(root_store); @@ -483,7 +483,7 @@ anchor->set_enforce_anchor_expiry(true); anchor->set_enforce_anchor_constraints(true); // |tls_trust_anchor| is left unset here. - anchor->set_trust_anchor_id("1.2.3.4"); + anchor->set_trust_anchor_id("\x01\x02\x03\x04"); std::optional<ChromeRootStoreData> root_store_data = ChromeRootStoreData::CreateFromRootStoreProto(root_store);
diff --git a/net/cert/root_store.proto b/net/cert/root_store.proto index 49bd361..77e6a59 100644 --- a/net/cert/root_store.proto +++ b/net/cert/root_store.proto
@@ -65,12 +65,7 @@ // If true, indicates that this certificate is trusted to issue QWACs. optional bool eutl = 6; - // A unique identifier for a trust anchor, expressed as dotted-decimal text. - // Specified in - // https://www.ietf.org/archive/id/draft-ietf-tls-trust-anchor-ids-00.html, - // Trust Anchor IDs are represented as relative OID suffixes of the Private - // Enterprise Number (PEN) OID prefix of "1.3.6.1.4.1.". - optional string trust_anchor_id = 7; + reserved 7; // When set to true, Chrome will enforce certificate expiry for this // TrustAnchor using the notBefore and notAfter from the corresponding @@ -85,6 +80,13 @@ // If true, indicates that this certificate is a trust anchor for TLS // connections. optional bool tls_trust_anchor = 10; + + // A unique identifier for a trust anchor, in binary representation. + // Specified in + // https://www.ietf.org/archive/id/draft-ietf-tls-trust-anchor-ids-00.html, + // Trust Anchor IDs are represented as relative OID suffixes of the Private + // Enterprise Number (PEN) OID prefix of "1.3.6.1.4.1.". + optional bytes trust_anchor_id = 11; } // Message storing a complete Chrome Root Store.
diff --git a/net/data/ssl/chrome_root_store/test_store.textproto b/net/data/ssl/chrome_root_store/test_store.textproto index 4eee69b..f52f82ee 100644 --- a/net/data/ssl/chrome_root_store/test_store.textproto +++ b/net/data/ssl/chrome_root_store/test_store.textproto
@@ -71,7 +71,7 @@ additional_certs { sha256_hex: "72a34ac2b424aed3f6b0b04755b88cc027dccc806fddb22b4cd7c47773973ec0" enforce_anchor_expiry: true - trust_anchor_id: "1.2.3.4" + trust_anchor_id: "\x01\x01\x01\x01" tls_trust_anchor: true } @@ -79,7 +79,7 @@ additional_certs { sha256_hex: "e6fe22bf45e4f0d3b85c59e02c0f495418e1eb8d3210f788d48cd5e1cb547cd4" enforce_anchor_constraints: true - trust_anchor_id: "3.3.3.3" + trust_anchor_id: "\x03\x03\x03\x03" tls_trust_anchor: true } @@ -88,7 +88,7 @@ sha256_hex: "973a41276ffd01e027a2aad49e34c37846d3e976ff6a620b6712e33832041aa6" enforce_anchor_expiry: true enforce_anchor_constraints: true - trust_anchor_id: "2.2.2.2" + trust_anchor_id: "\x02\x02\x02\x02" tls_trust_anchor: true } @@ -97,7 +97,7 @@ # COMODO RSA Extended Validation Secure Server CA additional_certs { sha256_hex: "7e0e16c0056f41a9f4c61f571503c3bcf079e2bddb228bf2219ac31200496b5c" - trust_anchor_id: "1.2.3.3" + trust_anchor_id: "\x01\x02\x03\x03" } # Anchor for testing that a tls_trust_anchor cert is trusted even if it doesn't have an associated Trust Anchor ID.
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index 5f8c212..143522c3 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-05-14 12:54 UTC +# Last updated: 2025-05-16 12:54 UTC PinsListTimestamp -1747227295 +1747400043 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json index 907769e..60e0a44 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-05-14 12:54 UTC +// Last updated: 2025-05-16 12:54 UTC // { "pinsets": [
diff --git a/net/tools/root_store_tool/root_store_tool.cc b/net/tools/root_store_tool/root_store_tool.cc index 589c8da..242779b 100644 --- a/net/tools/root_store_tool/root_store_tool.cc +++ b/net/tools/root_store_tool/root_store_tool.cc
@@ -197,6 +197,18 @@ // End struct *string_to_write += "};\n"; + if (!anchor.trust_anchor_id().empty()) { + base::StringAppendF(string_to_write, + "constexpr uint8_t k%sTrustAnchorID%d[] = {", + cert_name_prefix, i); + // Convert each character to hex representation, escaped. + for (auto c : anchor.trust_anchor_id()) { + base::StringAppendF(string_to_write, "0x%02xu,", + static_cast<uint8_t>(c)); + } + *string_to_write += "};\n"; + } + if (anchor.constraints_size() > 0) { int constraint_num = 0; for (const auto& constraint : anchor.constraints()) { @@ -262,23 +274,6 @@ } } -// Appends |trust_anchor|'s Trust Anchor ID (or empty string, if not present) to -// |*string_to_write|, with a preceding comma. Returns false if the Trust Anchor -// ID is malformed. -bool WriteTrustAnchorID(const TrustAnchor& anchor, - std::string* string_to_write) { - if (anchor.has_trust_anchor_id()) { - if (anchor.trust_anchor_id().find_first_not_of("0123456789.") != - std::string::npos) { - return false; - } - base::StringAppendF(string_to_write, ", \"%s\"", anchor.trust_anchor_id()); - } else { - *string_to_write += ", \"\""; - } - return true; -} - // Returns true if file was correctly written, false otherwise. bool WriteRootCppFile(const RootStore& root_store, const base::FilePath cpp_path) { @@ -314,8 +309,10 @@ anchor.enforce_anchor_expiry() ? "true" : "false", anchor.enforce_anchor_constraints() ? "true" : "false"); - if (!WriteTrustAnchorID(anchor, &string_to_write)) { - return false; + if (anchor.trust_anchor_id().empty()) { + string_to_write += ", {}"; + } else { + base::StringAppendF(&string_to_write, ", kChromeRootTrustAnchorID%d", i); } string_to_write += "},\n"; } @@ -338,8 +335,10 @@ anchor.enforce_anchor_expiry() ? "true" : "false", anchor.enforce_anchor_constraints() ? "true" : "false"); - if (!WriteTrustAnchorID(anchor, &string_to_write)) { - return false; + if (anchor.trust_anchor_id().empty()) { + string_to_write += ", {}"; + } else { + base::StringAppendF(&string_to_write, ", kAdditionalTrustAnchorID%d", i); } string_to_write += "},\n"; }
diff --git a/services/preferences/tracked/BUILD.gn b/services/preferences/tracked/BUILD.gn index d7f3d62..9dd0e5e 100644 --- a/services/preferences/tracked/BUILD.gn +++ b/services/preferences/tracked/BUILD.gn
@@ -14,6 +14,7 @@ "pref_hash_calculator.h", "pref_hash_filter.cc", "pref_hash_filter.h", + "pref_hash_store.cc", "pref_hash_store.h", "pref_hash_store_impl.cc", "pref_hash_store_impl.h", @@ -56,6 +57,7 @@ deps = [ "//base", + "//components/os_crypt/async/common", "//components/pref_registry", "//components/prefs", "//crypto", @@ -85,7 +87,10 @@ ":tracked", "//base", "//base/test:test_support", + "//components/os_crypt/async/browser:test_support", + "//components/os_crypt/async/common", "//components/prefs:test_support", + "//crypto:crypto", "//services/preferences/public/cpp/tracked:test_support", "//testing/gtest", ]
diff --git a/services/preferences/tracked/DEPS b/services/preferences/tracked/DEPS index 6ccb05e..2620c26d 100644 --- a/services/preferences/tracked/DEPS +++ b/services/preferences/tracked/DEPS
@@ -1,4 +1,7 @@ include_rules = [ "+components/pref_registry", "+crypto/hmac.h", + '+components/os_crypt/async/browser', + '+components/os_crypt/async/common', + '+crypto', ]
diff --git a/services/preferences/tracked/pref_hash_calculator.cc b/services/preferences/tracked/pref_hash_calculator.cc index f5b3b47..a68db48 100644 --- a/services/preferences/tracked/pref_hash_calculator.cc +++ b/services/preferences/tracked/pref_hash_calculator.cc
@@ -10,13 +10,16 @@ #include <string> #include <vector> +#include "base/base64.h" #include "base/functional/bind.h" #include "base/json/json_writer.h" #include "base/notreached.h" +#include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" #include "base/values.h" #include "crypto/hmac.h" +#include "crypto/sha2.h" namespace { @@ -133,6 +136,14 @@ return message; } +// Concatenates |seed|, |path|, and |value_as_string| to give the SHA256 input +// for the encrypted hash scheme. +std::string GetEncryptedHashMessage(const std::string& seed, + const std::string& path, + const std::string& value_as_string) { + return base::StrCat({seed, path, value_as_string}); +} + } // namespace PrefHashCalculator::PrefHashCalculator(const std::string& seed, @@ -184,3 +195,78 @@ } return INVALID; } + +std::optional<std::string> PrefHashCalculator::CalculateEncryptedHash( + const std::string& path, + const base::Value* value, + const os_crypt_async::Encryptor* encryptor) const { + DCHECK(encryptor); + + std::string value_as_string = ValueAsString(value); + std::string message = GetEncryptedHashMessage(seed_, path, value_as_string); + std::string sha256_hash = crypto::SHA256HashString(message); + + // EncryptString returns raw bytes + std::optional<std::vector<uint8_t>> encrypted_bytes = + encryptor->EncryptString(sha256_hash); + + if (!encrypted_bytes) { + return std::nullopt; + } + + // Use Base64Encode version that returns a string. + return base::Base64Encode(*encrypted_bytes); +} + +std::optional<std::string> PrefHashCalculator::CalculateEncryptedHash( + const std::string& path, + const base::Value::Dict* dict, + const os_crypt_async::Encryptor* encryptor) const { + DCHECK(encryptor); + std::string value_as_string = ValueAsString(dict); + std::string message = GetEncryptedHashMessage(seed_, path, value_as_string); + std::string sha256_hash = crypto::SHA256HashString(message); + + // EncryptString returns raw bytes + std::optional<std::vector<uint8_t>> encrypted_bytes = + encryptor->EncryptString(sha256_hash); + + if (!encrypted_bytes) { + return std::nullopt; + } + + // Use Base64Encode version that returns a string. + return base::Base64Encode(*encrypted_bytes); +} + +PrefHashCalculator::ValidationResult PrefHashCalculator::ValidateEncrypted( + const std::string& path, + const base::Value* value, + const std::string& stored_encrypted_hash_base64, + const os_crypt_async::Encryptor* encryptor) const { + DCHECK(encryptor); + + // Base64 decode the stored string back into raw bytes + std::string encrypted_hash_bytes; + if (!base::Base64Decode(stored_encrypted_hash_base64, + &encrypted_hash_bytes)) { + return INVALID_ENCRYPTED; + } + + // Now decrypt the raw bytes + std::string decrypted_hash_string; + if (!encryptor->DecryptString(encrypted_hash_bytes, &decrypted_hash_string)) { + return INVALID_ENCRYPTED; + } + + // Decryption succeeded, now compare the result. + std::string value_as_string = ValueAsString(value); + std::string message = GetEncryptedHashMessage(seed_, path, value_as_string); + std::string expected_sha256_hash = crypto::SHA256HashString(message); + + if (decrypted_hash_string == expected_sha256_hash) { + return VALID_ENCRYPTED; + } else { + return INVALID_ENCRYPTED; + } +}
diff --git a/services/preferences/tracked/pref_hash_calculator.h b/services/preferences/tracked/pref_hash_calculator.h index e9a6cd8..382485a 100644 --- a/services/preferences/tracked/pref_hash_calculator.h +++ b/services/preferences/tracked/pref_hash_calculator.h
@@ -5,10 +5,11 @@ #ifndef SERVICES_PREFERENCES_TRACKED_PREF_HASH_CALCULATOR_H_ #define SERVICES_PREFERENCES_TRACKED_PREF_HASH_CALCULATOR_H_ -#include "base/values.h" - #include <string> +#include "base/values.h" +#include "components/os_crypt/async/common/encryptor.h" + // Calculates and validates preference value hashes. class PrefHashCalculator { public: @@ -17,6 +18,8 @@ VALID, // Valid under a deprecated but as secure algorithm. VALID_SECURE_LEGACY, + VALID_ENCRYPTED, + INVALID_ENCRYPTED, }; // Constructs a PrefHashCalculator using |seed|, |device_id| and @@ -48,6 +51,30 @@ const base::Value::Dict* dict, const std::string& hash) const; + // Calculates the OS-encrypted SHA256 hash of the preference's |path| and + // |value|. Requires a non-null |encryptor|. Returns an empty string on + // failure. + std::optional<std::string> CalculateEncryptedHash( + const std::string& path, + const base::Value* value, + const os_crypt_async::Encryptor* encryptor) const; + + // Calculates the OS-encrypted SHA256 hash of the preference's |path| and + // dictionary |dict|. Requires a non-null |encryptor|. Returns an empty string + // on failure. + std::optional<std::string> CalculateEncryptedHash( + const std::string& path, + const base::Value::Dict* dict, + const os_crypt_async::Encryptor* encryptor) const; + + // Validates the OS-encrypted SHA256 |stored_encrypted_hash| of the + // preference's |path| and |value|. Requires a non-null |encryptor|. + ValidationResult ValidateEncrypted( + const std::string& path, + const base::Value* value, + const std::string& stored_encrypted_hash, + const os_crypt_async::Encryptor* encryptor) const; + private: ValidationResult Validate(const std::string& path, const std::string& value_as_string,
diff --git a/services/preferences/tracked/pref_hash_calculator_unittest.cc b/services/preferences/tracked/pref_hash_calculator_unittest.cc index 9e33542..e1f6430 100644 --- a/services/preferences/tracked/pref_hash_calculator_unittest.cc +++ b/services/preferences/tracked/pref_hash_calculator_unittest.cc
@@ -8,10 +8,31 @@ #include <string> #include <utility> +#include "base/base64.h" +#include "base/json/json_writer.h" #include "base/strings/string_util.h" +#include "base/test/task_environment.h" #include "base/values.h" +#include "components/os_crypt/async/browser/test_utils.h" +#include "crypto/sha2.h" #include "testing/gtest/include/gtest/gtest.h" +namespace { +class PrefHashCalculatorEncryptedTest : public testing::Test { + protected: + const std::string kSeed = "test_seed_for_calculator"; + const std::string kDeviceId = "test_device_id_calc"; + const std::string kLegacyDeviceId = "legacy_test_device_id_calc"; + + PrefHashCalculatorEncryptedTest() + : calculator_(kSeed, kDeviceId, kLegacyDeviceId), + test_encryptor_(os_crypt_async::GetTestEncryptorForTesting()) {} + + PrefHashCalculator calculator_; + const os_crypt_async::TestEncryptor test_encryptor_; +}; +} // namespace + TEST(PrefHashCalculatorTest, TestCurrentAlgorithm) { base::Value string_value_1("string value 1"); base::Value string_value_2("string value 2"); @@ -204,3 +225,98 @@ PrefHashCalculator(kSeed, kNewDeviceId, kLegacyDeviceId) .Validate("pref.path", &string_value, kExpectedValue)); } + +TEST_F(PrefHashCalculatorEncryptedTest, CalculateEncryptedHash) { + base::Value value_int(987); + base::Value value_str("encrypt me"); + base::Value::Dict value_dict; + value_dict.Set("key", "value"); + const base::Value value_dict_val(value_dict.Clone()); + const base::Value* null_ptr = static_cast<const base::Value*>(nullptr); + + std::optional<std::string> hash1_opt = + calculator_.CalculateEncryptedHash("p.int", &value_int, &test_encryptor_); + std::optional<std::string> hash2_opt = + calculator_.CalculateEncryptedHash("p.str", &value_str, &test_encryptor_); + std::optional<std::string> hash1_again_opt = + calculator_.CalculateEncryptedHash("p.int", &value_int, &test_encryptor_); + std::optional<std::string> hash_dict_opt = calculator_.CalculateEncryptedHash( + "p.dict", &value_dict_val, &test_encryptor_); + std::optional<std::string> hash_dict_ptr_opt = + calculator_.CalculateEncryptedHash("p.dict", &value_dict, + &test_encryptor_); + std::optional<std::string> hash_null_opt = + calculator_.CalculateEncryptedHash("p.null", null_ptr, &test_encryptor_); + + // Verify the values. + ASSERT_TRUE(hash1_opt.has_value()); + ASSERT_TRUE(hash2_opt.has_value()); + ASSERT_TRUE(hash1_again_opt.has_value()); + ASSERT_TRUE(hash_dict_opt.has_value()); + ASSERT_TRUE(hash_dict_ptr_opt.has_value()); + ASSERT_TRUE(hash_null_opt.has_value()); + + EXPECT_FALSE(hash1_opt->empty()); + EXPECT_TRUE(base::IsStringUTF8(*hash1_opt) && + base::Base64Decode(*hash1_opt).has_value()); + EXPECT_FALSE(hash2_opt->empty()); + EXPECT_FALSE(hash_dict_opt->empty()); + EXPECT_FALSE(hash_null_opt->empty()); + + // Check different inputs produce different hashes + EXPECT_NE(hash1_opt.value(), hash2_opt.value()); + EXPECT_NE(hash1_opt.value(), hash1_again_opt.value()); + EXPECT_NE(hash_dict_opt.value(), hash_dict_ptr_opt.value()); +} + +TEST_F(PrefHashCalculatorEncryptedTest, ValidateEncryptedHash) { + base::Value value_int(555); + base::Value value_other_int(999); + const base::Value* null_value_ptr = static_cast<const base::Value*>(nullptr); + std::string path = "p.validate"; + + // Generate a VALID hash using the calculator and test encryptor instance + std::optional<std::string> valid_hash_opt = + calculator_.CalculateEncryptedHash(path, &value_int, &test_encryptor_); + ASSERT_TRUE(valid_hash_opt.has_value()); + const std::string& valid_hash_base64 = *valid_hash_opt; + + // Generate hash for null value + std::optional<std::string> null_hash_opt = calculator_.CalculateEncryptedHash( + "p.null", null_value_ptr, &test_encryptor_); + ASSERT_TRUE(null_hash_opt.has_value()); + const std::string& null_hash_base64 = *null_hash_opt; + + // Valid case: Correct value, path, and generated hash + EXPECT_EQ(PrefHashCalculator::VALID_ENCRYPTED, + calculator_.ValidateEncrypted(path, &value_int, valid_hash_base64, + &test_encryptor_)); + + // Wrong value: Correct path and hash, but different value being checked + EXPECT_EQ(PrefHashCalculator::INVALID_ENCRYPTED, + calculator_.ValidateEncrypted(path, &value_other_int, + valid_hash_base64, &test_encryptor_)); + + // Wrong path: Correct value and hash, but different path being checked + EXPECT_EQ(PrefHashCalculator::INVALID_ENCRYPTED, + calculator_.ValidateEncrypted("p.wrong", &value_int, + valid_hash_base64, &test_encryptor_)); + + // Non-Base64 stored hash: Validation should fail (Base64Decode returns false) + EXPECT_EQ(PrefHashCalculator::INVALID_ENCRYPTED, + calculator_.ValidateEncrypted( + path, &value_int, "this is not base64!", &test_encryptor_)); + + // Test validation of null value + EXPECT_EQ(PrefHashCalculator::VALID_ENCRYPTED, + calculator_.ValidateEncrypted("p.null", null_value_ptr, + null_hash_base64, &test_encryptor_)); + // Null expected, int provided -> Invalid + EXPECT_EQ(PrefHashCalculator::INVALID_ENCRYPTED, + calculator_.ValidateEncrypted("p.null", &value_int, + null_hash_base64, &test_encryptor_)); + // Int expected, null provided -> Invalid + EXPECT_EQ(PrefHashCalculator::INVALID_ENCRYPTED, + calculator_.ValidateEncrypted(path, null_value_ptr, + valid_hash_base64, &test_encryptor_)); +}
diff --git a/services/preferences/tracked/pref_hash_filter_unittest.cc b/services/preferences/tracked/pref_hash_filter_unittest.cc index 46412a0f..301f46a2 100644 --- a/services/preferences/tracked/pref_hash_filter_unittest.cc +++ b/services/preferences/tracked/pref_hash_filter_unittest.cc
@@ -149,12 +149,25 @@ // PrefHashStore implementation. std::unique_ptr<PrefHashStoreTransaction> BeginTransaction( - HashStoreContents* storage) override; + HashStoreContents* storage, + const os_crypt_async::Encryptor* encryptor_ptr) override; std::string ComputeMac(const std::string& path, const base::Value* new_value) override; base::Value::Dict ComputeSplitMacs( const std::string& path, const base::Value::Dict* split_values) override; + std::string ComputeEncryptedHash( + const std::string& path, + const base::Value* value, + const os_crypt_async::Encryptor* encryptor_ptr) override; + std::string ComputeEncryptedHash( + const std::string& path, + const base::Value::Dict* dict, + const os_crypt_async::Encryptor* encryptor_ptr) override; + base::Value::Dict ComputeSplitEncryptedHashes( + const std::string& path, + const base::Value::Dict* split_values, + const os_crypt_async::Encryptor* encryptor_ptr) override; private: // A MockPrefHashStoreTransaction is handed to the caller on @@ -192,6 +205,25 @@ void ClearHash(const std::string& path) override; bool IsSuperMACValid() const override; bool StampSuperMac() override; + void StoreEncryptedHash(const std::string& path, + const base::Value* value) override { + // Record this like a normal store operation in this simple mock. + // Pass the base value pointer directly. + outer_->RecordStoreHash(path, value, PrefTrackingStrategy::ATOMIC); + // Note: This doesn't store under the derived key, which might affect + // tests checking internal state directly, but suffices for making the + // class non-abstract and allowing PrefHashFilter calls. + } + std::optional<std::string> GetEncryptedHash( + const std::string& path) const override { + return std::nullopt; + } + std::optional<std::string> GetMac(const std::string& path) const override { + return std::nullopt; + } + bool HasEncryptedHash(const std::string& path) const override { + return false; + } private: raw_ptr<MockPrefHashStore> outer_; @@ -243,8 +275,11 @@ } std::unique_ptr<PrefHashStoreTransaction> MockPrefHashStore::BeginTransaction( - HashStoreContents* storage) { + HashStoreContents* storage, + const os_crypt_async::Encryptor* encryptor_ptr) { EXPECT_FALSE(transaction_active_); + transaction_active_ = true; + // Pass this mock store instance to the nested transaction mock return std::unique_ptr<PrefHashStoreTransaction>( new MockPrefHashStoreTransaction(this)); } @@ -267,6 +302,37 @@ return macs_dict; } +std::string MockPrefHashStore::ComputeEncryptedHash( + const std::string& path, + const base::Value* value, + const os_crypt_async::Encryptor* encryptor_ptr) { + // Return a dummy value, actual calculation not needed for filter test + return "encrypted atomic hash for: " + path; +} + +std::string MockPrefHashStore::ComputeEncryptedHash( + const std::string& path, + const base::Value::Dict* dict, + const os_crypt_async::Encryptor* encryptor_ptr) { + return "encrypted atomic hash for dict: " + path; +} + +base::Value::Dict MockPrefHashStore::ComputeSplitEncryptedHashes( + const std::string& path, + const base::Value::Dict* split_values, + const os_crypt_async::Encryptor* encryptor_ptr) { + base::Value::Dict hashes_dict; + if (!split_values) { + return hashes_dict; + } + for (const auto item : *split_values) { + hashes_dict.Set( + item.first, + base::Value("encrypted split hash for: " + path + "/" + item.first)); + } + return hashes_dict; +} + ValueState MockPrefHashStore::RecordCheckValue(const std::string& path, const void* value, PrefTrackingStrategy strategy) { @@ -1378,7 +1444,7 @@ pref_store_contents_.SetByDottedPath(kDeprecatedTrackedDictionaryEntry, 1234); { std::unique_ptr<PrefHashStoreTransaction> transaction( - mock_pref_hash_store_->BeginTransaction(nullptr)); + mock_pref_hash_store_->PrefHashStore::BeginTransaction(nullptr)); transaction->StoreHash(kDeprecatedTrackedDictionaryEntry, &pref_value); }
diff --git a/services/preferences/tracked/pref_hash_store.cc b/services/preferences/tracked/pref_hash_store.cc new file mode 100644 index 0000000..e8b190b --- /dev/null +++ b/services/preferences/tracked/pref_hash_store.cc
@@ -0,0 +1,19 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/preferences/tracked/pref_hash_store.h" + +#include "services/preferences/tracked/hash_store_contents.h" +#include "services/preferences/tracked/pref_hash_store_transaction.h" + +// Define the default implementation for the one-argument compatibility +// overload of BeginTransaction. +std::unique_ptr<PrefHashStoreTransaction> PrefHashStore::BeginTransaction( + HashStoreContents* storage) { + // Call the primary two-argument overload defined in the interface, + // explicitly passing nullptr for the encryptor pointer. This ensures code + // calling the older signature still works and receives a transaction that + // operates without encryption capabilities enabled for its scope. + return BeginTransaction(storage, nullptr); +}
diff --git a/services/preferences/tracked/pref_hash_store.h b/services/preferences/tracked/pref_hash_store.h index 1745608..26329cc 100644 --- a/services/preferences/tracked/pref_hash_store.h +++ b/services/preferences/tracked/pref_hash_store.h
@@ -9,6 +9,8 @@ #include <string> #include "base/values.h" +#include "components/os_crypt/async/common/encryptor.h" +#include "services/preferences/tracked/pref_hash_calculator.h" #include "services/preferences/tracked/pref_hash_store_transaction.h" class HashStoreContents; @@ -27,7 +29,10 @@ // related transactions should correspond to the same underlying data store. // |storage| must outlive the returned transaction. virtual std::unique_ptr<PrefHashStoreTransaction> BeginTransaction( - HashStoreContents* storage) = 0; + HashStoreContents* storage, + const os_crypt_async::Encryptor* encryptor) = 0; + std::unique_ptr<PrefHashStoreTransaction> BeginTransaction( + HashStoreContents* storage); // Computes the MAC to be associated with |path| and |value| in this store. // PrefHashStoreTransaction typically uses this internally but it's also @@ -43,6 +48,27 @@ virtual base::Value::Dict ComputeSplitMacs( const std::string& path, const base::Value::Dict* split_values) = 0; + + // Computes the OS-encrypted hash for a given path and value. + // Requires a non-null |encryptor|. + virtual std::string ComputeEncryptedHash( + const std::string& path, + const base::Value* value, + const os_crypt_async::Encryptor* encryptor) = 0; + + // Computes the OS-encrypted hash for a given path and dictionary value. + // Requires a non-null |encryptor|. + virtual std::string ComputeEncryptedHash( + const std::string& path, + const base::Value::Dict* dict, + const os_crypt_async::Encryptor* encryptor) = 0; + + // Computes the OS-encrypted hashes for a dictionary split across + // multiple keys. Requires a non-null |encryptor|. + virtual base::Value::Dict ComputeSplitEncryptedHashes( + const std::string& path, + const base::Value::Dict* split_values, + const os_crypt_async::Encryptor* encryptor) = 0; }; #endif // SERVICES_PREFERENCES_TRACKED_PREF_HASH_STORE_H_
diff --git a/services/preferences/tracked/pref_hash_store_impl.cc b/services/preferences/tracked/pref_hash_store_impl.cc index eaacd6e..c70beb5 100644 --- a/services/preferences/tracked/pref_hash_store_impl.cc +++ b/services/preferences/tracked/pref_hash_store_impl.cc
@@ -19,9 +19,23 @@ namespace { +using ValidationResult = PrefHashCalculator::ValidationResult; using ValueState = prefs::mojom::TrackedPreferenceValidationDelegate::ValueState; +// Suffix used to distinguish encrypted hash keys from MAC keys in storage. +const char kEncryptedHashKeySuffix[] = "_encrypted_hash"; + +// Keys expected in the dictionary passed to ImportHash if it contains +// structured data. +const char kImportMacKey[] = "mac"; +const char kImportEncryptedHashKey[] = "encrypted_hash"; + +// Helper to create the key used for storing encrypted hashes. +std::string GetEncryptedHashKey(const std::string& path) { + return path + kEncryptedHashKeySuffix; +} + // Returns a deterministic ID for this machine. std::string GenerateDeviceId() { static base::NoDestructor<std::string> cached_device_id; @@ -49,7 +63,8 @@ // Constructs a PrefHashStoreTransactionImpl which can use the private // members of its |outer| PrefHashStoreImpl. PrefHashStoreTransactionImpl(PrefHashStoreImpl* outer, - HashStoreContents* storage); + HashStoreContents* storage, + const os_crypt_async::Encryptor* encryptor); PrefHashStoreTransactionImpl(const PrefHashStoreTransactionImpl&) = delete; PrefHashStoreTransactionImpl& operator=(const PrefHashStoreTransactionImpl&) = @@ -74,9 +89,48 @@ bool IsSuperMACValid() const override; bool StampSuperMac() override; + void StoreEncryptedHash(const std::string& path, + const base::Value* value) override; + std::optional<std::string> GetEncryptedHash( + const std::string& path) const override; + std::optional<std::string> GetMac(const std::string& path) const override; + bool HasEncryptedHash(const std::string& path) const override; + + // Stores the new split Encrypted Hashes. Requires the encryptor. + void StoreSplitEncryptedHash(const std::string& path, + const base::Value::Dict* split_value); + + // Clears only the Encrypted Hash for the path. + void ClearEncryptedHash(const std::string& path); + + // Gets the stored split encrypted hashes if they exist. Returns false + // otherwise. + bool GetSplitEncryptedHashes( + const std::string& path, + std::map<std::string, std::string>* split_encrypted_hashes) const; + + private: + // Helper for CheckValue to handle validation logic. + ValueState CheckValueInternal( + const std::string& path, + const base::Value* value, + const std::optional<std::string>& stored_encrypted_hash, + const std::optional<std::string>& stored_mac) const; + + // Helper for CheckSplitValue to handle validation logic. + ValueState CheckSplitValueInternal( + const std::string& path, + const base::Value::Dict* initial_split_value, + bool has_encrypted_hashes, + const std::map<std::string, std::string>& split_encrypted_hashes, + bool has_mac_hashes, + const std::map<std::string, std::string>& split_macs, + std::vector<std::string>* invalid_keys) const; + private: raw_ptr<PrefHashStoreImpl> outer_; raw_ptr<HashStoreContents> contents_; + raw_ptr<const os_crypt_async::Encryptor> encryptor_; bool super_mac_valid_; bool super_mac_dirty_; @@ -91,21 +145,25 @@ PrefHashStoreImpl::~PrefHashStoreImpl() {} std::unique_ptr<PrefHashStoreTransaction> PrefHashStoreImpl::BeginTransaction( - HashStoreContents* storage) { - return std::unique_ptr<PrefHashStoreTransaction>( - new PrefHashStoreTransactionImpl(this, storage)); + HashStoreContents* storage, + const os_crypt_async::Encryptor* encryptor) { + return std::make_unique<PrefHashStoreTransactionImpl>(this, storage, + encryptor); } +// Computes the legacy MAC. std::string PrefHashStoreImpl::ComputeMac(const std::string& path, const base::Value* value) { return pref_hash_calculator_.Calculate(path, value); } +// Computes the legacy MAC for a dictionary. std::string PrefHashStoreImpl::ComputeMac(const std::string& path, const base::Value::Dict* dict) { return pref_hash_calculator_.Calculate(path, dict); } +// Computes the split legacy MACs. base::Value::Dict PrefHashStoreImpl::ComputeSplitMacs( const std::string& path, const base::Value::Dict* split_values) { @@ -129,11 +187,68 @@ return split_macs; } +// Computes the encrypted hash. +std::string PrefHashStoreImpl::ComputeEncryptedHash( + const std::string& path, + const base::Value* value, + const os_crypt_async::Encryptor* encryptor) { + DCHECK(encryptor); + std::optional<std::string> result_opt = + pref_hash_calculator_.CalculateEncryptedHash(path, value, encryptor); + + return result_opt.value_or(std::string()); +} + +// Computes the encrypted hash for a dictionary. +std::string PrefHashStoreImpl::ComputeEncryptedHash( + const std::string& path, + const base::Value::Dict* dict, + const os_crypt_async::Encryptor* encryptor) { + DCHECK(encryptor); + std::optional<std::string> result_opt = + pref_hash_calculator_.CalculateEncryptedHash(path, dict, encryptor); + + return result_opt.value_or(std::string()); +} + +// Computes split encrypted hashes. +base::Value::Dict PrefHashStoreImpl::ComputeSplitEncryptedHashes( + const std::string& path, + const base::Value::Dict* split_values, + const os_crypt_async::Encryptor* encryptor) { + if (!encryptor) { + return base::Value::Dict(); + } + if (!split_values || split_values->empty()) { + return base::Value::Dict(); + } + + std::string keyed_path(path); + keyed_path.push_back('.'); + const size_t common_part_length = keyed_path.length(); + + base::Value::Dict split_encrypted_hashes; + for (const auto item : *split_values) { + keyed_path.replace(common_part_length, std::string::npos, item.first); + + std::optional<std::string> result_opt = + pref_hash_calculator_.CalculateEncryptedHash(keyed_path, &item.second, + encryptor); + + if (result_opt.has_value()) { + split_encrypted_hashes.Set(item.first, std::move(*result_opt)); + } + } + return split_encrypted_hashes; +} + PrefHashStoreImpl::PrefHashStoreTransactionImpl::PrefHashStoreTransactionImpl( PrefHashStoreImpl* outer, - HashStoreContents* storage) + HashStoreContents* storage, + const os_crypt_async::Encryptor* encryptor_ptr) : outer_(outer), contents_(storage), + encryptor_(encryptor_ptr), super_mac_valid_(false), super_mac_dirty_(false) { if (!outer_->use_super_mac_) @@ -163,35 +278,121 @@ return contents_->GetUMASuffix(); } +std::optional<std::string> +PrefHashStoreImpl::PrefHashStoreTransactionImpl::GetEncryptedHash( + const std::string& path) const { + std::string encrypted_hash; + if (contents_->GetMac(GetEncryptedHashKey(path), &encrypted_hash)) { + return encrypted_hash; + } + return std::nullopt; +} + +std::optional<std::string> +PrefHashStoreImpl::PrefHashStoreTransactionImpl::GetMac( + const std::string& path) const { + std::string mac_str; + // Get the MAC string from the HashStoreContents. + if (contents_->GetMac(path, &mac_str)) { + return mac_str; + } + return std::nullopt; +} + +bool PrefHashStoreImpl::PrefHashStoreTransactionImpl::GetSplitEncryptedHashes( + const std::string& path, + std::map<std::string, std::string>* split_encrypted_hashes) const { + DCHECK(split_encrypted_hashes); + split_encrypted_hashes->clear(); + // Use the suffixed key to retrieve split encrypted hashes + return contents_->GetSplitMacs(GetEncryptedHashKey(path), + split_encrypted_hashes); +} + +ValueState PrefHashStoreImpl::PrefHashStoreTransactionImpl::CheckValueInternal( + const std::string& path, + const base::Value* value, + const std::optional<std::string>& stored_encrypted_hash, + const std::optional<std::string>& stored_mac) const { + // -- Priority 1: Check encrypted hash -- + if (stored_encrypted_hash.has_value()) { + if (encryptor_) { + ValidationResult encrypted_validation_result = + outer_->pref_hash_calculator_.ValidateEncrypted( + path, value, *stored_encrypted_hash, encryptor_); + + if (encrypted_validation_result == ValidationResult::VALID_ENCRYPTED) { + return ValueState::UNCHANGED; + } else { + // Encrypted hash is invalid or decryption failed. Do NOT fall back. + return value ? ValueState::CHANGED : ValueState::CLEARED; + } + } + } + + // --- Priority 2: Check legacy HMAC --- + if (stored_mac.has_value()) { + ValidationResult mac_validation_result = + outer_->pref_hash_calculator_.Validate(path, value, *stored_mac); + switch (mac_validation_result) { + case ValidationResult::VALID: + // If we fell through from encrypted (which was unusable), a valid MAC + // still means the value is UNCHANGED. + return ValueState::UNCHANGED; + // TODO(crbug.com/415789156): Remove VALID_SECURE_LEGACY from + // ValidationResult. + case ValidationResult::VALID_SECURE_LEGACY: + // If we fell through from encrypted, MAC is valid => SECURE_LEGACY + return ValueState::SECURE_LEGACY; + case ValidationResult::INVALID: + // If encrypted was present but unvalidatable, OR if only MAC was + // present and invalid + return value ? ValueState::CHANGED : ValueState::CLEARED; + default: + NOTREACHED() << "Unexpected PrefHashCalculator::ValidationResult: " + << mac_validation_result; + } + } + + // --- No Usable Hashes Found --- + // Arrive here if: + // 1. No hashes stored at all. + // 2. ONLY encrypted hash stored, but no encryptor (fell through above). + if (!value) { + // Null value is always trusted if no usable hash is present + return ValueState::TRUSTED_NULL_VALUE; + } + + // If we got here ONLY because an encrypted hash was present but unusable + // (due to missing encryptor), treat the value as untrusted regardless of + // the (potentially stale) super_mac_valid_ flag. + if (stored_encrypted_hash.has_value() && !stored_mac.has_value() && + !encryptor_) { + return ValueState::UNTRUSTED_UNKNOWN_VALUE; + } + + // Otherwise (genuinely no hashes stored), base trust on the SuperMAC validity + // state *cached at the start of the transaction*. + if (super_mac_valid_) { + return ValueState::TRUSTED_UNKNOWN_VALUE; + } else { + return ValueState::UNTRUSTED_UNKNOWN_VALUE; + } +} + ValueState PrefHashStoreImpl::PrefHashStoreTransactionImpl::CheckValue( const std::string& path, const base::Value* initial_value) const { - std::string last_hash; - contents_->GetMac(path, &last_hash); - - if (last_hash.empty()) { - // In the absence of a hash for this pref, always trust a NULL value, but - // only trust an existing value if the initial hashes dictionary is trusted. - if (!initial_value) - return ValueState::TRUSTED_NULL_VALUE; - else if (super_mac_valid_) - return ValueState::TRUSTED_UNKNOWN_VALUE; - else - return ValueState::UNTRUSTED_UNKNOWN_VALUE; + // Attempt to retrieve both types of hashes. + std::optional<std::string> encrypted_hash = GetEncryptedHash(path); + std::optional<std::string> mac; + std::string mac_str; + if (contents_->GetMac(path, &mac_str)) { + mac = mac_str; } - PrefHashCalculator::ValidationResult validation_result = - outer_->pref_hash_calculator_.Validate(path, initial_value, last_hash); - switch (validation_result) { - case PrefHashCalculator::VALID: - return ValueState::UNCHANGED; - case PrefHashCalculator::VALID_SECURE_LEGACY: - return ValueState::SECURE_LEGACY; - case PrefHashCalculator::INVALID: - return initial_value ? ValueState::CHANGED : ValueState::CLEARED; - } - NOTREACHED() << "Unexpected PrefHashCalculator::ValidationResult: " - << validation_result; + // Delegate to the internal helper. + return CheckValueInternal(path, initial_value, encrypted_hash, mac); } void PrefHashStoreImpl::PrefHashStoreTransactionImpl::StoreHash( @@ -202,70 +403,161 @@ super_mac_dirty_ = true; } +void PrefHashStoreImpl::PrefHashStoreTransactionImpl::StoreEncryptedHash( + const std::string& path, + const base::Value* value) { + if (!encryptor_) { + return; + } + + const std::string encrypted_hash_str = + outer_->ComputeEncryptedHash(path, value, encryptor_); + + std::string enc_key = GetEncryptedHashKey(path); + + // ComputeEncryptedHash from PrefHashStoreImpl returns "" on failure. + if (!encrypted_hash_str.empty()) { + // Calculation and encryption were successful, store it. + contents_->SetMac(enc_key, encrypted_hash_str); + super_mac_dirty_ = true; + } else { + // Computation failed, ensure no (potentially old or empty) hash is stored. + if (contents_->RemoveEntry(enc_key)) { + super_mac_dirty_ = true; + } + } +} + +ValueState +PrefHashStoreImpl::PrefHashStoreTransactionImpl::CheckSplitValueInternal( + const std::string& path, + const base::Value::Dict* initial_split_value, + bool has_encrypted_hashes, + const std::map<std::string, std::string>& split_encrypted_hashes, + bool has_mac_hashes, + const std::map<std::string, std::string>& split_macs, + std::vector<std::string>* invalid_keys) const { + DCHECK(invalid_keys && invalid_keys->empty()); + + const bool is_initial_value_empty = + (!initial_split_value || initial_split_value->empty()); + + bool try_mac_fallback = false; + bool only_unusable_encrypted_present = false; + + // --- Priority 1: Check split encrypted hashes --- + if (has_encrypted_hashes) { + if (encryptor_) { + if (is_initial_value_empty) { + return ValueState::CLEARED; + } + bool any_invalid = false; + std::map<std::string, std::string> current_encrypted = + split_encrypted_hashes; + std::string keyed_path_base = path + "."; + if (initial_split_value) { + for (const auto item : *initial_split_value) { + std::string keyed_path = keyed_path_base + item.first; + auto it = current_encrypted.find(item.first); + if (it == current_encrypted.end() || + outer_->pref_hash_calculator_.ValidateEncrypted( + keyed_path, &item.second, it->second, encryptor_) != + ValidationResult::VALID_ENCRYPTED) { + invalid_keys->push_back(item.first); + any_invalid = true; + } + if (it != current_encrypted.end()) { + current_encrypted.erase(it); + } + } + } + for (const auto& pair : current_encrypted) { + invalid_keys->push_back(pair.first); + any_invalid = true; + } + return any_invalid ? ValueState::CHANGED : ValueState::UNCHANGED; + } else { + try_mac_fallback = true; + if (!has_mac_hashes) { + only_unusable_encrypted_present = true; + } + } + } + + // --- Priority 2: Check legacy split HMACs --- + // Proceed if no encrypted hashes were found OR if fallback was indicated + if (has_mac_hashes && (!has_encrypted_hashes || try_mac_fallback)) { + if (is_initial_value_empty) { + return ValueState::CLEARED; + } + bool any_invalid = false; + bool has_secure_legacy = false; + std::map<std::string, std::string> current_macs = split_macs; + std::string keyed_path_base = path + "."; + if (initial_split_value) { + for (const auto item : *initial_split_value) { + std::string keyed_path = keyed_path_base + item.first; + auto it = current_macs.find(item.first); + if (it == current_macs.end()) { + invalid_keys->push_back(item.first); + any_invalid = true; + } else { + ValidationResult result = outer_->pref_hash_calculator_.Validate( + keyed_path, &item.second, it->second); + if (result == ValidationResult::INVALID) { + invalid_keys->push_back(item.first); + any_invalid = true; + } else if (result == ValidationResult::VALID_SECURE_LEGACY) { + has_secure_legacy = true; + } + current_macs.erase(it); + } + } + } + for (const auto& pair : current_macs) { + invalid_keys->push_back(pair.first); + any_invalid = true; + } + return any_invalid ? ValueState::CHANGED + : (has_secure_legacy ? ValueState::SECURE_LEGACY + : ValueState::UNCHANGED); + } + + // --- No Usable Hashes Found --- + // Arrive here if: + // 1. No hashes stored at all. + // 2. ONLY encrypted hashes stored, but no encryptor (fell through). + if (is_initial_value_empty) { + return ValueState::UNCHANGED; + } + + if (only_unusable_encrypted_present) { + return ValueState::UNTRUSTED_UNKNOWN_VALUE; + } + + // Otherwise (genuinely no hashes at all, or MACs were checked and failed), + // base trust on SuperMAC validity *cached at the start of the transaction*. + if (super_mac_valid_) { + return ValueState::TRUSTED_UNKNOWN_VALUE; + } else { + return ValueState::UNTRUSTED_UNKNOWN_VALUE; + } +} + ValueState PrefHashStoreImpl::PrefHashStoreTransactionImpl::CheckSplitValue( const std::string& path, const base::Value::Dict* initial_split_value, std::vector<std::string>* invalid_keys) const { - DCHECK(invalid_keys && invalid_keys->empty()); + // Attempt to retrieve both types of split hashes. + std::map<std::string, std::string> split_encrypted_hashes; + bool has_encrypted = GetSplitEncryptedHashes(path, &split_encrypted_hashes); std::map<std::string, std::string> split_macs; - const bool has_hashes = contents_->GetSplitMacs(path, &split_macs); + bool has_macs = contents_->GetSplitMacs(path, &split_macs); - // Treat NULL and empty the same; otherwise we would need to store a hash for - // the entire dictionary (or some other special beacon) to differentiate these - // two cases which are really the same for dictionaries. - if (!initial_split_value || initial_split_value->empty()) { - return has_hashes ? ValueState::CLEARED : ValueState::UNCHANGED; - } - - if (!has_hashes) - return super_mac_valid_ ? ValueState::TRUSTED_UNKNOWN_VALUE - : ValueState::UNTRUSTED_UNKNOWN_VALUE; - - bool has_secure_legacy_id_hashes = false; - std::string keyed_path(path); - keyed_path.push_back('.'); - const size_t common_part_length = keyed_path.length(); - for (const auto item : *initial_split_value) { - std::map<std::string, std::string>::iterator entry = - split_macs.find(item.first); - if (entry == split_macs.end()) { - invalid_keys->push_back(item.first); - } else { - // Keep the common part from the old |keyed_path| and replace the key to - // get the new |keyed_path|. - keyed_path.replace(common_part_length, std::string::npos, item.first); - switch (outer_->pref_hash_calculator_.Validate(keyed_path, &item.second, - entry->second)) { - case PrefHashCalculator::VALID: - break; - case PrefHashCalculator::VALID_SECURE_LEGACY: - // Secure legacy device IDs based hashes are still accepted, but we - // should make sure to notify the caller for them to update the legacy - // hashes. - has_secure_legacy_id_hashes = true; - break; - case PrefHashCalculator::INVALID: - invalid_keys->push_back(item.first); - break; - } - // Remove processed MACs, remaining MACs at the end will also be - // considered invalid. - split_macs.erase(entry); - } - } - - // Anything left in the map is missing from the data. - for (std::map<std::string, std::string>::const_iterator it = - split_macs.begin(); - it != split_macs.end(); ++it) { - invalid_keys->push_back(it->first); - } - - return invalid_keys->empty() - ? (has_secure_legacy_id_hashes ? ValueState::SECURE_LEGACY - : ValueState::UNCHANGED) - : ValueState::CHANGED; + return CheckSplitValueInternal(path, initial_split_value, has_encrypted, + split_encrypted_hashes, has_macs, split_macs, + invalid_keys); } void PrefHashStoreImpl::PrefHashStoreTransactionImpl::StoreSplitHash( @@ -285,28 +577,149 @@ super_mac_dirty_ = true; } +void PrefHashStoreImpl::PrefHashStoreTransactionImpl::StoreSplitEncryptedHash( + const std::string& path, + const base::Value::Dict* split_value) { + // Encrypted hash requires the encryptor. + if (!encryptor_) { + return; + } + + // Remove any existing single MAC entry for the base path. + contents_->RemoveEntry(path); + // Also remove any existing single *encrypted hash* entry for the base path + contents_->RemoveEntry(GetEncryptedHashKey(path)); + + // Use the derived key for storing split encrypted hashes. + const std::string encrypted_hash_base_key = GetEncryptedHashKey(path); + + if (split_value) { + base::Value::Dict split_encrypted_hashes = + outer_->ComputeSplitEncryptedHashes(path, split_value, encryptor_); + + for (const auto item : split_encrypted_hashes) { + DCHECK(item.second.is_string()); + // Store using the derived base key. + contents_->SetSplitMac(encrypted_hash_base_key, item.first, + item.second.GetString()); + } + } + super_mac_dirty_ = true; +} + bool PrefHashStoreImpl::PrefHashStoreTransactionImpl::HasHash( const std::string& path) const { std::string out_value; std::map<std::string, std::string> out_values; - return contents_->GetMac(path, &out_value) || + return HasEncryptedHash(path) || contents_->GetMac(path, &out_value) || contents_->GetSplitMacs(path, &out_values); } +bool PrefHashStoreImpl::PrefHashStoreTransactionImpl::HasEncryptedHash( + const std::string& path) const { + std::string out_value; + const std::string encrypted_key = GetEncryptedHashKey(path); + std::map<std::string, std::string> out_values; + return contents_->GetMac(encrypted_key, &out_value) || + contents_->GetSplitMacs(encrypted_key, &out_values); +} + void PrefHashStoreImpl::PrefHashStoreTransactionImpl::ImportHash( const std::string& path, const base::Value* hash) { DCHECK(hash); + bool changed = false; - contents_->ImportEntry(path, hash); + if (hash->is_string()) { + // --- Case 1: Input is a string --- + // Legacy MAC. Import it and clear any existing encrypted + // hash. + contents_->ImportEntry(path, hash); + if (contents_->RemoveEntry(GetEncryptedHashKey(path))) { + changed = true; + } + // ImportEntry itself implies a change, so mark dirty regardless of + // RemoveEntry result. + changed = true; - if (super_mac_valid_) + } else if (hash->is_dict()) { + // --- Case 2: Input is a dict --- + const base::Value::Dict& dict = hash->GetDict(); + + // Handle MAC part + const std::string* mac_str_ptr = dict.FindString(kImportMacKey); + if (mac_str_ptr) { + // Import the MAC if found in the dictionary + base::Value mac_value(*mac_str_ptr); + contents_->ImportEntry(path, &mac_value); + changed = true; + } else { + // If "mac" key is NOT in the dictionary, clear any existing MAC for this + // path. + if (contents_->RemoveEntry(path)) { + changed = true; + } + } + + // Handle Encrypted Hash part + const std::string* encrypted_hash_str_ptr = + dict.FindString(kImportEncryptedHashKey); + if (encrypted_hash_str_ptr) { + // Import the encrypted hash if found in the dictionary, using the derived + // key. + base::Value encrypted_hash_value(*encrypted_hash_str_ptr); + contents_->ImportEntry(GetEncryptedHashKey(path), &encrypted_hash_value); + changed = true; + } else { + // If "encrypted_hash" key is NOT in the dictionary, clear any existing + // encrypted hash for this path (using the derived key). + if (contents_->RemoveEntry(GetEncryptedHashKey(path))) { + changed = true; + } + } + + } else { + return; + } + + // If any import or removal happened and the store was considered valid, mark + // super MAC as dirty. + if (changed && super_mac_valid_) { super_mac_dirty_ = true; + } else if (hash->is_string() || hash->is_dict()) { + if (super_mac_valid_) { + super_mac_dirty_ = true; + } + } } void PrefHashStoreImpl::PrefHashStoreTransactionImpl::ClearHash( const std::string& path) { - if (contents_->RemoveEntry(path) && super_mac_valid_) { + bool changed = false; + std::string enc_key = GetEncryptedHashKey(path); // Get derived key once + + // Remove atomic MAC entry OR split MAC dictionary at 'path' + if (contents_->RemoveEntry(path)) { + changed = true; + } + + // Remove atomic Encrypted Hash entry OR split encrypted hash dictionary at + // derived key + if (contents_->RemoveEntry(enc_key)) { + changed = true; + } + + // Mark SuperMAC dirty only if something was actually removed AND if the + // SuperMAC was considered valid at the start of the transaction. + if (changed && super_mac_valid_) { + super_mac_dirty_ = true; + } +} + +void PrefHashStoreImpl::PrefHashStoreTransactionImpl::ClearEncryptedHash( + const std::string& path) { + // Clear only the Encrypted Hash (atomic and split) using the derived key. + if (contents_->RemoveEntry(GetEncryptedHashKey(path)) && super_mac_valid_) { super_mac_dirty_ = true; } } @@ -316,8 +729,10 @@ } bool PrefHashStoreImpl::PrefHashStoreTransactionImpl::StampSuperMac() { - if (!outer_->use_super_mac_ || super_mac_valid_) + if (!outer_->use_super_mac_) { return false; + } super_mac_dirty_ = true; + super_mac_valid_ = true; return true; }
diff --git a/services/preferences/tracked/pref_hash_store_impl.h b/services/preferences/tracked/pref_hash_store_impl.h index d2fe7d2..dbbe41d 100644 --- a/services/preferences/tracked/pref_hash_store_impl.h +++ b/services/preferences/tracked/pref_hash_store_impl.h
@@ -24,6 +24,8 @@ VERSION_LATEST = 2, }; + using PrefHashStore::BeginTransaction; + // Constructs a PrefHashStoreImpl that calculates hashes using // |seed| and |legacy_device_id| and stores them in |contents|. // @@ -44,7 +46,8 @@ // PrefHashStore implementation. std::unique_ptr<PrefHashStoreTransaction> BeginTransaction( - HashStoreContents* storage) override; + HashStoreContents* storage, + const os_crypt_async::Encryptor* encryptor) override; std::string ComputeMac(const std::string& path, const base::Value* new_value) override; @@ -52,7 +55,23 @@ const std::string& path, const base::Value::Dict* split_values) override; + std::string ComputeEncryptedHash( + const std::string& path, + const base::Value* value, + const os_crypt_async::Encryptor* encryptor) override; + + std::string ComputeEncryptedHash( + const std::string& path, + const base::Value::Dict* dict, + const os_crypt_async::Encryptor* encryptor) override; + + base::Value::Dict ComputeSplitEncryptedHashes( + const std::string& path, + const base::Value::Dict* split_values, + const os_crypt_async::Encryptor* encryptor) override; + private: + friend class PrefHashStoreImplEncryptedTest; class PrefHashStoreTransactionImpl; std::string ComputeMac(const std::string& path,
diff --git a/services/preferences/tracked/pref_hash_store_impl_unittest.cc b/services/preferences/tracked/pref_hash_store_impl_unittest.cc index 98ad444..9867a53 100644 --- a/services/preferences/tracked/pref_hash_store_impl_unittest.cc +++ b/services/preferences/tracked/pref_hash_store_impl_unittest.cc
@@ -6,15 +6,38 @@ #include <string> +#include "base/base64.h" #include "base/values.h" +#include "components/os_crypt/async/browser/test_utils.h" +#include "components/os_crypt/async/common/encryptor.h" +#include "services/preferences/public/mojom/tracked_preference_validation_delegate.mojom.h" #include "services/preferences/tracked/dictionary_hash_store_contents.h" #include "services/preferences/tracked/hash_store_contents.h" +#include "services/preferences/tracked/pref_hash_calculator.h" #include "services/preferences/tracked/pref_hash_store_transaction.h" #include "testing/gtest/include/gtest/gtest.h" +namespace { using ValueState = prefs::mojom::TrackedPreferenceValidationDelegate::ValueState; +// Helper to get derived key for encrypted hashes; this is a replicate of the +// function in the .cc file. +std::string GetEncKey(const std::string& path) { + return path + "_encrypted_hash"; +} + +// Helper to get derived key for encrypted split hashes; calling the GetEncKey +// directly for testing. +std::string GetSplitEncKeyBase(const std::string& path) { + return GetEncKey(path); +} +// Keys expected in the dictionary passed to ImportHash if it contains +// structured data. +const char kImportMacKey[] = "mac"; +const char kImportEncryptedHashKey[] = "encrypted_hash"; +} // namespace + class PrefHashStoreImplTest : public testing::Test { public: PrefHashStoreImplTest() : contents_(pref_store_contents_) {} @@ -542,3 +565,906 @@ EXPECT_TRUE(invalid_keys.empty()); } } + +class PrefHashStoreImplEncryptedTest : public testing::Test { + public: + const std::string kSeed = "test_seed_store_encrypted"; + const std::string kLegacyDeviceId = "legacy_test_device_id_store_encrypted"; + + PrefHashStoreImplEncryptedTest() + : hash_store_(kSeed, kLegacyDeviceId, /*use_super_mac=*/true), + test_encryptor_(os_crypt_async::GetTestEncryptorForTesting()), + dictionary_contents_(pref_store_contents_) {} + + protected: + std::unique_ptr<PrefHashStoreTransaction> BeginTransaction( + bool with_encryptor) { + const os_crypt_async::Encryptor* encryptor_arg = + with_encryptor ? &test_encryptor_ : nullptr; + return hash_store_.BeginTransaction(&dictionary_contents_, encryptor_arg); + } + + void VerifyStoredHashes( + const std::string& path, + const std::optional<std::string>& expected_mac, + const std::optional<std::string>& expected_encrypted_b64) { + SCOPED_TRACE("Verifying hashes for path: " + path); + std::string stored_mac; + bool has_mac = dictionary_contents_.GetMac(path, &stored_mac); + EXPECT_EQ(expected_mac.has_value(), has_mac); + if (expected_mac) { + EXPECT_EQ(*expected_mac, stored_mac); + } + std::string stored_enc; + bool has_enc = dictionary_contents_.GetMac(GetEncKey(path), &stored_enc); + EXPECT_EQ(expected_encrypted_b64.has_value(), has_enc); + if (expected_encrypted_b64) { + EXPECT_EQ(*expected_encrypted_b64, stored_enc); + } + } + + void VerifyStoredSplitHashes( + const std::string& base_path, + const std::string& key, // sub-key within the split dict + const std::optional<std::string>& expected_mac, + const std::optional<std::string>& expected_encrypted_b64) { + SCOPED_TRACE("Verifying split hashes for path: " + base_path + "." + key); + std::map<std::string, std::string> split_macs; + dictionary_contents_.GetSplitMacs(base_path, &split_macs); + + auto mac_it = split_macs.find(key); + EXPECT_EQ(expected_mac.has_value(), mac_it != split_macs.end()); + if (expected_mac && mac_it != split_macs.end()) { + EXPECT_EQ(*expected_mac, mac_it->second); + } else if (expected_mac) { + ADD_FAILURE() << "Expected MAC for " << key << " not found."; + } + + std::map<std::string, std::string> split_enc_hashes; + dictionary_contents_.GetSplitMacs(GetSplitEncKeyBase(base_path), + &split_enc_hashes); + auto enc_it = split_enc_hashes.find(key); + EXPECT_EQ(expected_encrypted_b64.has_value(), + enc_it != split_enc_hashes.end()); + if (expected_encrypted_b64 && enc_it != split_enc_hashes.end()) { + EXPECT_EQ(*expected_encrypted_b64, enc_it->second); + } else if (expected_encrypted_b64) { + ADD_FAILURE() << "Expected Encrypted Hash for " << key << " not found."; + } + } + + void MakeSuperMACInvalid() { dictionary_contents_.SetSuperMac("invalid"); } + void MakeSuperMACValid() { + const base::Value::Dict* macs_dict = GetCurrentDictionaryContents(); + std::string valid_super_mac; + if (macs_dict) { + base::Value dict_value_wrapper(macs_dict->Clone()); + valid_super_mac = hash_store_.ComputeMac("", &dict_value_wrapper); + } else { + valid_super_mac = + hash_store_.ComputeMac("", static_cast<const base::Value*>(nullptr)); + } + dictionary_contents_.SetSuperMac(valid_super_mac); + } + + void SeedAtomicMac(const std::string& path, const std::string& mac_value) { + dictionary_contents_.SetMac(path, mac_value); + } + + void SeedAtomicEncryptedHash(const std::string& path, + const std::string& eh_value_b64) { + dictionary_contents_.SetMac(GetEncKey(path), eh_value_b64); + } + + void SeedSplitMacs(const std::string& path, + const base::Value::Dict* dict_to_hash) { + // Remove any existing entry at this path (atomic or old split dict) + dictionary_contents_.RemoveEntry(path); + if (dict_to_hash) { + base::Value::Dict macs = hash_store_.ComputeSplitMacs(path, dict_to_hash); + for (const auto item : macs) { + if (item.second.is_string()) { + dictionary_contents_.SetSplitMac(path, item.first, + item.second.GetString()); + } + } + } + } + + void SeedSplitEncryptedHashes(const std::string& path, + const base::Value::Dict* computed_hashes_dict) { + std::string enc_base_key = GetSplitEncKeyBase(path); + dictionary_contents_.RemoveEntry( + enc_base_key); // Remove potentially conflicting atomic entry + dictionary_contents_.RemoveEntry( + enc_base_key); // Remove old split dict if present + if (computed_hashes_dict) { + for (auto item : *computed_hashes_dict) { + if (item.second.is_string()) { + dictionary_contents_.SetSplitMac(enc_base_key, item.first, + item.second.GetString()); + } + } + } + } + + // Seeds split encrypted hashes by computing them first. + void SeedSplitEncryptedHashesFromValues( + const std::string& path, + const base::Value::Dict* values_to_hash) { + std::string enc_base_key = GetSplitEncKeyBase(path); + dictionary_contents_.RemoveEntry(enc_base_key); + if (values_to_hash) { + base::Value::Dict computed_hashes = + hash_store_.ComputeSplitEncryptedHashes(path, values_to_hash, + &test_encryptor_); + for (auto item : computed_hashes) { + if (item.second.is_string()) { + dictionary_contents_.SetSplitMac(enc_base_key, item.first, + item.second.GetString()); + } + } + } + } + + const base::Value::Dict* GetCurrentDictionaryContents() { + return dictionary_contents_.GetContents(); + } + + PrefHashStoreImpl hash_store_; + os_crypt_async::Encryptor test_encryptor_; + base::Value::Dict pref_store_contents_; + DictionaryHashStoreContents dictionary_contents_; +}; + +TEST_F(PrefHashStoreImplEncryptedTest, StoreAndGetHashes) { + base::Value value("test_value"); + std::string path = "test.pref"; + std::optional<std::string> stored_mac; + std::optional<std::string> stored_enc_b64; + + // Store both hashes using transaction with encryptor + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + tx->StoreHash(path, &value); + tx->StoreEncryptedHash(path, &value); + stored_mac = tx->GetMac(path); + stored_enc_b64 = tx->GetEncryptedHash(path); + } + + // Verify the transaction stored non-empty hashes + ASSERT_TRUE(stored_mac.has_value()); + ASSERT_FALSE(stored_mac->empty()); + ASSERT_TRUE(stored_enc_b64.has_value()); + ASSERT_FALSE(stored_enc_b64->empty()); + + // Verify storage in contents directly. + VerifyStoredHashes(path, stored_mac, stored_enc_b64); + + // Verify retrieval via a new transaction matches what was stored + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + EXPECT_TRUE(tx->HasHash(path)); + EXPECT_TRUE(tx->HasEncryptedHash(path)); + EXPECT_EQ(stored_mac, tx->GetMac(path)); + EXPECT_EQ(stored_enc_b64, tx->GetEncryptedHash(path)); + } +} + +TEST_F(PrefHashStoreImplEncryptedTest, StoreHashOnly) { + base::Value value("mac_only_value"); + std::string path = "mac.only.pref"; + std::optional<std::string> stored_mac; + + // Store only MAC hash + { + auto tx = BeginTransaction(/*with_encryptor=*/false); + tx->StoreHash(path, &value); + stored_mac = tx->GetMac(path); + } + + ASSERT_TRUE(stored_mac.has_value()); + ASSERT_FALSE(stored_mac->empty()); + + // Verify storage in contents + VerifyStoredHashes(path, stored_mac, std::nullopt); + + // Verify retrieval via transaction + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + EXPECT_TRUE(tx->HasHash(path)); + EXPECT_FALSE(tx->HasEncryptedHash(path)); + EXPECT_EQ(stored_mac, tx->GetMac(path)); + EXPECT_EQ(std::nullopt, tx->GetEncryptedHash(path)); + } +} + +TEST_F(PrefHashStoreImplEncryptedTest, CheckValueValidation) { + base::Value value("test_value"); + base::Value wrong_value("wrong_value"); + const base::Value* null_value_ptr = nullptr; + std::string path = "check.pref"; + + // Test with encryptor. + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + ASSERT_TRUE(tx); + MakeSuperMACInvalid(); + + // Scenario 1: Store both, check valid, check wrong, check null + tx->StoreHash(path, &value); + tx->StoreEncryptedHash(path, &value); + EXPECT_EQ(ValueState::UNCHANGED, tx->CheckValue(path, &value)); + EXPECT_EQ(ValueState::CHANGED, tx->CheckValue(path, &wrong_value)); + EXPECT_EQ(ValueState::CLEARED, tx->CheckValue(path, null_value_ptr)); + + // Scenario 2: Store only MAC, check valid, check wrong, check null + tx->ClearHash(path); + tx->StoreHash(path, &value); + // Encrypted missing, fallback to MAC -> UNCHANGED + EXPECT_EQ(ValueState::UNCHANGED, tx->CheckValue(path, &value)); + EXPECT_EQ(ValueState::CHANGED, tx->CheckValue(path, &wrong_value)); + EXPECT_EQ(ValueState::CLEARED, tx->CheckValue(path, null_value_ptr)); + + // Scenario 3: Store only Encrypted, check valid, check wrong, check null + tx->ClearHash(path); + tx->StoreEncryptedHash(path, &value); + // MAC missing, Encrypted OK -> UNCHANGED + EXPECT_EQ(ValueState::UNCHANGED, tx->CheckValue(path, &value)); + EXPECT_EQ(ValueState::CHANGED, tx->CheckValue(path, &wrong_value)); + EXPECT_EQ(ValueState::CLEARED, tx->CheckValue(path, null_value_ptr)); + + // Scenario 4: Store invalid Encrypted, valid MAC -> CHANGED (Enc preferred) + tx->ClearHash(path); + tx->StoreHash(path, &value); + // Manually seed bad data. + dictionary_contents_.SetMac(GetEncKey(path), "Invalid Base64"); + EXPECT_EQ(ValueState::CHANGED, tx->CheckValue(path, &value)); + + // Scenario 5: Store MAC for null, check null, check value. + tx->ClearHash(path); + tx->StoreHash(path, null_value_ptr); + tx->StoreEncryptedHash(path, null_value_ptr); + EXPECT_EQ(ValueState::UNCHANGED, tx->CheckValue(path, null_value_ptr)); + EXPECT_EQ(ValueState::CHANGED, tx->CheckValue(path, &value)); + + // Scenario 6: No Hashes stored, SuperMAC invalid + tx->ClearHash(path); + MakeSuperMACInvalid(); + EXPECT_EQ(ValueState::UNTRUSTED_UNKNOWN_VALUE, + tx->CheckValue(path, &value)); + EXPECT_EQ(ValueState::TRUSTED_NULL_VALUE, + tx->CheckValue(path, null_value_ptr)); + + // Scenario 7: No Hashes stored, SuperMAC valid + MakeSuperMACValid(); + // Stamp based on current transaction state + ASSERT_TRUE(tx->StampSuperMac()); + ASSERT_TRUE(tx->IsSuperMACValid()); + EXPECT_EQ(ValueState::TRUSTED_UNKNOWN_VALUE, tx->CheckValue(path, &value)); + EXPECT_EQ(ValueState::TRUSTED_NULL_VALUE, + tx->CheckValue(path, null_value_ptr)); + } + + // Test without encryptor. + { + auto tx = BeginTransaction(/*with_encryptor=*/false); + ASSERT_TRUE(tx); + MakeSuperMACInvalid(); + + // Scenario 1: Store only MAC (cannot store encrypted), check valid, check + // wrong, check null + tx->StoreHash(path, &value); + EXPECT_EQ(ValueState::UNCHANGED, tx->CheckValue(path, &value)); + EXPECT_EQ(ValueState::CHANGED, tx->CheckValue(path, &wrong_value)); + EXPECT_EQ(ValueState::CLEARED, tx->CheckValue(path, null_value_ptr)); + + // Scenario 2: Store MAC for null, check null, check value + tx->ClearHash(path); + tx->StoreHash(path, null_value_ptr); + EXPECT_EQ(ValueState::UNCHANGED, tx->CheckValue(path, null_value_ptr)); + EXPECT_EQ(ValueState::CHANGED, tx->CheckValue(path, &value)); + + // Scenario 3: Simulate Encrypted Hash only present (can't store this way + // w/o encryptor). + tx->ClearHash(path); + std::string enc_only_hash = base::Base64Encode("OnlyEncryptedData"); + dictionary_contents_.SetMac(GetEncKey(path), enc_only_hash); + EXPECT_EQ(ValueState::UNTRUSTED_UNKNOWN_VALUE, + tx->CheckValue(path, &value)); + + // Scenario 4: Simulate Invalid Enc, Valid MAC present + tx->ClearHash(path); + tx->StoreHash(path, &value); + dictionary_contents_.SetMac(GetEncKey(path), "Invalid Base64"); + EXPECT_EQ(ValueState::UNCHANGED, tx->CheckValue(path, &value)); + } +} + +TEST_F(PrefHashStoreImplEncryptedTest, ClearHashTest) { + base::Value value("value"); + std::string path = "clear.test"; + std::optional<std::string> stored_mac; + std::optional<std::string> stored_enc_b64; + + // Store both using transaction + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + tx->StoreHash(path, &value); + tx->StoreEncryptedHash(path, &value); + stored_mac = tx->GetMac(path); + stored_enc_b64 = tx->GetEncryptedHash(path); + } + ASSERT_TRUE(stored_mac.has_value()); + ASSERT_TRUE(stored_enc_b64.has_value()); + ASSERT_TRUE(dictionary_contents_.GetMac(path, nullptr)); + ASSERT_TRUE(dictionary_contents_.GetMac(GetEncKey(path), nullptr)); + + // Clear via transaction + { + auto tx = BeginTransaction(/*with_encryptor=*/false); + tx->ClearHash(path); + } + // Verify cleared from contents using direct check + EXPECT_FALSE(dictionary_contents_.GetMac(path, nullptr)); + EXPECT_FALSE(dictionary_contents_.GetMac(GetEncKey(path), nullptr)); +} + +TEST_F(PrefHashStoreImplEncryptedTest, CheckSplitValueEncryptedPathValidation) { + const std::string kPrefPath = "my.split.pref.encrypted"; + std::vector<std::string> actual_invalid_keys; + + // Helper lambda to run a specific test case scenario + auto run_scenario = + [&](const std::string& scenario_name, + const base::Value::Dict* current_pref_dict_ptr, + const base::Value::Dict& original_values_for_hashing, + ValueState expected_state, + const std::vector<std::string>& expected_invalid_key_list) { + SCOPED_TRACE("Scenario: " + scenario_name); + + pref_store_contents_.clear(); + dictionary_contents_.Reset(); + actual_invalid_keys.clear(); + MakeSuperMACInvalid(); + // 1. Seed the encrypted hashes into dictionary_contents_ + // These are the "stored" hashes. + base::Value::Dict computed_split_encrypted_hashes = + hash_store_.ComputeSplitEncryptedHashes( + kPrefPath, &original_values_for_hashing, &test_encryptor_); + SeedSplitEncryptedHashes(kPrefPath, &computed_split_encrypted_hashes); + + // 2. Ensure no MACs are present for this path to isolate the encrypted + // path + SeedSplitMacs(kPrefPath, nullptr); + + // 3. Perform CheckSplitValue with encryptor present + auto tx = BeginTransaction(/*with_encryptor=*/true); + ValueState result_state = tx->CheckSplitValue( + kPrefPath, current_pref_dict_ptr, &actual_invalid_keys); + + // 4. Verify results + EXPECT_EQ(expected_state, result_state); + std::sort(actual_invalid_keys.begin(), actual_invalid_keys.end()); + std::vector<std::string> sorted_expected_keys = + expected_invalid_key_list; + std::sort(sorted_expected_keys.begin(), sorted_expected_keys.end()); + EXPECT_EQ(sorted_expected_keys, actual_invalid_keys); + }; + + // --- Test Scenarios for the if (encryptor_) block --- + // --- These tests are triggered when an encryptor_ is present --- + + // Scenario E1: All Keys Match, Hashes Valid + base::Value::Dict s1_prefs_and_hashes; + s1_prefs_and_hashes.Set("key1", "value1"); + s1_prefs_and_hashes.Set("key2", "value2"); + run_scenario("E1_AllValid", &s1_prefs_and_hashes, s1_prefs_and_hashes, + ValueState::UNCHANGED, {}); + + // Scenario E2: Value Changed for One Key (Hash Invalid) + base::Value::Dict s2_current_prefs; + s2_current_prefs.Set("key1", "value1_MODIFIED"); + s2_current_prefs.Set("key2", "value2"); + base::Value::Dict s2_original_hashes; + s2_original_hashes.Set("key1", "value1"); + s2_original_hashes.Set("key2", "value2"); + run_scenario("E2_OneValueChanged", &s2_current_prefs, s2_original_hashes, + ValueState::CHANGED, {"key1"}); + + // Scenario E3: Key Added in Value (Not in Stored Hashes) + base::Value::Dict s3_current_prefs; + s3_current_prefs.Set("key1", "value1"); + s3_current_prefs.Set("key2", "value2"); + base::Value::Dict s3_original_hashes; + s3_original_hashes.Set("key1", "value1"); + run_scenario("E3_KeyAddedInValue", &s3_current_prefs, s3_original_hashes, + ValueState::CHANGED, {"key2"}); + + // Scenario E4: Key Removed from Value (Present in Stored Hashes) + base::Value::Dict s4_current_prefs; + s4_current_prefs.Set("key1", "value1"); + base::Value::Dict s4_original_hashes; + s4_original_hashes.Set("key1", "value1"); + s4_original_hashes.Set("key2", "value2"); + run_scenario("E4_KeyRemovedFromValue", &s4_current_prefs, s4_original_hashes, + ValueState::CHANGED, {"key2"}); + + // Scenario E5: Multiple Invalidities (Value Change, Key Added, Key Removed) + base::Value::Dict s5_current_prefs; + s5_current_prefs.Set("keyA", "valueA_MODIFIED"); + s5_current_prefs.Set("keyC", "valueC"); + base::Value::Dict s5_original_hashes; + s5_original_hashes.Set("keyA", "valueA"); + s5_original_hashes.Set("keyB", "valueB"); + run_scenario("E5_MultipleInvalidities", &s5_current_prefs, s5_original_hashes, + ValueState::CHANGED, {"keyA", "keyB", "keyC"}); + + // Scenario E6: Initial Value is Empty, Stored Encrypted Hashes Exist + base::Value::Dict s6_original_hashes; + s6_original_hashes.Set("key1", "value1"); + base::Value::Dict s6_empty_current_prefs; + run_scenario("E6_EmptyValue_HashesExist", &s6_empty_current_prefs, + s6_original_hashes, ValueState::CLEARED, {}); + + // Scenario E6b: Initial Value is Null, Stored Encrypted Hashes Exist + run_scenario("E6b_NullValue_HashesExist", nullptr, s6_original_hashes, + ValueState::CLEARED, {}); + + // --- Scenario E7: Initial Value Exists, No Stored Encrypted Hashes (empty + // map of seed hashes) --- + base::Value::Dict s7_current_prefs; + s7_current_prefs.Set("key1", "value1"); + base::Value::Dict s7_empty_original_hashes; + run_scenario("E7_ValueExists_NoHashesStored", &s7_current_prefs, + s7_empty_original_hashes, ValueState::UNTRUSTED_UNKNOWN_VALUE, + {}); + + // --- Scenario E8: Initial Value Exists, Stored Hash Dictionary is Empty --- + { + SCOPED_TRACE("Scenario: E8_ValueExists_EmptyStoredHashDict"); + pref_store_contents_.clear(); + dictionary_contents_.Reset(); + actual_invalid_keys.clear(); + MakeSuperMACInvalid(); + + base::Value::Dict s8_current_prefs; + s8_current_prefs.Set("keyA", "valueA"); + s8_current_prefs.Set("keyB", "valueB"); + + // 1. Directly create an empty dictionary for the split encrypted hashes + // at the correct nested path within pref_store_contents_. + std::string enc_base_key_for_split = GetSplitEncKeyBase(kPrefPath); + std::string full_dotted_path = "protection.macs." + enc_base_key_for_split; + pref_store_contents_.SetByDottedPath(full_dotted_path, base::Value::Dict()); + // ^^^ Creates an empty dictionary at the full path + + // 2. Ensure no MACs are present for this path + SeedSplitMacs(kPrefPath, nullptr); + + // 3. Perform CheckSplitValue with encryptor present + auto tx = BeginTransaction(/*with_encryptor=*/true); + ValueState result_state = + tx->CheckSplitValue(kPrefPath, &s8_current_prefs, &actual_invalid_keys); + + // 4. Verify results + // Expected: CHANGED, because current pref has keys, but stored hash dict is + // empty. + EXPECT_EQ(ValueState::CHANGED, result_state); + std::vector<std::string> expected_bad_keys_s8 = {"keyA", "keyB"}; + std::sort(actual_invalid_keys.begin(), actual_invalid_keys.end()); + std::sort(expected_bad_keys_s8.begin(), expected_bad_keys_s8.end()); + EXPECT_EQ(expected_bad_keys_s8, actual_invalid_keys); + } +} + +TEST_F(PrefHashStoreImplEncryptedTest, ComputeSplitEncryptedHashes) { + const std::string kBasePath = "my.split.pref"; + + // Scenario 1: Null split_values + base::Value::Dict result1 = hash_store_.ComputeSplitEncryptedHashes( + kBasePath, nullptr, &test_encryptor_); + EXPECT_TRUE(result1.empty()); + + // Scenario 2: Empty split_values dictionary + base::Value::Dict empty_dict; + base::Value::Dict result2 = hash_store_.ComputeSplitEncryptedHashes( + kBasePath, &empty_dict, &test_encryptor_); + EXPECT_TRUE(result2.empty()); + + // Scenario 3: Null encryptor + base::Value::Dict input_dict3; + input_dict3.Set("key1", "value1"); + base::Value::Dict result3 = + hash_store_.ComputeSplitEncryptedHashes(kBasePath, &input_dict3, nullptr); + EXPECT_TRUE(result3.empty()); + + // Scenario 4: Valid split_values and encryptor - Functional Test + base::Value::Dict input_dict4; + input_dict4.Set("sub1", "alpha"); + input_dict4.Set("sub2", 123); + + base::Value::Dict computed_hashes_for_dict4 = + hash_store_.ComputeSplitEncryptedHashes(kBasePath, &input_dict4, + &test_encryptor_); + + // Assertions for Scenario 4: Check structure and functional validity + ASSERT_EQ(2u, computed_hashes_for_dict4.size()); + const std::string* hash_sub1_s4 = + computed_hashes_for_dict4.FindString("sub1"); + const std::string* hash_sub2_s4 = + computed_hashes_for_dict4.FindString("sub2"); + ASSERT_TRUE(hash_sub1_s4); + ASSERT_TRUE(hash_sub2_s4); + EXPECT_FALSE(hash_sub1_s4->empty()); + EXPECT_FALSE(hash_sub2_s4->empty()); + + // Verify these hashes are usable by CheckSplitValue + SeedSplitEncryptedHashes(kBasePath, &computed_hashes_for_dict4); + SeedSplitMacs(kBasePath, nullptr); + MakeSuperMACValid(); + { + auto tx = BeginTransaction(true); + std::vector<std::string> invalid_keys; + EXPECT_EQ(ValueState::UNCHANGED, + tx->CheckSplitValue(kBasePath, &input_dict4, &invalid_keys)); + EXPECT_TRUE(invalid_keys.empty()); + } + + // Scenario 5: One sub-item is binary + // Assuming production code hashes non-serializable (like binary) as if it + // were an empty string. + base::Value::Dict input_dict5; + input_dict5.Set("good_key1", "good_value1"); + std::vector<uint8_t> binary_data = {0, 1, 2}; + input_dict5.Set("bad_key_binary", base::Value(binary_data)); + input_dict5.Set("good_key2", "another_value"); + + base::Value::Dict computed_hashes_for_dict5 = + hash_store_.ComputeSplitEncryptedHashes(kBasePath, &input_dict5, + &test_encryptor_); + + // Assertions for Scenario 5 - EXPECTING bad_key_binary TO BE HASHED + ASSERT_EQ(3u, computed_hashes_for_dict5.size()) + << "Expected all keys to be present if binary is hashed (e.g., as empty " + "string)."; + EXPECT_TRUE(computed_hashes_for_dict5.contains("good_key1")); + EXPECT_TRUE(computed_hashes_for_dict5.contains("good_key2")); + EXPECT_TRUE(computed_hashes_for_dict5.contains("bad_key_binary")); + + const std::string* hash_good1_s5 = + computed_hashes_for_dict5.FindString("good_key1"); + const std::string* hash_bad_s5 = + computed_hashes_for_dict5.FindString("bad_key_binary"); + const std::string* hash_good2_s5 = + computed_hashes_for_dict5.FindString("good_key2"); + ASSERT_TRUE(hash_good1_s5 && !hash_good1_s5->empty()); + ASSERT_TRUE(hash_bad_s5 && !hash_bad_s5->empty()); + ASSERT_TRUE(hash_good2_s5 && !hash_good2_s5->empty()); + + // Verify these hashes functionally with CheckSplitValue + // CheckSplitValue will re-calculate hashes for good_key1, bad_key_binary (as + // empty string), good_key2 and they should match the stored ones. + SeedSplitEncryptedHashes(kBasePath, &computed_hashes_for_dict5); + SeedSplitMacs(kBasePath, nullptr); + MakeSuperMACValid(); + { + auto tx = BeginTransaction(true); + std::vector<std::string> invalid_keys; + EXPECT_EQ(ValueState::UNCHANGED, + tx->CheckSplitValue(kBasePath, &input_dict5, &invalid_keys)); + EXPECT_TRUE(invalid_keys.empty()); + } +} + +// For PrefHashStoreImpl::ComputeEncryptedHash(..., Dict*, ...) +TEST_F(PrefHashStoreImplEncryptedTest, ComputeEncryptedHash_ForDict_Success) { + const std::string kPath = "test.dict.pref.compute"; + base::Value::Dict test_dict; + test_dict.Set("d_key1", "d_value1"); + test_dict.Set("d_key2", 456); + + // Assuming test_encryptor_instance_ works by default. + std::string encrypted_hash_str = + hash_store_.ComputeEncryptedHash(kPath, &test_dict, &test_encryptor_); + EXPECT_FALSE(encrypted_hash_str.empty()); + std::string decoded_once; + EXPECT_TRUE(base::Base64Decode(encrypted_hash_str, &decoded_once)) + << "Result should be Base64"; +} + +// For PrefHashStoreTransactionImpl::StoreEncryptedHash - no encryptor block. +TEST_F(PrefHashStoreImplEncryptedTest, + StoreEncryptedHash_WhenNoEncryptor_DoesNotStore) { + const std::string kPath = "test.no.encryptor.store.eh"; + const std::string kEncKey = GetEncKey(kPath); + base::Value test_value("value to try storing"); + SeedAtomicMac(kPath, "some_existing_mac"); + + { + auto tx = BeginTransaction(/*with_encryptor=*/false); + tx->StoreEncryptedHash(kPath, &test_value); + + EXPECT_FALSE(dictionary_contents_.GetMac(kEncKey, nullptr)) + << "Encrypted hash should not be stored."; + VerifyStoredHashes(kPath, "some_existing_mac", std::nullopt); + } +} + +// PrefHashStoreTransactionImpl::CheckSplitValueInternal - loop for removed keys +// & no-encryptor fallback block. +TEST_F(PrefHashStoreImplEncryptedTest, + CheckSplitValue_EncryptorOn_KeyPresentInStoreMissingInValue) { + const std::string kPath = "split.eh.key_removed_from_value"; + base::Value::Dict original_seeded_values; + original_seeded_values.Set("keyA", "valA"); + original_seeded_values.Set("keyB_in_store_only", "valB"); + SeedSplitEncryptedHashesFromValues(kPath, &original_seeded_values); + SeedSplitMacs(kPath, nullptr); + + base::Value::Dict current_pref_dict; + current_pref_dict.Set("keyA", "valA"); + + auto tx = BeginTransaction(/*with_encryptor=*/true); + std::vector<std::string> invalid_keys; + ValueState state = + tx->CheckSplitValue(kPath, ¤t_pref_dict, &invalid_keys); + + EXPECT_EQ(ValueState::CHANGED, state); + ASSERT_EQ(1u, invalid_keys.size()); + EXPECT_EQ("keyB_in_store_only", invalid_keys[0]); +} + +TEST_F(PrefHashStoreImplEncryptedTest, + CheckSplitValue_NoEncryptor_EHExists_NoMACs_ResultsInUntrusted) { + const std::string kPath = "split.no_encryptor.only_eh_unusable"; + base::Value::Dict values_for_eh; + values_for_eh.Set("key1", "value1"); + SeedSplitEncryptedHashesFromValues(kPath, &values_for_eh); + SeedSplitMacs(kPath, nullptr); + MakeSuperMACInvalid(); + + base::Value::Dict current_pref_dict = values_for_eh.Clone(); + + auto tx = BeginTransaction(/*with_encryptor=*/false); + std::vector<std::string> invalid_keys; + ValueState state = + tx->CheckSplitValue(kPath, ¤t_pref_dict, &invalid_keys); + + EXPECT_EQ(ValueState::UNTRUSTED_UNKNOWN_VALUE, state); + EXPECT_TRUE(invalid_keys.empty()); +} + +TEST_F(PrefHashStoreImplEncryptedTest, + CheckSplitValue_NoEncryptor_EHAndMACsExist_UsesMACs) { + const std::string kPath = "split.no_encryptor.eh_and_macs"; + base::Value::Dict base_values; + base_values.Set("key1", "value1"); + base_values.Set("key2", "value2"); + + base::Value::Dict eh_seed_values; + eh_seed_values.Set("key1", "value1"); + SeedSplitEncryptedHashesFromValues(kPath, &eh_seed_values); + + SeedSplitMacs(kPath, &base_values); + MakeSuperMACInvalid(); + + base::Value::Dict current_pref_dict1 = base_values.Clone(); + { + auto tx = BeginTransaction(/*with_encryptor=*/false); + std::vector<std::string> invalid_keys; + ValueState state = + tx->CheckSplitValue(kPath, ¤t_pref_dict1, &invalid_keys); + EXPECT_EQ(ValueState::UNCHANGED, state) + << "Should rely on MACs when encryptor is off"; + EXPECT_TRUE(invalid_keys.empty()); + } + + base::Value::Dict current_pref_dict2 = base_values.Clone(); + current_pref_dict2.Set("key2", "value2_changed"); + { + auto tx = BeginTransaction(/*with_encryptor=*/false); + std::vector<std::string> invalid_keys; + ValueState state = + tx->CheckSplitValue(kPath, ¤t_pref_dict2, &invalid_keys); + EXPECT_EQ(ValueState::CHANGED, state); + ASSERT_EQ(1u, invalid_keys.size()); + EXPECT_EQ("key2", invalid_keys[0]); + } +} + +// For PrefHashStoreTransactionImpl::StoreSplitEncryptedHash - private method +TEST_F(PrefHashStoreImplEncryptedTest, + StoreSplitEncryptedViaIteratedAtomicStores_NoEncryptor) { + const std::string kBasePath = "my.split.base.noenc.store"; + const std::string kSubKey1 = "subkey1"; + const std::string kFullSubPath1 = kBasePath + "." + kSubKey1; + + auto tx = BeginTransaction(/*with_encryptor=*/false); + base::Value sub_value1("value1"); + tx->StoreEncryptedHash(kFullSubPath1, &sub_value1); + + EXPECT_FALSE(tx->HasEncryptedHash(kFullSubPath1)); + VerifyStoredHashes(kFullSubPath1, std::nullopt, std::nullopt); +} + +TEST_F(PrefHashStoreImplEncryptedTest, + StoreSplitEncryptedViaIteratedAtomicStores_ClearsOldBaseAtomics) { + const std::string kBasePath = "my.split.base.clearcheck"; + SeedAtomicEncryptedHash(kBasePath, "old_atomic_base_eh_b64"); + + const std::string kSubKey1 = "subkey1"; + const std::string kFullSubPath1 = kBasePath + "." + kSubKey1; + base::Value sub_value1("value1_for_split_part"); + + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + tx->StoreEncryptedHash(kFullSubPath1, &sub_value1); + } + + VerifyStoredHashes(kBasePath, std::nullopt, "old_atomic_base_eh_b64"); + EXPECT_TRUE(BeginTransaction(true)->HasEncryptedHash(kFullSubPath1)); +} + +// For PrefHashStoreTransactionImpl::ImportHash +TEST_F(PrefHashStoreImplEncryptedTest, + ImportHash_StringMac_ClearsOldEH_AndStampsSuperMACIfValid) { + const std::string kPath = "import.string.mac.specific"; + SeedAtomicEncryptedHash(kPath, "eh_to_be_cleared_b64"); + MakeSuperMACValid(); + + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + ASSERT_TRUE(tx->IsSuperMACValid()); + + base::Value mac_to_import("newly_imported_mac"); + tx->ImportHash(kPath, &mac_to_import); + + VerifyStoredHashes(kPath, "newly_imported_mac", std::nullopt); + EXPECT_TRUE(tx->StampSuperMac()); + EXPECT_TRUE(tx->IsSuperMACValid()); + } +} + +TEST_F(PrefHashStoreImplEncryptedTest, + ImportHash_Dict_MacOnly_ClearsOldEH_AndStampsSuperMACIfValid) { + const std::string kPath = "import.dict.maconly.specific"; + SeedAtomicEncryptedHash(kPath, "eh_to_be_cleared_b64"); + SeedAtomicMac(kPath, "old_mac_to_be_overwritten"); + MakeSuperMACValid(); + + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + ASSERT_TRUE(tx->IsSuperMACValid()); + + base::Value::Dict dict_to_import_data; + dict_to_import_data.Set(kImportMacKey, "imported_dict_mac"); + base::Value value_for_import(dict_to_import_data.Clone()); + tx->ImportHash(kPath, &value_for_import); + + VerifyStoredHashes(kPath, "imported_dict_mac", std::nullopt); + EXPECT_TRUE(tx->StampSuperMac()); + EXPECT_TRUE(tx->IsSuperMACValid()); + } +} + +TEST_F(PrefHashStoreImplEncryptedTest, + ImportHash_Dict_EHOnly_ClearsOldMac_AndStampsSuperMACIfValid) { + const std::string kPath = "import.dict.ehonly.specific"; + SeedAtomicMac(kPath, "mac_to_be_cleared"); + SeedAtomicEncryptedHash(kPath, "old_eh_to_be_overwritten_b64"); + MakeSuperMACValid(); + + { + auto tx = BeginTransaction(/*with_encryptor=*/true); + ASSERT_TRUE(tx->IsSuperMACValid()); + + base::Value::Dict dict_to_import_data; + dict_to_import_data.Set(kImportEncryptedHashKey, "imported_dict_eh_b64"); + base::Value value_for_import(dict_to_import_data.Clone()); + tx->ImportHash(kPath, &value_for_import); + + VerifyStoredHashes(kPath, std::nullopt, "imported_dict_eh_b64"); + EXPECT_TRUE(tx->StampSuperMac()); + EXPECT_TRUE(tx->IsSuperMACValid()); + } +} + +TEST_F( + PrefHashStoreImplEncryptedTest, + ImportHash_Dict_NoRelevantKeys_NoOldHashes_SuperMACValid_StampsSuperMAC) { + const std::string kPath = "import.dict.norelevant.noold"; + dictionary_contents_.RemoveEntry(kPath); + dictionary_contents_.RemoveEntry(GetEncKey(kPath)); + MakeSuperMACValid(); + + auto tx = BeginTransaction(/*with_encryptor=*/true); + ASSERT_TRUE(tx->IsSuperMACValid()); + // Initial StampSuperMac will be true because the transaction's + // super_mac_dirty_ is set by constructor if it reads a valid MAC (or by + // StampSuperMac if it had to make it valid). Given the provided StampSuperMac + // impl, it will always be true here. + EXPECT_TRUE(tx->StampSuperMac()) + << "First stamp will always be true if use_super_mac is on."; + + base::Value::Dict dict_to_import_data; + dict_to_import_data.Set("some_other_key", "some_value"); + base::Value value_for_import(dict_to_import_data.Clone()); + tx->ImportHash(kPath, &value_for_import); + + VerifyStoredHashes(kPath, std::nullopt, std::nullopt); + + EXPECT_TRUE(tx->StampSuperMac()) + << "Importing dict when SuperMAC was valid makes it stampable again."; + EXPECT_TRUE(tx->IsSuperMACValid()); +} + +TEST_F(PrefHashStoreImplEncryptedTest, + ImportHash_OtherType_NoChange_NoStampIfWasClean) { + const std::string kPath = "import.othertype.nochange"; + SeedAtomicMac(kPath, "old_mac_data"); + MakeSuperMACValid(); + + auto tx = BeginTransaction(/*with_encryptor=*/true); + ASSERT_TRUE(tx->IsSuperMACValid()); + tx->StampSuperMac(); + + base::Value int_value(123); + tx->ImportHash(kPath, &int_value); + + VerifyStoredHashes(kPath, "old_mac_data", std::nullopt); + EXPECT_TRUE( + tx->StampSuperMac()); // This will be true with the current StampSuperMac + EXPECT_TRUE(tx->IsSuperMACValid()); +} + +// For PrefHashStoreTransactionImpl::ClearEncryptedHash - private, tested via +// public ClearHash. +TEST_F(PrefHashStoreImplEncryptedTest, + ClearHash_TargetingPrivateClearEncryptedHashLogic) { + const std::string kPath = "clear.eh.via.clearhash"; + const std::string kEncKey = GetEncKey(kPath); + + // Scenario 1: Both exist, SuperMAC valid + SeedAtomicEncryptedHash(kPath, "eh_data_b64"); + SeedAtomicMac(kPath, "mac_data_also"); + MakeSuperMACValid(); + auto tx1 = BeginTransaction(/*with_encryptor=*/true); + ASSERT_TRUE(tx1->IsSuperMACValid()); + + tx1->ClearHash(kPath); + + EXPECT_FALSE(dictionary_contents_.GetMac(kPath, nullptr)); + EXPECT_FALSE(dictionary_contents_.GetMac(kEncKey, nullptr)); + EXPECT_TRUE(tx1->StampSuperMac()); + EXPECT_TRUE(tx1->IsSuperMACValid()); + + // Scenario 2: Both exist, SuperMAC invalid + SeedAtomicEncryptedHash(kPath, "eh_data_b64_sm_invalid"); + SeedAtomicMac(kPath, "mac_data_sm_invalid"); + MakeSuperMACInvalid(); + auto tx2 = BeginTransaction(/*with_encryptor=*/true); + ASSERT_FALSE(tx2->IsSuperMACValid()); + + tx2->ClearHash(kPath); + + EXPECT_FALSE(dictionary_contents_.GetMac(kEncKey, nullptr)); + EXPECT_FALSE(dictionary_contents_.GetMac(kPath, nullptr)); + EXPECT_TRUE(tx2->StampSuperMac()); + EXPECT_TRUE(tx2->IsSuperMACValid()); + + // Scenario 3: Neither EH nor MAC exists, SuperMAC valid + dictionary_contents_.RemoveEntry(kPath); + dictionary_contents_.RemoveEntry(GetEncKey(kPath)); + MakeSuperMACValid(); + auto tx3 = BeginTransaction(/*with_encryptor=*/true); + ASSERT_TRUE(tx3->IsSuperMACValid()); + tx3->StampSuperMac(); + + tx3->ClearHash(kPath); + + // If StampSuperMac always returns true, we can't differentiate a "no-op + // clean" from "op dirty". We can only check that contents are still empty. + VerifyStoredHashes(kPath, std::nullopt, std::nullopt); + EXPECT_TRUE(tx3->StampSuperMac()); +}
diff --git a/services/preferences/tracked/pref_hash_store_transaction.h b/services/preferences/tracked/pref_hash_store_transaction.h index 70b5909..a5876abda 100644 --- a/services/preferences/tracked/pref_hash_store_transaction.h +++ b/services/preferences/tracked/pref_hash_store_transaction.h
@@ -71,6 +71,25 @@ // Forces a valid super MAC to be stored when this transaction terminates. // Returns true if this results in a change to the store contents. virtual bool StampSuperMac() = 0; + + // Stores the OS-encrypted hash of the preference at |path| and |value|. + // |value| may be NULL. Requires the encryptor to have been provided at + // transaction start. + virtual void StoreEncryptedHash(const std::string& path, + const base::Value* value) = 0; + + // Retrieves the stored OS-encrypted hash (Base64 encoded) for the + // preference at |path|. Returns nullopt if no encrypted hash is stored. + virtual std::optional<std::string> GetEncryptedHash( + const std::string& path) const = 0; + + // Retrieves the stored legacy MAC for the preference at |path|. + // Returns nullopt if no MAC is stored. + virtual std::optional<std::string> GetMac(const std::string& path) const = 0; + + // Returns true if an OS-encrypted hash is stored for the preference at + // |path|. This could be an atomic hash or hashes for a split dictionary. + virtual bool HasEncryptedHash(const std::string& path) const = 0; }; #endif // SERVICES_PREFERENCES_TRACKED_PREF_HASH_STORE_TRANSACTION_H_
diff --git a/services/webnn/webnn_tensor_impl_backend_test.cc b/services/webnn/webnn_tensor_impl_backend_test.cc index 25411fc..a8f58c3 100644 --- a/services/webnn/webnn_tensor_impl_backend_test.cc +++ b/services/webnn/webnn_tensor_impl_backend_test.cc
@@ -712,10 +712,6 @@ std::move(read_create_tensor_result->get_buffer()))); } - // Ensure WebNN waited until the other queue completed. - ASSERT_TRUE(IsFenceCompleted(command_queue->submission_fence(), - command_queue->GetLastFenceValue())); - // Step 8. Simulate more external queue use with new data. std::unique_ptr<native::d3d12::WebNNSharedFence> webnn_fence_to_wait_for_2 = webnn_tensor->EndAccessWebNN();
diff --git a/testing/buildbot/filters/accessibility-linux.interactive_ui_tests.filter b/testing/buildbot/filters/accessibility-linux.interactive_ui_tests.filter index 7406bd2ac..f0ba798 100644 --- a/testing/buildbot/filters/accessibility-linux.interactive_ui_tests.filter +++ b/testing/buildbot/filters/accessibility-linux.interactive_ui_tests.filter
@@ -1,14 +1,4 @@ # These tests still need to be triaged and either okayed to skip or fixed. --AutofillInteractiveDisableAutofillSelectListTest.DisableSelectListAutofilling --AutofillInteractiveTest/AutofillInteractiveFencedFrameTest.* --AutofillInteractiveTest_ClearForm.* --AutofillInteractiveTest.* --AutofillInteractiveTestBase.* --AutofillInteractiveTestDynamicForm.* --AutofillInteractiveFormSubmissionClearFormTest.* --AutofillInteractiveFormSubmissionTest.* --AutofillInteractiveTest/AutofillInteractiveTestShadowDom.* --AutofillInteractiveTest_UndoAutofill.BasicUndoAutofill -BookmarksFocusTest.DNDManager -CaptionBubbleControllerViewsTest.AccessibleTextIsSometimesFocusable -CookieControlsInteractiveUiTest.* @@ -33,3 +23,6 @@ -UpdateAccountAddressProfileTest.UpdateThroughEdit -UpdateAddressProfileTest.UpdateThroughEdit -WebUITabStripInteractiveTest.* + +# This test crashes due to DCHECK failed: ax_tree_id != AXTreeIDUnknown() +-AutofillInteractiveTest/AutofillInteractiveFencedFrameTest.DeletingFrameClosesPopup/1
diff --git a/testing/buildbot/filters/ios.content_browsertests.filter b/testing/buildbot/filters/ios.content_browsertests.filter index 5395f19..aa7f400 100644 --- a/testing/buildbot/filters/ios.content_browsertests.filter +++ b/testing/buildbot/filters/ios.content_browsertests.filter
@@ -757,3 +757,9 @@ # TODO(crbug.com/418103029): The test has been failing since # https://crrev.com/c/6532249. -SecurityExploitBrowserTest.DidFailLoadWithInvalidErrorCode + +# TODO(crbug.com/418125309): These tests have been failing since +# https://crrev.com/c/6391357. +-All/SitePerProcessWithMainFrameThresholdAndSiteRestrictionTest.RestrictedToURLWithContentClient/0 +-All/SitePerProcessWithMainFrameThresholdAndSiteRestrictionTest.RestrictedToURLWithContentClient/1 +-RenderFrameHostImplReuseEmptyAvailableRenderBrowserTest.ReuseEmptyAvailableRenderForMainFrame
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index 159ef3a..32a4c07 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -544,7 +544,7 @@ 'cpu': 'arm64', 'gpu': 'apple:m1', 'mac_model': 'Macmini9,1', - 'os': 'Mac-15.4', + 'os': 'Mac-15.5', 'pool': 'chromium.tests', 'display_attached': '1', },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 8a5dd4d..947ec41a 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -14660,21 +14660,6 @@ ] } ], - "NearbySharingSelfShare": [ - { - "platforms": [ - "chromeos" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "NearbySharingSelfShare" - ] - } - ] - } - ], "NearbySharingWifiDirect": [ { "platforms": [ @@ -22315,35 +22300,6 @@ ] } ], - "ShowWarningsForSuspiciousNotifications": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "EnabledWithDefaultButtonPlacement", - "params": { - "ShowWarningsForSuspiciousNotificationsScoreThreshold": "90", - "ShowWarningsForSuspiciousNotificationsShouldSwapButtons": "false" - }, - "enable_features": [ - "ShowWarningsForSuspiciousNotifications" - ] - }, - { - "name": "EnabledWithButtonSwap", - "params": { - "ShowWarningsForSuspiciousNotificationsScoreThreshold": "90", - "ShowWarningsForSuspiciousNotificationsShouldSwapButtons": "true" - }, - "enable_features": [ - "ShowWarningsForSuspiciousNotifications" - ] - } - ] - } - ], "SidePanelCompanionDesktopM116Plus": [ { "platforms": [ @@ -23382,21 +23338,6 @@ ] } ], - "TabStripIncognitoMigration": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "TabStripIncognitoMigration" - ] - } - ] - } - ], "TabStripLayoutOptimization": [ { "platforms": [
diff --git a/third_party/android_build_tools/jetifier/OWNERS b/third_party/android_build_tools/jetifier/OWNERS index 828b487..39f58e9 100644 --- a/third_party/android_build_tools/jetifier/OWNERS +++ b/third_party/android_build_tools/jetifier/OWNERS
@@ -1,2 +1 @@ -mheikal@chromium.org agrieve@chromium.org
diff --git a/third_party/android_build_tools/protoc/OWNERS b/third_party/android_build_tools/protoc/OWNERS index 07b6b541..39f58e9 100644 --- a/third_party/android_build_tools/protoc/OWNERS +++ b/third_party/android_build_tools/protoc/OWNERS
@@ -1,2 +1 @@ agrieve@chromium.org -mheikal@chromium.org
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy index 1475b23..9752328 100644 --- a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy +++ b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
@@ -284,11 +284,6 @@ // Does not include version because by default the resolution strategy for gradle is to use the newest version // among the required ones. We want to be able to match it in the BUILD.gn file. String moduleId = sanitize("${group}_${module}") - - // Add 'android' suffix for guava-android so that its module name is distinct from the module for guava. - if (module == 'guava' && version.contains('android')) { - moduleId += '_android' - } return moduleId }
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumPlugin.groovy b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumPlugin.groovy index 12d0dac2..500868c3 100644 --- a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumPlugin.groovy +++ b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumPlugin.groovy
@@ -103,24 +103,6 @@ } } - // Guava is special, we always want the desktop JVM variant unless we - // are shipping it to devices (and thus limited by their - // OS/Java/Dex version). - project.dependencies.constraints { - project.configurations.each { Configuration config -> - // We only want android guava when we are shipping it, otherwise desktop guava. - if (config.name.startsWith('compile')) { - add(config.name,"com.google.guava:guava") { - attributes constraintAndroid - } - } else { - add(config.name,"com.google.guava:guava") { - attributes constraintJvm - } - } - } - } - def latestResolutionStrategy = { if (project.hasProperty('versionCache') && project.versionCache) { project.ext.versionCache.each { String selector, String version ->
diff --git a/third_party/androidx/fetch_all_androidx.py b/third_party/androidx/fetch_all_androidx.py index 5a2f6e5..f8d81b6 100755 --- a/third_party/androidx/fetch_all_androidx.py +++ b/third_party/androidx/fetch_all_androidx.py
@@ -43,6 +43,7 @@ # When androidx roller is breaking, and a fix is not imminent, use this to pin a # broken library to an old known-working version. +# * Find working versions from prior androidx roll commit descriptions. # * The first element of each tuple is the path to the artifact of the latest # version of the library. It could change if the version is rev'ed in a new # snapshot. @@ -54,10 +55,15 @@ #('androidx_core_core/core-1.9.0-SNAPSHOT.aar', # 'https://androidx.dev/snapshots/builds/8545498/artifacts/repository/' # 'androidx/core/core/1.8.0-SNAPSHOT/core-1.8.0-20220505.122105-1.aar'), - ('androidx_compose_runtime_runtime_saveable_android/runtime-saveable-android-1.9.0-SNAPSHOT.aar', - 'https://androidx.dev/snapshots/builds/13449807/artifacts/repository/androidx/compose/runtime/runtime-saveable-android/1.9.0-SNAPSHOT/runtime-saveable-android-1.9.0-20250505.230910-1.aar'), ] +# Set this to the build_id to pin all libraries to a given version. +# Useful when pinning a single library would cause issues, but you do not want +# to pause the auto-roller because other teams want to add / remove libraries. +# Example: '8545498' +_LATEST_VERSION_OVERRIDE = '' + + _FILES_TO_COMMIT = [ 'additional_readme_paths.json', 'bill_of_materials.json', @@ -118,7 +124,9 @@ androidx_snapshot_repository_url = ('file://' + os.path.abspath(args.local_repo)) else: - if args.local: + if _LATEST_VERSION_OVERRIDE: + version = _LATEST_VERSION_OVERRIDE + elif args.local: version = fetch_util.get_current_androidx_version() else: version = _get_latest_androidx_version()
diff --git a/third_party/angle b/third_party/angle index 3f7bded..4a5e20f 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit 3f7bded1c0334b099461de9b19ecc00d832ebc5a +Subproject commit 4a5e20f2c1478058a27fa578696b262d95a747b6
diff --git a/third_party/blink/public/common/indexeddb/indexeddb_metadata.h b/third_party/blink/public/common/indexeddb/indexeddb_metadata.h index ee156cf..d4ec504 100644 --- a/third_party/blink/public/common/indexeddb/indexeddb_metadata.h +++ b/third_party/blink/public/common/indexeddb/indexeddb_metadata.h
@@ -40,6 +40,8 @@ struct BLINK_COMMON_EXPORT IndexedDBObjectStoreMetadata { static const int64_t kInvalidId = -1; + // TODO(crbug.com/40253999): Move this to LevelDB-specific code if it is only + // relevant there. static const int64_t kMinimumIndexId = 30; IndexedDBObjectStoreMetadata();
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni index f02284b..7e743c2 100644 --- a/third_party/blink/renderer/bindings/generated_in_core.gni +++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -430,6 +430,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_show_context_menu_item.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_show_popover_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_show_popover_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_snap_event_init.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_snap_event_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_static_range_init.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_static_range_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_stream_pipe_options.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index 61417ee..ea493d3 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -577,6 +577,7 @@ "//third_party/blink/renderer/core/scheduler/window_or_worker_global_scope_timers.idl", "//third_party/blink/renderer/core/scheduler/window_or_worker_scheduler.idl", "//third_party/blink/renderer/core/scroll/snap_event.idl", + "//third_party/blink/renderer/core/scroll/snap_event_init.idl", "//third_party/blink/renderer/core/shadow_realm/shadow_realm_global_scope.idl", "//third_party/blink/renderer/core/streams/byte_length_queuing_strategy.idl", "//third_party/blink/renderer/core/streams/count_queuing_strategy.idl",
diff --git a/third_party/blink/renderer/core/css/css_computed_style_declaration.cc b/third_party/blink/renderer/core/css/css_computed_style_declaration.cc index 68ab69c..f5aa5dc 100644 --- a/third_party/blink/renderer/core/css/css_computed_style_declaration.cc +++ b/third_party/blink/renderer/core/css/css_computed_style_declaration.cc
@@ -47,6 +47,7 @@ #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/style/computed_style.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h" +#include "third_party/blink/renderer/core/view_transition/view_transition_utils.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" @@ -341,6 +342,12 @@ return nullptr; } + // TODO(crbug.com/417967839): Investigate if the performance of this scope + // (which invalidate view transition pseudos for specific pseudo id requests) + // is acceptable. + ViewTransitionUtils::GetPropertyCSSValueScope scope( + styled_element->GetDocument(), pseudo_element_specifier_); + UpdateStyleAndLayoutTreeIfNeeded(&property_name, /*for_all_properties=*/false);
diff --git a/third_party/blink/renderer/core/scroll/snap_event.cc b/third_party/blink/renderer/core/scroll/snap_event.cc index c7edc89..ee6e7d17 100644 --- a/third_party/blink/renderer/core/scroll/snap_event.cc +++ b/third_party/blink/renderer/core/scroll/snap_event.cc
@@ -4,6 +4,7 @@ #include "third_party/blink/renderer/core/scroll/snap_event.h" +#include "third_party/blink/renderer/bindings/core/v8/v8_snap_event_init.h" #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/dom/static_node_list.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" @@ -11,17 +12,24 @@ namespace blink { SnapEvent* SnapEvent::Create(const AtomicString& type, + SnapEventInit const* initializer) { + return SnapEvent::Create(type, Event::Bubbles::kNo, + initializer->snapTargetBlock(), + initializer->snapTargetInline()); +} + +SnapEvent* SnapEvent::Create(const AtomicString& type, Bubbles bubbles, - Member<Node>& block_target, - Member<Node>& inline_target) { + Member<Node> block_target, + Member<Node> inline_target) { return MakeGarbageCollected<SnapEvent>(type, bubbles, block_target, inline_target); } SnapEvent::SnapEvent(const AtomicString& type, Bubbles bubbles, - Member<Node>& block_target, - Member<Node>& inline_target) + Member<Node> block_target, + Member<Node> inline_target) : Event(type, bubbles, Cancelable::kNo), snap_target_block_(block_target), snap_target_inline_(inline_target) {}
diff --git a/third_party/blink/renderer/core/scroll/snap_event.h b/third_party/blink/renderer/core/scroll/snap_event.h index 52e3b42..f354f0d0 100644 --- a/third_party/blink/renderer/core/scroll/snap_event.h +++ b/third_party/blink/renderer/core/scroll/snap_event.h
@@ -14,6 +14,8 @@ namespace blink { +class SnapEventInit; + // This class implements the SnapEvent interface for scroll-snap-related // JavaScript events, scrollsnapchange and scrollsnapchanging. // SnapEvents are sent to a scroller when it snaps to a different element from @@ -24,13 +26,15 @@ public: static SnapEvent* Create(const AtomicString& type, + SnapEventInit const* initializer); + static SnapEvent* Create(const AtomicString& type, Bubbles bubbles, - Member<Node>& block_target, - Member<Node>& inline_target); + Member<Node> block_target, + Member<Node> inline_target); SnapEvent(const AtomicString& type, Bubbles bubbles, - Member<Node>& block_target, - Member<Node>& inline_target); + Member<Node> block_target, + Member<Node> inline_target); Node* snapTargetBlock() { return snap_target_block_.Get(); } Node* snapTargetInline() { return snap_target_inline_.Get(); }
diff --git a/third_party/blink/renderer/core/scroll/snap_event.idl b/third_party/blink/renderer/core/scroll/snap_event.idl index 4a4db16..b7f8bcc 100644 --- a/third_party/blink/renderer/core/scroll/snap_event.idl +++ b/third_party/blink/renderer/core/scroll/snap_event.idl
@@ -6,6 +6,7 @@ Exposed=Window, RuntimeEnabled=CSSScrollSnapEvents ] interface SnapEvent : Event { + [RuntimeEnabled=CSSScrollSnapEventConstructorExposed] constructor(DOMString type, optional SnapEventInit eventInitDict = {}); readonly attribute Node snapTargetBlock; readonly attribute Node snapTargetInline; };
diff --git a/third_party/blink/renderer/core/scroll/snap_event_init.idl b/third_party/blink/renderer/core/scroll/snap_event_init.idl new file mode 100644 index 0000000..11f7b56 --- /dev/null +++ b/third_party/blink/renderer/core/scroll/snap_event_init.idl
@@ -0,0 +1,10 @@ +// 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. + +// https://drafts.csswg.org/css-scroll-snap-2/#snapevent-interface + +dictionary SnapEventInit : EventInit { + Node? snapTargetBlock = null; + Node? snapTargetInline = null; +};
diff --git a/third_party/blink/renderer/core/view_transition/view_transition.cc b/third_party/blink/renderer/core/view_transition/view_transition.cc index 55585c7..b9a5642 100644 --- a/third_party/blink/renderer/core/view_transition/view_transition.cc +++ b/third_party/blink/renderer/core/view_transition/view_transition.cc
@@ -1091,4 +1091,15 @@ } } +void ViewTransition::WillEnterGetComputedStyleScope() { + if (style_tracker_) { + style_tracker_->WillEnterGetComputedStyleScope(); + } +} +void ViewTransition::WillExitGetComputedStyleScope() { + if (style_tracker_) { + style_tracker_->WillExitGetComputedStyleScope(); + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/view_transition/view_transition.h b/third_party/blink/renderer/core/view_transition/view_transition.h index 1bbcf26..3a729db 100644 --- a/third_party/blink/renderer/core/view_transition/view_transition.h +++ b/third_party/blink/renderer/core/view_transition/view_transition.h
@@ -281,6 +281,9 @@ void NotifyInvokeDOMChangeCallback(); bool PendingDomCallback(); + void WillEnterGetComputedStyleScope(); + void WillExitGetComputedStyleScope(); + private: friend class ViewTransitionTest; friend class AXViewTransitionTest;
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc index 9b47885..7a2626d 100644 --- a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc +++ b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc
@@ -590,7 +590,7 @@ // would not have any style or names set. if (RuntimeEnabledFeatures::SerializeViewTransitionStateInSPAEnabled()) { InvalidateHitTestingCache(); - InvalidateStyle(); + InvalidateStyleAndCompositing(); view_transition_names_.clear(); } } @@ -992,7 +992,7 @@ view_transition_names_ = std::move(transition_names); // We need a style invalidation to generate the pseudo element tree. - InvalidateStyle(); + InvalidateStyleAndCompositing(); set_element_sequence_id_ = 0; pending_transition_element_names_.clear(); @@ -1066,9 +1066,9 @@ // Since the elements will be unset, we need to invalidate their style first. // TODO(vmpstr): We don't have to invalidate the pseudo styles at this point, - // just the transition elements. We can split InvalidateStyle() into two - // functions as an optimization. - InvalidateStyle(); + // just the transition elements. We can split InvalidateStyleAndCompositing() + // into two functions as an optimization. + InvalidateStyleAndCompositing(); for (auto& entry : element_data_map_) { auto& element_data = entry.value; @@ -1230,7 +1230,7 @@ // We need a style invalidation to generate new content pseudo elements for // new elements in the DOM. - InvalidateStyle(); + InvalidateStyleAndCompositing(); if (auto* page = document_->GetPage()) page->Animator().SetHasViewTransition(true); @@ -1265,7 +1265,7 @@ // We need a style invalidation to remove the pseudo element tree. This needs // to be done before we clear the data, since we need to invalidate the // transition elements stored in `element_data_map_`. - InvalidateStyle(); + InvalidateStyleAndCompositing(); element_data_map_.clear(); pending_transition_element_names_.clear(); @@ -1550,7 +1550,7 @@ } if (needs_style_invalidation) { - InvalidateStyle(); + InvalidateStyleAndCompositing(); } return true; @@ -1814,16 +1814,21 @@ StyleRequest::RulesToInclude ViewTransitionStyleTracker::StyleRulesToInclude() const { + return HasInternalPseudoElements() && !in_get_computed_style_scope_ + ? StyleRequest::kUAOnly + : StyleRequest::kAll; +} + +bool ViewTransitionStyleTracker::HasInternalPseudoElements() const { switch (state_) { case State::kIdle: case State::kCapturing: case State::kCaptured: - return StyleRequest::kUAOnly; + return true; case State::kStarted: case State::kFinished: - return StyleRequest::kAll; + return false; } - NOTREACHED(); } @@ -2026,8 +2031,24 @@ return true; } -void ViewTransitionStyleTracker::InvalidateStyle() { +void ViewTransitionStyleTracker::InvalidatePseudoStyle() { ua_style_sheet_ = nullptr; + + auto* originating_element = OriginatingElement(); + if (!originating_element) { + return; + } + + auto invalidate_style = [](PseudoElement* pseudo_element) { + pseudo_element->SetNeedsStyleRecalc( + kLocalStyleChange, StyleChangeReasonForTracing::Create( + style_change_reason::kViewTransition)); + }; + ViewTransitionUtils::ForEachTransitionPseudo(*originating_element, + invalidate_style); +} + +void ViewTransitionStyleTracker::InvalidateStyleAndCompositing() { auto* originating_element = OriginatingElement(); if (!originating_element) { return; @@ -2037,13 +2058,7 @@ kLocalStyleChange, StyleChangeReasonForTracing::Create( style_change_reason::kViewTransition)); - auto invalidate_style = [](PseudoElement* pseudo_element) { - pseudo_element->SetNeedsStyleRecalc( - kLocalStyleChange, StyleChangeReasonForTracing::Create( - style_change_reason::kViewTransition)); - }; - ViewTransitionUtils::ForEachTransitionPseudo(*originating_element, - invalidate_style); + InvalidatePseudoStyle(); // Invalidate layout view compositing properties. if (auto* layout_view = document_->GetLayoutView()) { @@ -2058,8 +2073,8 @@ // We need to recalc style on each of the target elements, because we store // whether the element is a view transition participant on the computed - // style. InvalidateStyle() is an indication that this state may have - // changed. + // style. InvalidateStyleAndCompositing() is an indication that this state + // may have changed. entry.value->target_element->SetNeedsStyleRecalc( kLocalStyleChange, StyleChangeReasonForTracing::Create( style_change_reason::kViewTransition)); @@ -2092,71 +2107,80 @@ // Note that the cached ua_style_sheet_ above is invalidated when |state_| // moves to kStarted stage to generate a new stylesheet including styles for // animations. - const bool add_animations = state_ == State::kStarted; + const bool in_start_phase = state_ == State::kStarted; ViewTransitionStyleBuilder builder; builder.AddUAStyle(RuntimeEnabledFeatures::ScopedViewTransitionsEnabled() ? StaticUAStylesScoped() : StaticUAStyles()); - if (add_animations) { + if (in_start_phase) { builder.AddUAStyle(RuntimeEnabledFeatures::ScopedViewTransitionsEnabled() ? AnimationUAStylesScoped() : AnimationUAStyles()); } - for (auto& entry : element_data_map_) { - const auto& view_transition_name = entry.key.GetString(); - auto& element_data = entry.value; + // If we started the animation then we always create the full dynamic style + // sheet. However, before the animation phase, the dynamic sheet should only + // be created for the internal non-exposed pseudo elements. Specifically, if + // we're `in_get_computed_style_scope_` they should *not* be added, and only + // static UA style sheet is meant to be used because the pseudo elements are + // not yet exposed. See steps in + // https://www.w3.org/TR/css-view-transitions-1/#lifecycle for details. + if (in_start_phase || !in_get_computed_style_scope_) { + for (auto& entry : element_data_map_) { + const auto& view_transition_name = entry.key.GetString(); + auto& element_data = entry.value; - // TODO(vmpstr): We will run a style resolution before the first time we get - // a chance to update our rendering in RunPostPrePaintSteps. There is no - // point in adding any styles here, because those will be wrong. The TODO - // here is to skip this step earlier, instead of per each element. - if (!element_data->container_properties) { - continue; - } - - gfx::Transform old_parent_inverse_transform; - gfx::Transform new_parent_inverse_transform; - if (element_data->containing_group_name && HasLiveNewContent()) { - CHECK(element_data_map_.Contains(element_data->containing_group_name)); - const auto& containing_group_data = - element_data_map_.at(element_data->containing_group_name); - old_parent_inverse_transform = - containing_group_data->cached_container_properties.snapshot_matrix - .InverseOrIdentity(); - - if (containing_group_data->container_properties) { - const auto& new_container_properties = - *containing_group_data->container_properties; - new_parent_inverse_transform = - new_container_properties.snapshot_matrix.InverseOrIdentity(); - } - } - - // This updates the styles on the pseudo-elements as described in - // https://drafts.csswg.org/css-view-transitions-1/#style-transition-pseudo-elements-algorithm. - builder.AddContainerStyles( - view_transition_name, *element_data->container_properties, - element_data->captured_css_properties, new_parent_inverse_transform); - - // This sets up the styles to animate the pseudo-elements as described in - // https://drafts.csswg.org/css-view-transitions-1/#setup-transition-pseudo-elements-algorithm. - if (add_animations) { - CHECK(element_data->old_snapshot_id.IsValid() || - element_data->new_snapshot_id.IsValid()); - - auto type = ViewTransitionStyleBuilder::AnimationType::kBoth; - if (!element_data->old_snapshot_id.IsValid()) { - type = ViewTransitionStyleBuilder::AnimationType::kNewOnly; - } else if (!element_data->new_snapshot_id.IsValid()) { - type = ViewTransitionStyleBuilder::AnimationType::kOldOnly; + // TODO(vmpstr): We will run a style resolution before the first time we + // get a chance to update our rendering in RunPostPrePaintSteps. There is + // no point in adding any styles here, because those will be wrong. The + // TODO here is to skip this step earlier, instead of per each element. + if (!element_data->container_properties) { + continue; } - builder.AddAnimations(type, view_transition_name, - element_data->cached_container_properties, - element_data->cached_animated_css_properties, - old_parent_inverse_transform); + gfx::Transform old_parent_inverse_transform; + gfx::Transform new_parent_inverse_transform; + if (element_data->containing_group_name && HasLiveNewContent()) { + CHECK(element_data_map_.Contains(element_data->containing_group_name)); + const auto& containing_group_data = + element_data_map_.at(element_data->containing_group_name); + old_parent_inverse_transform = + containing_group_data->cached_container_properties.snapshot_matrix + .InverseOrIdentity(); + + if (containing_group_data->container_properties) { + const auto& new_container_properties = + *containing_group_data->container_properties; + new_parent_inverse_transform = + new_container_properties.snapshot_matrix.InverseOrIdentity(); + } + } + + // This updates the styles on the pseudo-elements as described in + // https://drafts.csswg.org/css-view-transitions-1/#style-transition-pseudo-elements-algorithm. + builder.AddContainerStyles( + view_transition_name, *element_data->container_properties, + element_data->captured_css_properties, new_parent_inverse_transform); + + // This sets up the styles to animate the pseudo-elements as described in + // https://drafts.csswg.org/css-view-transitions-1/#setup-transition-pseudo-elements-algorithm. + if (in_start_phase) { + CHECK(element_data->old_snapshot_id.IsValid() || + element_data->new_snapshot_id.IsValid()); + + auto type = ViewTransitionStyleBuilder::AnimationType::kBoth; + if (!element_data->old_snapshot_id.IsValid()) { + type = ViewTransitionStyleBuilder::AnimationType::kNewOnly; + } else if (!element_data->new_snapshot_id.IsValid()) { + type = ViewTransitionStyleBuilder::AnimationType::kOldOnly; + } + + builder.AddAnimations(type, view_transition_name, + element_data->cached_container_properties, + element_data->cached_animated_css_properties, + old_parent_inverse_transform); + } } } @@ -2365,4 +2389,14 @@ return element_ ? element_.Get() : document_->documentElement(); } +void ViewTransitionStyleTracker::WillEnterGetComputedStyleScope() { + CHECK(!in_get_computed_style_scope_); + in_get_computed_style_scope_ = true; +} + +void ViewTransitionStyleTracker::WillExitGetComputedStyleScope() { + CHECK(in_get_computed_style_scope_); + in_get_computed_style_scope_ = false; +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h index 4b671736..aa4aaf0 100644 --- a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h +++ b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.h
@@ -229,6 +229,9 @@ // name. Note that this only works once the transition starts. AtomicString GetContainingGroupName(const AtomicString& name) const; + void WillEnterGetComputedStyleScope(); + void WillExitGetComputedStyleScope(); + private: class ImageWrapperPseudoElement; @@ -323,7 +326,8 @@ // snapshot root rect. gfx::Rect GetSnapshotRootInFixedViewport() const; - void InvalidateStyle(); + void InvalidateStyleAndCompositing(); + void InvalidatePseudoStyle(); bool HasLiveNewContent() const; void EndTransition(); @@ -377,6 +381,10 @@ // in the rare case that the root element has been removed from the DOM. Element* OriginatingElement() const; + // Returns true if we have potentially created pseudo elements that should not + // be exposed via getComputedStyle or should not have author styles applied. + bool HasInternalPseudoElements() const; + Member<Document> document_; Member<Element> element_; @@ -455,6 +463,8 @@ HashMap<AtomicString, AtomicString> id_to_auto_name_map_; Vector<AtomicString> view_transition_names_; + + bool in_get_computed_style_scope_ = false; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_utils.cc b/third_party/blink/renderer/core/view_transition/view_transition_utils.cc index 18a0b05..daf3fee 100644 --- a/third_party/blink/renderer/core/view_transition/view_transition_utils.cc +++ b/third_party/blink/renderer/core/view_transition/view_transition_utils.cc
@@ -291,4 +291,29 @@ return transition && transition->IsRepresentedViaPseudoElements(object); } +ViewTransitionUtils::GetPropertyCSSValueScope::GetPropertyCSSValueScope( + Document& document, + PseudoId pseudo_id) + : document_(document), pseudo_id_(pseudo_id) { + if (!IsTransitionPseudoElement(pseudo_id_)) { + return; + } + + ViewTransitionUtils::ForEachTransition( + document_, [](ViewTransition& transition) { + transition.WillEnterGetComputedStyleScope(); + }); +} + +ViewTransitionUtils::GetPropertyCSSValueScope::~GetPropertyCSSValueScope() { + if (!IsTransitionPseudoElement(pseudo_id_)) { + return; + } + + ViewTransitionUtils::ForEachTransition( + document_, [](ViewTransition& transition) { + transition.WillExitGetComputedStyleScope(); + }); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_utils.h b/third_party/blink/renderer/core/view_transition/view_transition_utils.h index 3b424ff..33d5ca1e 100644 --- a/third_party/blink/renderer/core/view_transition/view_transition_utils.h +++ b/third_party/blink/renderer/core/view_transition/view_transition_utils.h
@@ -7,6 +7,7 @@ #include "base/functional/function_ref.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/core/view_transition/view_transition_request_forward.h" #include "third_party/blink/renderer/platform/heap/heap_traits.h" @@ -22,6 +23,20 @@ class CORE_EXPORT ViewTransitionUtils { public: + // Scope class used during getComputedStyle to ensure we don't expose internal + // pseudo elements before the start phase on the transition. + class GetPropertyCSSValueScope { + STACK_ALLOCATED(); + + public: + GetPropertyCSSValueScope(Document& document, PseudoId pseudo_id); + ~GetPropertyCSSValueScope(); + + private: + Document& document_; + PseudoId pseudo_id_; + }; + using PseudoFunctor = base::FunctionRef<void(PseudoElement*)>; using PseudoPredicate = base::FunctionRef<bool(PseudoElement*)>;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc index 9b39346e..26ec3f6 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
@@ -47,6 +47,23 @@ namespace { template <typename T> +T StatsConversionHelper(const T& value) { + return value; +} +String StatsConversionHelper(const std::string& value) { + return String::FromUTF8(value); +} + +// Macro to reduce the transformation between WebRTC and v8 values +// to a single line. Arguments are the webrtc stat and the equivalent +// v8 setter function. Uses StatsConversionHelper to specialize for +// std::string -> String::FromUTF8. +#define SET_STAT(webrtc_stat, v8_setter) \ + if (webrtc_stat.has_value()) { \ + v8_setter(StatsConversionHelper(*webrtc_stat)); \ + } + +template <typename T> v8::Local<v8::Value> HashMapToValue(ScriptState* script_state, HashMap<String, T>&& map) { V8ObjectBuilder builder(script_state); @@ -79,24 +96,12 @@ const webrtc::RTCCodecStats& webrtc_stat) { RTCCodecStats* v8_codec = MakeGarbageCollected<RTCCodecStats>(script_state->GetIsolate()); - if (webrtc_stat.transport_id.has_value()) { - v8_codec->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); - } - if (webrtc_stat.payload_type.has_value()) { - v8_codec->setPayloadType(*webrtc_stat.payload_type); - } - if (webrtc_stat.channels.has_value()) { - v8_codec->setChannels(*webrtc_stat.channels); - } - if (webrtc_stat.mime_type.has_value()) { - v8_codec->setMimeType(String::FromUTF8(*webrtc_stat.mime_type)); - } - if (webrtc_stat.clock_rate.has_value()) { - v8_codec->setClockRate(*webrtc_stat.clock_rate); - } - if (webrtc_stat.sdp_fmtp_line.has_value()) { - v8_codec->setSdpFmtpLine(String::FromUTF8(*webrtc_stat.sdp_fmtp_line)); - } + SET_STAT(webrtc_stat.transport_id, v8_codec->setTransportId) + SET_STAT(webrtc_stat.payload_type, v8_codec->setPayloadType); + SET_STAT(webrtc_stat.channels, v8_codec->setChannels); + SET_STAT(webrtc_stat.mime_type, v8_codec->setMimeType); + SET_STAT(webrtc_stat.clock_rate, v8_codec->setClockRate); + SET_STAT(webrtc_stat.sdp_fmtp_line, v8_codec->setSdpFmtpLine); return v8_codec; } @@ -108,222 +113,100 @@ MakeGarbageCollected<RTCInboundRtpStreamStats>( script_state->GetIsolate()); // RTCRtpStreamStats - if (webrtc_stat.ssrc.has_value()) { - v8_stat->setSsrc(*webrtc_stat.ssrc); - } - if (webrtc_stat.kind.has_value()) { - v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); - // mediaType is a legacy alias for kind. - v8_stat->setMediaType(String::FromUTF8(*webrtc_stat.kind)); - } - if (webrtc_stat.transport_id.has_value()) { - v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); - } - if (webrtc_stat.codec_id.has_value()) { - v8_stat->setCodecId(String::FromUTF8(*webrtc_stat.codec_id)); - } + SET_STAT(webrtc_stat.ssrc, v8_stat->setSsrc); + SET_STAT(webrtc_stat.kind, v8_stat->setKind); + // mediaType is a legacy alias for kind. + SET_STAT(webrtc_stat.kind, v8_stat->setMediaType); + SET_STAT(webrtc_stat.transport_id, v8_stat->setTransportId); + SET_STAT(webrtc_stat.codec_id, v8_stat->setCodecId); // RTCReceivedRtpStreamStats - if (webrtc_stat.packets_lost.has_value()) { - v8_stat->setPacketsLost(*webrtc_stat.packets_lost); - } - if (webrtc_stat.jitter.has_value()) { - v8_stat->setJitter(*webrtc_stat.jitter); - } + SET_STAT(webrtc_stat.packets_lost, v8_stat->setPacketsLost); + SET_STAT(webrtc_stat.jitter, v8_stat->setJitter); // RTCInboundRtpStreamStats - if (webrtc_stat.track_identifier.has_value()) { - v8_stat->setTrackIdentifier( - String::FromUTF8(*webrtc_stat.track_identifier)); - } - if (webrtc_stat.mid.has_value()) { - v8_stat->setMid(String::FromUTF8(*webrtc_stat.mid)); - } - if (webrtc_stat.remote_id.has_value()) { - v8_stat->setRemoteId(String::FromUTF8(*webrtc_stat.remote_id)); - } - if (webrtc_stat.frames_decoded.has_value()) { - v8_stat->setFramesDecoded(*webrtc_stat.frames_decoded); - } - if (webrtc_stat.key_frames_decoded.has_value()) { - v8_stat->setKeyFramesDecoded(*webrtc_stat.key_frames_decoded); - } - if (webrtc_stat.frames_dropped.has_value()) { - v8_stat->setFramesDropped(*webrtc_stat.frames_dropped); - } - if (webrtc_stat.frame_width.has_value()) { - v8_stat->setFrameWidth(*webrtc_stat.frame_width); - } - if (webrtc_stat.frame_height.has_value()) { - v8_stat->setFrameHeight(*webrtc_stat.frame_height); - } - if (webrtc_stat.frames_per_second.has_value()) { - v8_stat->setFramesPerSecond(*webrtc_stat.frames_per_second); - } - if (webrtc_stat.qp_sum.has_value()) { - v8_stat->setQpSum(*webrtc_stat.qp_sum); - } - if (webrtc_stat.total_corruption_probability.has_value()) { - v8_stat->setTotalCorruptionProbability( - *webrtc_stat.total_corruption_probability); - } - if (webrtc_stat.total_squared_corruption_probability.has_value()) { - v8_stat->setTotalSquaredCorruptionProbability( - *webrtc_stat.total_squared_corruption_probability); - } - if (webrtc_stat.corruption_measurements.has_value()) { - v8_stat->setCorruptionMeasurements(*webrtc_stat.corruption_measurements); - } - if (webrtc_stat.total_decode_time.has_value()) { - v8_stat->setTotalDecodeTime(*webrtc_stat.total_decode_time); - } - if (webrtc_stat.total_inter_frame_delay.has_value()) { - v8_stat->setTotalInterFrameDelay(*webrtc_stat.total_inter_frame_delay); - } - if (webrtc_stat.total_squared_inter_frame_delay.has_value()) { - v8_stat->setTotalSquaredInterFrameDelay( - *webrtc_stat.total_squared_inter_frame_delay); - } - if (webrtc_stat.pause_count.has_value()) { - v8_stat->setPauseCount(*webrtc_stat.pause_count); - } - if (webrtc_stat.total_pauses_duration.has_value()) { - v8_stat->setTotalPausesDuration(*webrtc_stat.total_pauses_duration); - } - if (webrtc_stat.freeze_count.has_value()) { - v8_stat->setFreezeCount(*webrtc_stat.freeze_count); - } - if (webrtc_stat.total_freezes_duration.has_value()) { - v8_stat->setTotalFreezesDuration(*webrtc_stat.total_freezes_duration); - } - if (webrtc_stat.last_packet_received_timestamp.has_value()) { - v8_stat->setLastPacketReceivedTimestamp( - *webrtc_stat.last_packet_received_timestamp); - } - if (webrtc_stat.header_bytes_received.has_value()) { - v8_stat->setHeaderBytesReceived(*webrtc_stat.header_bytes_received); - } - if (webrtc_stat.packets_discarded.has_value()) { - v8_stat->setPacketsDiscarded(*webrtc_stat.packets_discarded); - } - if (webrtc_stat.packets_received.has_value()) { - v8_stat->setPacketsReceived(*webrtc_stat.packets_received); - } - if (webrtc_stat.fec_packets_received.has_value()) { - v8_stat->setFecPacketsReceived(*webrtc_stat.fec_packets_received); - } - if (webrtc_stat.fec_packets_discarded.has_value()) { - v8_stat->setFecPacketsDiscarded(*webrtc_stat.fec_packets_discarded); - } - if (webrtc_stat.fec_bytes_received.has_value()) { - v8_stat->setFecBytesReceived(*webrtc_stat.fec_bytes_received); - } - if (webrtc_stat.fec_ssrc.has_value()) { - v8_stat->setFecSsrc(*webrtc_stat.fec_ssrc); - } - if (webrtc_stat.bytes_received.has_value()) { - v8_stat->setBytesReceived(*webrtc_stat.bytes_received); - } - if (webrtc_stat.nack_count.has_value()) { - v8_stat->setNackCount(*webrtc_stat.nack_count); - } - if (webrtc_stat.fir_count.has_value()) { - v8_stat->setFirCount(*webrtc_stat.fir_count); - } - if (webrtc_stat.pli_count.has_value()) { - v8_stat->setPliCount(*webrtc_stat.pli_count); - } - if (webrtc_stat.total_processing_delay.has_value()) { - v8_stat->setTotalProcessingDelay(*webrtc_stat.total_processing_delay); - } - if (webrtc_stat.estimated_playout_timestamp.has_value()) { - v8_stat->setEstimatedPlayoutTimestamp( - *webrtc_stat.estimated_playout_timestamp); - } - if (webrtc_stat.jitter_buffer_delay.has_value()) { - v8_stat->setJitterBufferDelay(*webrtc_stat.jitter_buffer_delay); - } - if (webrtc_stat.jitter_buffer_target_delay.has_value()) { - v8_stat->setJitterBufferTargetDelay( - *webrtc_stat.jitter_buffer_target_delay); - } - if (webrtc_stat.jitter_buffer_emitted_count.has_value()) { - v8_stat->setJitterBufferEmittedCount( - *webrtc_stat.jitter_buffer_emitted_count); - } - if (webrtc_stat.jitter_buffer_minimum_delay.has_value()) { - v8_stat->setJitterBufferMinimumDelay( - *webrtc_stat.jitter_buffer_minimum_delay); - } - if (webrtc_stat.total_samples_received.has_value()) { - v8_stat->setTotalSamplesReceived(*webrtc_stat.total_samples_received); - } - if (webrtc_stat.concealed_samples.has_value()) { - v8_stat->setConcealedSamples(*webrtc_stat.concealed_samples); - } - if (webrtc_stat.silent_concealed_samples.has_value()) { - v8_stat->setSilentConcealedSamples(*webrtc_stat.silent_concealed_samples); - } - if (webrtc_stat.concealment_events.has_value()) { - v8_stat->setConcealmentEvents(*webrtc_stat.concealment_events); - } - if (webrtc_stat.inserted_samples_for_deceleration.has_value()) { - v8_stat->setInsertedSamplesForDeceleration( - *webrtc_stat.inserted_samples_for_deceleration); - } - if (webrtc_stat.removed_samples_for_acceleration.has_value()) { - v8_stat->setRemovedSamplesForAcceleration( - *webrtc_stat.removed_samples_for_acceleration); - } - if (webrtc_stat.audio_level.has_value()) { - v8_stat->setAudioLevel(*webrtc_stat.audio_level); - } - if (webrtc_stat.total_audio_energy.has_value()) { - v8_stat->setTotalAudioEnergy(*webrtc_stat.total_audio_energy); - } - if (webrtc_stat.total_samples_duration.has_value()) { - v8_stat->setTotalSamplesDuration(*webrtc_stat.total_samples_duration); - } - if (webrtc_stat.frames_received.has_value()) { - v8_stat->setFramesReceived(*webrtc_stat.frames_received); - } - if (webrtc_stat.playout_id.has_value()) { - v8_stat->setPlayoutId(String::FromUTF8(*webrtc_stat.playout_id)); - } - if (webrtc_stat.frames_assembled_from_multiple_packets.has_value()) { - v8_stat->setFramesAssembledFromMultiplePackets( - *webrtc_stat.frames_assembled_from_multiple_packets); - } - if (webrtc_stat.total_assembly_time.has_value()) { - v8_stat->setTotalAssemblyTime(*webrtc_stat.total_assembly_time); - } + SET_STAT(webrtc_stat.track_identifier, v8_stat->setTrackIdentifier); + SET_STAT(webrtc_stat.mid, v8_stat->setMid); + SET_STAT(webrtc_stat.remote_id, v8_stat->setRemoteId); + SET_STAT(webrtc_stat.frames_decoded, v8_stat->setFramesDecoded); + SET_STAT(webrtc_stat.key_frames_decoded, v8_stat->setKeyFramesDecoded); + SET_STAT(webrtc_stat.frames_dropped, v8_stat->setFramesDropped); + SET_STAT(webrtc_stat.frame_width, v8_stat->setFrameWidth); + SET_STAT(webrtc_stat.frame_height, v8_stat->setFrameHeight); + SET_STAT(webrtc_stat.frames_per_second, v8_stat->setFramesPerSecond); + SET_STAT(webrtc_stat.qp_sum, v8_stat->setQpSum); + SET_STAT(webrtc_stat.total_corruption_probability, + v8_stat->setTotalCorruptionProbability); + SET_STAT(webrtc_stat.total_squared_corruption_probability, + v8_stat->setTotalSquaredCorruptionProbability); + SET_STAT(webrtc_stat.corruption_measurements, + v8_stat->setCorruptionMeasurements); + SET_STAT(webrtc_stat.total_decode_time, v8_stat->setTotalDecodeTime); + SET_STAT(webrtc_stat.total_inter_frame_delay, + v8_stat->setTotalInterFrameDelay); + SET_STAT(webrtc_stat.total_squared_inter_frame_delay, + v8_stat->setTotalSquaredInterFrameDelay); + SET_STAT(webrtc_stat.pause_count, v8_stat->setPauseCount); + SET_STAT(webrtc_stat.total_pauses_duration, v8_stat->setTotalPausesDuration); + SET_STAT(webrtc_stat.freeze_count, v8_stat->setFreezeCount); + SET_STAT(webrtc_stat.total_freezes_duration, + v8_stat->setTotalFreezesDuration); + SET_STAT(webrtc_stat.last_packet_received_timestamp, + v8_stat->setLastPacketReceivedTimestamp); + SET_STAT(webrtc_stat.header_bytes_received, v8_stat->setHeaderBytesReceived); + SET_STAT(webrtc_stat.packets_discarded, v8_stat->setPacketsDiscarded); + SET_STAT(webrtc_stat.packets_received, v8_stat->setPacketsReceived); + SET_STAT(webrtc_stat.fec_packets_received, v8_stat->setFecPacketsReceived); + SET_STAT(webrtc_stat.fec_packets_discarded, v8_stat->setFecPacketsDiscarded); + SET_STAT(webrtc_stat.fec_bytes_received, v8_stat->setFecBytesReceived); + SET_STAT(webrtc_stat.fec_ssrc, v8_stat->setFecSsrc); + SET_STAT(webrtc_stat.bytes_received, v8_stat->setBytesReceived); + SET_STAT(webrtc_stat.nack_count, v8_stat->setNackCount); + SET_STAT(webrtc_stat.fir_count, v8_stat->setFirCount); + SET_STAT(webrtc_stat.pli_count, v8_stat->setPliCount); + SET_STAT(webrtc_stat.total_processing_delay, + v8_stat->setTotalProcessingDelay); + SET_STAT(webrtc_stat.estimated_playout_timestamp, + v8_stat->setEstimatedPlayoutTimestamp); + SET_STAT(webrtc_stat.jitter_buffer_delay, v8_stat->setJitterBufferDelay); + SET_STAT(webrtc_stat.jitter_buffer_target_delay, + v8_stat->setJitterBufferTargetDelay); + SET_STAT(webrtc_stat.jitter_buffer_emitted_count, + v8_stat->setJitterBufferEmittedCount); + SET_STAT(webrtc_stat.jitter_buffer_minimum_delay, + v8_stat->setJitterBufferMinimumDelay); + SET_STAT(webrtc_stat.total_samples_received, + v8_stat->setTotalSamplesReceived); + SET_STAT(webrtc_stat.concealed_samples, v8_stat->setConcealedSamples); + SET_STAT(webrtc_stat.silent_concealed_samples, + v8_stat->setSilentConcealedSamples); + SET_STAT(webrtc_stat.concealment_events, v8_stat->setConcealmentEvents); + SET_STAT(webrtc_stat.inserted_samples_for_deceleration, + v8_stat->setInsertedSamplesForDeceleration); + SET_STAT(webrtc_stat.removed_samples_for_acceleration, + v8_stat->setRemovedSamplesForAcceleration); + SET_STAT(webrtc_stat.audio_level, v8_stat->setAudioLevel); + SET_STAT(webrtc_stat.total_audio_energy, v8_stat->setTotalAudioEnergy); + SET_STAT(webrtc_stat.total_samples_duration, + v8_stat->setTotalSamplesDuration); + SET_STAT(webrtc_stat.frames_received, v8_stat->setFramesReceived); + SET_STAT(webrtc_stat.playout_id, v8_stat->setPlayoutId); + SET_STAT(webrtc_stat.frames_assembled_from_multiple_packets, + v8_stat->setFramesAssembledFromMultiplePackets); + SET_STAT(webrtc_stat.total_assembly_time, v8_stat->setTotalAssemblyTime); if (expose_hardware_caps) { - if (webrtc_stat.power_efficient_decoder.has_value()) { - v8_stat->setPowerEfficientDecoder(*webrtc_stat.power_efficient_decoder); - } - if (webrtc_stat.decoder_implementation.has_value()) { - v8_stat->setDecoderImplementation( - String::FromUTF8(*webrtc_stat.decoder_implementation)); - } + SET_STAT(webrtc_stat.power_efficient_decoder, + v8_stat->setPowerEfficientDecoder); + SET_STAT(webrtc_stat.decoder_implementation, + v8_stat->setDecoderImplementation); } // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcinboundrtpstreamstats-contenttype - if (webrtc_stat.content_type.has_value()) { - v8_stat->setContentType(String::FromUTF8(*webrtc_stat.content_type)); - } + SET_STAT(webrtc_stat.content_type, v8_stat->setContentType); // https://github.com/w3c/webrtc-provisional-stats/issues/40 - if (webrtc_stat.goog_timing_frame_info.has_value()) { - v8_stat->setGoogTimingFrameInfo( - String::FromUTF8(*webrtc_stat.goog_timing_frame_info)); - } - if (webrtc_stat.retransmitted_packets_received.has_value()) { - v8_stat->setRetransmittedPacketsReceived( - *webrtc_stat.retransmitted_packets_received); - } - if (webrtc_stat.retransmitted_bytes_received.has_value()) { - v8_stat->setRetransmittedBytesReceived( - *webrtc_stat.retransmitted_bytes_received); - } - if (webrtc_stat.rtx_ssrc.has_value()) { - v8_stat->setRtxSsrc(*webrtc_stat.rtx_ssrc); - } + SET_STAT(webrtc_stat.goog_timing_frame_info, v8_stat->setGoogTimingFrameInfo); + SET_STAT(webrtc_stat.retransmitted_packets_received, + v8_stat->setRetransmittedPacketsReceived); + SET_STAT(webrtc_stat.retransmitted_bytes_received, + v8_stat->setRetransmittedBytesReceived); + SET_STAT(webrtc_stat.rtx_ssrc, v8_stat->setRtxSsrc); return v8_stat; } @@ -334,44 +217,22 @@ MakeGarbageCollected<RTCRemoteInboundRtpStreamStats>( script_state->GetIsolate()); // RTCRtpStreamStats - if (webrtc_stat.ssrc.has_value()) { - v8_stat->setSsrc(*webrtc_stat.ssrc); - } - if (webrtc_stat.kind.has_value()) { - v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); - // mediaType is a legacy alias for kind. - v8_stat->setMediaType(String::FromUTF8(*webrtc_stat.kind)); - } - if (webrtc_stat.transport_id.has_value()) { - v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); - } - if (webrtc_stat.codec_id.has_value()) { - v8_stat->setCodecId(String::FromUTF8(*webrtc_stat.codec_id)); - } + SET_STAT(webrtc_stat.ssrc, v8_stat->setSsrc); + SET_STAT(webrtc_stat.kind, v8_stat->setKind); + // mediaType is a legacy alias for kind. + SET_STAT(webrtc_stat.kind, v8_stat->setMediaType); + SET_STAT(webrtc_stat.transport_id, v8_stat->setTransportId); + SET_STAT(webrtc_stat.codec_id, v8_stat->setCodecId); // RTCReceivedRtpStreamStats - if (webrtc_stat.packets_lost.has_value()) { - v8_stat->setPacketsLost(*webrtc_stat.packets_lost); - } - if (webrtc_stat.jitter.has_value()) { - v8_stat->setJitter(*webrtc_stat.jitter); - } + SET_STAT(webrtc_stat.packets_lost, v8_stat->setPacketsLost); + SET_STAT(webrtc_stat.jitter, v8_stat->setJitter); // RTCRemoteInboundRtpStreamStats - if (webrtc_stat.local_id.has_value()) { - v8_stat->setLocalId(String::FromUTF8(*webrtc_stat.local_id)); - } - if (webrtc_stat.round_trip_time.has_value()) { - v8_stat->setRoundTripTime(*webrtc_stat.round_trip_time); - } - if (webrtc_stat.total_round_trip_time.has_value()) { - v8_stat->setTotalRoundTripTime(*webrtc_stat.total_round_trip_time); - } - if (webrtc_stat.fraction_lost.has_value()) { - v8_stat->setFractionLost(*webrtc_stat.fraction_lost); - } - if (webrtc_stat.round_trip_time_measurements.has_value()) { - v8_stat->setRoundTripTimeMeasurements( - *webrtc_stat.round_trip_time_measurements); - } + SET_STAT(webrtc_stat.local_id, v8_stat->setLocalId); + SET_STAT(webrtc_stat.round_trip_time, v8_stat->setRoundTripTime); + SET_STAT(webrtc_stat.total_round_trip_time, v8_stat->setTotalRoundTripTime); + SET_STAT(webrtc_stat.fraction_lost, v8_stat->setFractionLost); + SET_STAT(webrtc_stat.round_trip_time_measurements, + v8_stat->setRoundTripTimeMeasurements); return v8_stat; } @@ -383,97 +244,43 @@ MakeGarbageCollected<RTCOutboundRtpStreamStats>( script_state->GetIsolate()); // RTCRtpStreamStats - if (webrtc_stat.ssrc.has_value()) { - v8_stat->setSsrc(*webrtc_stat.ssrc); - } - if (webrtc_stat.kind.has_value()) { - v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); - // mediaType is a legacy alias for kind. - v8_stat->setMediaType(String::FromUTF8(*webrtc_stat.kind)); - } - if (webrtc_stat.transport_id.has_value()) { - v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); - } - if (webrtc_stat.codec_id.has_value()) { - v8_stat->setCodecId(String::FromUTF8(*webrtc_stat.codec_id)); - } + SET_STAT(webrtc_stat.ssrc, v8_stat->setSsrc); + SET_STAT(webrtc_stat.kind, v8_stat->setKind); + // mediaType is a legacy alias for kind. + SET_STAT(webrtc_stat.kind, v8_stat->setMediaType); + SET_STAT(webrtc_stat.transport_id, v8_stat->setTransportId); + SET_STAT(webrtc_stat.codec_id, v8_stat->setCodecId); // RTCSentRtpStreamStats - if (webrtc_stat.packets_sent.has_value()) { - v8_stat->setPacketsSent(*webrtc_stat.packets_sent); - } - if (webrtc_stat.bytes_sent.has_value()) { - v8_stat->setBytesSent(*webrtc_stat.bytes_sent); - } + SET_STAT(webrtc_stat.packets_sent, v8_stat->setPacketsSent); + SET_STAT(webrtc_stat.bytes_sent, v8_stat->setBytesSent); // RTCOutboundRtpStreamStats - if (webrtc_stat.mid.has_value()) { - v8_stat->setMid(String::FromUTF8(*webrtc_stat.mid)); - } - if (webrtc_stat.media_source_id.has_value()) { - v8_stat->setMediaSourceId(String::FromUTF8(*webrtc_stat.media_source_id)); - } - if (webrtc_stat.remote_id.has_value()) { - v8_stat->setRemoteId(String::FromUTF8(*webrtc_stat.remote_id)); - } - if (webrtc_stat.rid.has_value()) { - v8_stat->setRid(String::FromUTF8(*webrtc_stat.rid)); - } - if (webrtc_stat.encoding_index.has_value()) { - v8_stat->setEncodingIndex(*webrtc_stat.encoding_index); - } - if (webrtc_stat.header_bytes_sent.has_value()) { - v8_stat->setHeaderBytesSent(*webrtc_stat.header_bytes_sent); - } - if (webrtc_stat.retransmitted_packets_sent.has_value()) { - v8_stat->setRetransmittedPacketsSent( - *webrtc_stat.retransmitted_packets_sent); - } - if (webrtc_stat.retransmitted_bytes_sent.has_value()) { - v8_stat->setRetransmittedBytesSent(*webrtc_stat.retransmitted_bytes_sent); - } - if (webrtc_stat.rtx_ssrc.has_value()) { - v8_stat->setRtxSsrc(*webrtc_stat.rtx_ssrc); - } - if (webrtc_stat.target_bitrate.has_value()) { - v8_stat->setTargetBitrate(*webrtc_stat.target_bitrate); - } - if (webrtc_stat.total_encoded_bytes_target.has_value()) { - v8_stat->setTotalEncodedBytesTarget( - *webrtc_stat.total_encoded_bytes_target); - } - if (webrtc_stat.frame_width.has_value()) { - v8_stat->setFrameWidth(*webrtc_stat.frame_width); - } - if (webrtc_stat.frame_height.has_value()) { - v8_stat->setFrameHeight(*webrtc_stat.frame_height); - } - if (webrtc_stat.frames_per_second.has_value()) { - v8_stat->setFramesPerSecond(*webrtc_stat.frames_per_second); - } - if (webrtc_stat.frames_sent.has_value()) { - v8_stat->setFramesSent(*webrtc_stat.frames_sent); - } - if (webrtc_stat.huge_frames_sent.has_value()) { - v8_stat->setHugeFramesSent(*webrtc_stat.huge_frames_sent); - } - if (webrtc_stat.frames_encoded.has_value()) { - v8_stat->setFramesEncoded(*webrtc_stat.frames_encoded); - } - if (webrtc_stat.key_frames_encoded.has_value()) { - v8_stat->setKeyFramesEncoded(*webrtc_stat.key_frames_encoded); - } - if (webrtc_stat.qp_sum.has_value()) { - v8_stat->setQpSum(*webrtc_stat.qp_sum); - } - if (webrtc_stat.total_encode_time.has_value()) { - v8_stat->setTotalEncodeTime(*webrtc_stat.total_encode_time); - } - if (webrtc_stat.total_packet_send_delay.has_value()) { - v8_stat->setTotalPacketSendDelay(*webrtc_stat.total_packet_send_delay); - } - if (webrtc_stat.quality_limitation_reason.has_value()) { - v8_stat->setQualityLimitationReason( - String::FromUTF8(*webrtc_stat.quality_limitation_reason)); - } + SET_STAT(webrtc_stat.mid, v8_stat->setMid); + SET_STAT(webrtc_stat.media_source_id, v8_stat->setMediaSourceId); + SET_STAT(webrtc_stat.remote_id, v8_stat->setRemoteId); + SET_STAT(webrtc_stat.rid, v8_stat->setRid); + SET_STAT(webrtc_stat.encoding_index, v8_stat->setEncodingIndex); + SET_STAT(webrtc_stat.header_bytes_sent, v8_stat->setHeaderBytesSent); + SET_STAT(webrtc_stat.retransmitted_packets_sent, + v8_stat->setRetransmittedPacketsSent); + SET_STAT(webrtc_stat.retransmitted_bytes_sent, + v8_stat->setRetransmittedBytesSent); + SET_STAT(webrtc_stat.rtx_ssrc, v8_stat->setRtxSsrc); + SET_STAT(webrtc_stat.target_bitrate, v8_stat->setTargetBitrate); + SET_STAT(webrtc_stat.total_encoded_bytes_target, + v8_stat->setTotalEncodedBytesTarget); + SET_STAT(webrtc_stat.frame_width, v8_stat->setFrameWidth); + SET_STAT(webrtc_stat.frame_height, v8_stat->setFrameHeight); + SET_STAT(webrtc_stat.frames_per_second, v8_stat->setFramesPerSecond); + SET_STAT(webrtc_stat.frames_sent, v8_stat->setFramesSent); + SET_STAT(webrtc_stat.huge_frames_sent, v8_stat->setHugeFramesSent); + SET_STAT(webrtc_stat.frames_encoded, v8_stat->setFramesEncoded); + SET_STAT(webrtc_stat.key_frames_encoded, v8_stat->setKeyFramesEncoded); + SET_STAT(webrtc_stat.qp_sum, v8_stat->setQpSum); + SET_STAT(webrtc_stat.total_encode_time, v8_stat->setTotalEncodeTime); + SET_STAT(webrtc_stat.total_packet_send_delay, + v8_stat->setTotalPacketSendDelay); + SET_STAT(webrtc_stat.quality_limitation_reason, + v8_stat->setQualityLimitationReason); if (webrtc_stat.quality_limitation_durations.has_value()) { Vector<std::pair<String, double>> quality_durations; for (const auto& [key, value] : *webrtc_stat.quality_limitation_durations) { @@ -481,39 +288,21 @@ } v8_stat->setQualityLimitationDurations(std::move(quality_durations)); } - if (webrtc_stat.quality_limitation_resolution_changes.has_value()) { - v8_stat->setQualityLimitationResolutionChanges( - *webrtc_stat.quality_limitation_resolution_changes); - } - if (webrtc_stat.nack_count.has_value()) { - v8_stat->setNackCount(*webrtc_stat.nack_count); - } - if (webrtc_stat.fir_count.has_value()) { - v8_stat->setFirCount(*webrtc_stat.fir_count); - } - if (webrtc_stat.pli_count.has_value()) { - v8_stat->setPliCount(*webrtc_stat.pli_count); - } - if (webrtc_stat.active.has_value()) { - v8_stat->setActive(*webrtc_stat.active); - } - if (webrtc_stat.scalability_mode.has_value()) { - v8_stat->setScalabilityMode( - String::FromUTF8(*webrtc_stat.scalability_mode)); - } + SET_STAT(webrtc_stat.quality_limitation_resolution_changes, + v8_stat->setQualityLimitationResolutionChanges); + SET_STAT(webrtc_stat.nack_count, v8_stat->setNackCount); + SET_STAT(webrtc_stat.fir_count, v8_stat->setFirCount); + SET_STAT(webrtc_stat.pli_count, v8_stat->setPliCount); + SET_STAT(webrtc_stat.active, v8_stat->setActive); + SET_STAT(webrtc_stat.scalability_mode, v8_stat->setScalabilityMode); if (expose_hardware_caps) { - if (webrtc_stat.encoder_implementation.has_value()) { - v8_stat->setEncoderImplementation( - String::FromUTF8(*webrtc_stat.encoder_implementation)); - } - if (webrtc_stat.power_efficient_encoder.has_value()) { - v8_stat->setPowerEfficientEncoder(*webrtc_stat.power_efficient_encoder); - } + SET_STAT(webrtc_stat.encoder_implementation, + v8_stat->setEncoderImplementation); + SET_STAT(webrtc_stat.power_efficient_encoder, + v8_stat->setPowerEfficientEncoder); } // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcoutboundrtpstreamstats-contenttype - if (webrtc_stat.content_type.has_value()) { - v8_stat->setContentType(String::FromUTF8(*webrtc_stat.content_type)); - } + SET_STAT(webrtc_stat.content_type, v8_stat->setContentType); return v8_stat; } @@ -524,47 +313,23 @@ MakeGarbageCollected<RTCRemoteOutboundRtpStreamStats>( script_state->GetIsolate()); // RTCRtpStreamStats - if (webrtc_stat.ssrc.has_value()) { - v8_stat->setSsrc(*webrtc_stat.ssrc); - } - if (webrtc_stat.kind.has_value()) { - v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); - // mediaType is a legacy alias for kind. - v8_stat->setMediaType(String::FromUTF8(*webrtc_stat.kind)); - } - if (webrtc_stat.transport_id.has_value()) { - v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); - } - if (webrtc_stat.codec_id.has_value()) { - v8_stat->setCodecId(String::FromUTF8(*webrtc_stat.codec_id)); - } + SET_STAT(webrtc_stat.ssrc, v8_stat->setSsrc); + SET_STAT(webrtc_stat.kind, v8_stat->setKind); + // mediaType is a legacy alias for kind. + SET_STAT(webrtc_stat.kind, v8_stat->setMediaType); + SET_STAT(webrtc_stat.transport_id, v8_stat->setTransportId); + SET_STAT(webrtc_stat.codec_id, v8_stat->setCodecId); // RTCSendRtpStreamStats - if (webrtc_stat.packets_sent.has_value()) { - v8_stat->setPacketsSent(*webrtc_stat.packets_sent); - } - if (webrtc_stat.bytes_sent.has_value()) { - v8_stat->setBytesSent(*webrtc_stat.bytes_sent); - } + SET_STAT(webrtc_stat.packets_sent, v8_stat->setPacketsSent); + SET_STAT(webrtc_stat.bytes_sent, v8_stat->setBytesSent); // RTCRemoteOutboundRtpStreamStats - if (webrtc_stat.local_id.has_value()) { - v8_stat->setLocalId(String::FromUTF8(*webrtc_stat.local_id)); - } - if (webrtc_stat.remote_timestamp.has_value()) { - v8_stat->setRemoteTimestamp(*webrtc_stat.remote_timestamp); - } - if (webrtc_stat.reports_sent.has_value()) { - v8_stat->setReportsSent(*webrtc_stat.reports_sent); - } - if (webrtc_stat.round_trip_time.has_value()) { - v8_stat->setRoundTripTime(*webrtc_stat.round_trip_time); - } - if (webrtc_stat.total_round_trip_time.has_value()) { - v8_stat->setTotalRoundTripTime(*webrtc_stat.total_round_trip_time); - } - if (webrtc_stat.round_trip_time_measurements.has_value()) { - v8_stat->setRoundTripTimeMeasurements( - *webrtc_stat.round_trip_time_measurements); - } + SET_STAT(webrtc_stat.local_id, v8_stat->setLocalId); + SET_STAT(webrtc_stat.remote_timestamp, v8_stat->setRemoteTimestamp); + SET_STAT(webrtc_stat.reports_sent, v8_stat->setReportsSent); + SET_STAT(webrtc_stat.round_trip_time, v8_stat->setRoundTripTime); + SET_STAT(webrtc_stat.total_round_trip_time, v8_stat->setTotalRoundTripTime); + SET_STAT(webrtc_stat.round_trip_time_measurements, + v8_stat->setRoundTripTimeMeasurements); return v8_stat; } @@ -573,30 +338,16 @@ RTCAudioSourceStats* v8_stat = MakeGarbageCollected<RTCAudioSourceStats>(script_state->GetIsolate()); // RTCMediaSourceStats - if (webrtc_stat.track_identifier.has_value()) { - v8_stat->setTrackIdentifier( - String::FromUTF8(*webrtc_stat.track_identifier)); - } - if (webrtc_stat.kind.has_value()) { - v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); - } + SET_STAT(webrtc_stat.track_identifier, v8_stat->setTrackIdentifier); + SET_STAT(webrtc_stat.kind, v8_stat->setKind); // RTCAudioSourceStats - if (webrtc_stat.audio_level.has_value()) { - v8_stat->setAudioLevel(*webrtc_stat.audio_level); - } - if (webrtc_stat.total_audio_energy.has_value()) { - v8_stat->setTotalAudioEnergy(*webrtc_stat.total_audio_energy); - } - if (webrtc_stat.total_samples_duration.has_value()) { - v8_stat->setTotalSamplesDuration(*webrtc_stat.total_samples_duration); - } - if (webrtc_stat.echo_return_loss.has_value()) { - v8_stat->setEchoReturnLoss(*webrtc_stat.echo_return_loss); - } - if (webrtc_stat.echo_return_loss_enhancement.has_value()) { - v8_stat->setEchoReturnLossEnhancement( - *webrtc_stat.echo_return_loss_enhancement); - } + SET_STAT(webrtc_stat.audio_level, v8_stat->setAudioLevel); + SET_STAT(webrtc_stat.total_audio_energy, v8_stat->setTotalAudioEnergy); + SET_STAT(webrtc_stat.total_samples_duration, + v8_stat->setTotalSamplesDuration); + SET_STAT(webrtc_stat.echo_return_loss, v8_stat->setEchoReturnLoss); + SET_STAT(webrtc_stat.echo_return_loss_enhancement, + v8_stat->setEchoReturnLossEnhancement); return v8_stat; } @@ -606,26 +357,13 @@ RTCVideoSourceStats* v8_stat = MakeGarbageCollected<RTCVideoSourceStats>(script_state->GetIsolate()); // RTCMediaSourceStats - if (webrtc_stat.track_identifier.has_value()) { - v8_stat->setTrackIdentifier( - String::FromUTF8(*webrtc_stat.track_identifier)); - } - if (webrtc_stat.kind.has_value()) { - v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); - } + SET_STAT(webrtc_stat.track_identifier, v8_stat->setTrackIdentifier); + SET_STAT(webrtc_stat.kind, v8_stat->setKind); // RTCVideoSourceStats - if (webrtc_stat.width.has_value()) { - v8_stat->setWidth(*webrtc_stat.width); - } - if (webrtc_stat.height.has_value()) { - v8_stat->setHeight(*webrtc_stat.height); - } - if (webrtc_stat.frames.has_value()) { - v8_stat->setFrames(*webrtc_stat.frames); - } - if (webrtc_stat.frames_per_second.has_value()) { - v8_stat->setFramesPerSecond(*webrtc_stat.frames_per_second); - } + SET_STAT(webrtc_stat.width, v8_stat->setWidth); + SET_STAT(webrtc_stat.height, v8_stat->setHeight); + SET_STAT(webrtc_stat.frames, v8_stat->setFrames); + SET_STAT(webrtc_stat.frames_per_second, v8_stat->setFramesPerSecond); return v8_stat; } @@ -636,26 +374,19 @@ RTCAudioPlayoutStats* v8_stat = MakeGarbageCollected<RTCAudioPlayoutStats>(script_state->GetIsolate()); - if (webrtc_stat.kind.has_value()) { - v8_stat->setKind(String::FromUTF8(*webrtc_stat.kind)); - } - if (webrtc_stat.synthesized_samples_duration.has_value()) { - v8_stat->setSynthesizedSamplesDuration( - *webrtc_stat.synthesized_samples_duration); - } + SET_STAT(webrtc_stat.kind, v8_stat->setKind); + SET_STAT(webrtc_stat.synthesized_samples_duration, + v8_stat->setSynthesizedSamplesDuration); if (webrtc_stat.synthesized_samples_events.has_value()) { v8_stat->setSynthesizedSamplesEvents(base::saturated_cast<uint32_t>( *webrtc_stat.synthesized_samples_events)); } - if (webrtc_stat.total_samples_duration.has_value()) { - v8_stat->setTotalSamplesDuration(*webrtc_stat.total_samples_duration); - } - if (webrtc_stat.total_playout_delay.has_value()) { - v8_stat->setTotalPlayoutDelay(*webrtc_stat.total_playout_delay); - } - if (webrtc_stat.total_samples_count.has_value()) { - v8_stat->setTotalSamplesCount(*webrtc_stat.total_samples_count); - } + SET_STAT(webrtc_stat.synthesized_samples_events, + v8_stat->setSynthesizedSamplesEvents); + SET_STAT(webrtc_stat.total_samples_duration, + v8_stat->setTotalSamplesDuration); + SET_STAT(webrtc_stat.total_playout_delay, v8_stat->setTotalPlayoutDelay); + SET_STAT(webrtc_stat.total_samples_count, v8_stat->setTotalSamplesCount); return v8_stat; } @@ -666,12 +397,8 @@ RTCPeerConnectionStats* v8_stat = MakeGarbageCollected<RTCPeerConnectionStats>(script_state->GetIsolate()); - if (webrtc_stat.data_channels_opened.has_value()) { - v8_stat->setDataChannelsOpened(*webrtc_stat.data_channels_opened); - } - if (webrtc_stat.data_channels_closed.has_value()) { - v8_stat->setDataChannelsClosed(*webrtc_stat.data_channels_closed); - } + SET_STAT(webrtc_stat.data_channels_opened, v8_stat->setDataChannelsOpened); + SET_STAT(webrtc_stat.data_channels_closed, v8_stat->setDataChannelsClosed); return v8_stat; } @@ -681,30 +408,15 @@ RTCDataChannelStats* v8_stat = MakeGarbageCollected<RTCDataChannelStats>(script_state->GetIsolate()); - if (webrtc_stat.label.has_value()) { - v8_stat->setLabel(String::FromUTF8(*webrtc_stat.label)); - } - if (webrtc_stat.protocol.has_value()) { - v8_stat->setProtocol(String::FromUTF8(*webrtc_stat.protocol)); - } - if (webrtc_stat.data_channel_identifier.has_value()) { - v8_stat->setDataChannelIdentifier(*webrtc_stat.data_channel_identifier); - } - if (webrtc_stat.state.has_value()) { - v8_stat->setState(String::FromUTF8(*webrtc_stat.state)); - } - if (webrtc_stat.messages_sent.has_value()) { - v8_stat->setMessagesSent(*webrtc_stat.messages_sent); - } - if (webrtc_stat.bytes_sent.has_value()) { - v8_stat->setBytesSent(*webrtc_stat.bytes_sent); - } - if (webrtc_stat.messages_received.has_value()) { - v8_stat->setMessagesReceived(*webrtc_stat.messages_received); - } - if (webrtc_stat.bytes_received.has_value()) { - v8_stat->setBytesReceived(*webrtc_stat.bytes_received); - } + SET_STAT(webrtc_stat.label, v8_stat->setLabel); + SET_STAT(webrtc_stat.protocol, v8_stat->setProtocol); + SET_STAT(webrtc_stat.data_channel_identifier, + v8_stat->setDataChannelIdentifier); + SET_STAT(webrtc_stat.state, v8_stat->setState); + SET_STAT(webrtc_stat.messages_sent, v8_stat->setMessagesSent); + SET_STAT(webrtc_stat.bytes_sent, v8_stat->setBytesSent); + SET_STAT(webrtc_stat.messages_received, v8_stat->setMessagesReceived); + SET_STAT(webrtc_stat.bytes_received, v8_stat->setBytesReceived); return v8_stat; } @@ -714,64 +426,28 @@ RTCTransportStats* v8_stat = MakeGarbageCollected<RTCTransportStats>(script_state->GetIsolate()); - if (webrtc_stat.packets_sent.has_value()) { - v8_stat->setPacketsSent(*webrtc_stat.packets_sent); - } - if (webrtc_stat.packets_received.has_value()) { - v8_stat->setPacketsReceived(*webrtc_stat.packets_received); - } - if (webrtc_stat.bytes_sent.has_value()) { - v8_stat->setBytesSent(*webrtc_stat.bytes_sent); - } - if (webrtc_stat.bytes_received.has_value()) { - v8_stat->setBytesReceived(*webrtc_stat.bytes_received); - } - if (webrtc_stat.ice_role.has_value()) { - v8_stat->setIceRole(String::FromUTF8(*webrtc_stat.ice_role)); - } - if (webrtc_stat.ice_local_username_fragment.has_value()) { - v8_stat->setIceLocalUsernameFragment( - String::FromUTF8(*webrtc_stat.ice_local_username_fragment)); - } - if (webrtc_stat.dtls_state.has_value()) { - v8_stat->setDtlsState(String::FromUTF8(*webrtc_stat.dtls_state)); - } - if (webrtc_stat.ice_state.has_value()) { - v8_stat->setIceState(String::FromUTF8(*webrtc_stat.ice_state)); - } - if (webrtc_stat.selected_candidate_pair_id.has_value()) { - v8_stat->setSelectedCandidatePairId( - String::FromUTF8(*webrtc_stat.selected_candidate_pair_id)); - } - if (webrtc_stat.local_certificate_id.has_value()) { - v8_stat->setLocalCertificateId( - String::FromUTF8(*webrtc_stat.local_certificate_id)); - } - if (webrtc_stat.remote_certificate_id.has_value()) { - v8_stat->setRemoteCertificateId( - String::FromUTF8(*webrtc_stat.remote_certificate_id)); - } - if (webrtc_stat.tls_version.has_value()) { - v8_stat->setTlsVersion(String::FromUTF8(*webrtc_stat.tls_version)); - } - if (webrtc_stat.dtls_cipher.has_value()) { - v8_stat->setDtlsCipher(String::FromUTF8(*webrtc_stat.dtls_cipher)); - } - if (webrtc_stat.dtls_role.has_value()) { - v8_stat->setDtlsRole(String::FromUTF8(*webrtc_stat.dtls_role)); - } - if (webrtc_stat.srtp_cipher.has_value()) { - v8_stat->setSrtpCipher(String::FromUTF8(*webrtc_stat.srtp_cipher)); - } - if (webrtc_stat.selected_candidate_pair_changes.has_value()) { - v8_stat->setSelectedCandidatePairChanges( - *webrtc_stat.selected_candidate_pair_changes); - } + SET_STAT(webrtc_stat.packets_sent, v8_stat->setPacketsSent); + SET_STAT(webrtc_stat.packets_received, v8_stat->setPacketsReceived); + SET_STAT(webrtc_stat.bytes_sent, v8_stat->setBytesSent); + SET_STAT(webrtc_stat.bytes_received, v8_stat->setBytesReceived); + SET_STAT(webrtc_stat.ice_role, v8_stat->setIceRole); + SET_STAT(webrtc_stat.ice_local_username_fragment, + v8_stat->setIceLocalUsernameFragment); + SET_STAT(webrtc_stat.dtls_state, v8_stat->setDtlsState); + SET_STAT(webrtc_stat.ice_state, v8_stat->setIceState); + SET_STAT(webrtc_stat.selected_candidate_pair_id, + v8_stat->setSelectedCandidatePairId); + SET_STAT(webrtc_stat.local_certificate_id, v8_stat->setLocalCertificateId); + SET_STAT(webrtc_stat.remote_certificate_id, v8_stat->setRemoteCertificateId); + SET_STAT(webrtc_stat.tls_version, v8_stat->setTlsVersion); + SET_STAT(webrtc_stat.dtls_cipher, v8_stat->setDtlsCipher); + SET_STAT(webrtc_stat.dtls_role, v8_stat->setDtlsRole); + SET_STAT(webrtc_stat.srtp_cipher, v8_stat->setSrtpCipher); + SET_STAT(webrtc_stat.selected_candidate_pair_changes, + v8_stat->setSelectedCandidatePairChanges); // https://w3c.github.io/webrtc-provisional-stats/#dom-rtctransportstats-rtcptransportstatsid - if (webrtc_stat.rtcp_transport_stats_id.has_value()) { - v8_stat->setRtcpTransportStatsId( - String::FromUTF8(*webrtc_stat.rtcp_transport_stats_id)); - } + SET_STAT(webrtc_stat.rtcp_transport_stats_id, + v8_stat->setRtcpTransportStatsId); return v8_stat; } @@ -781,58 +457,25 @@ const webrtc::RTCIceCandidateStats& webrtc_stat) { RTCIceCandidateStats* v8_stat = MakeGarbageCollected<RTCIceCandidateStats>(script_state->GetIsolate()); - if (webrtc_stat.transport_id.has_value()) { - v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); - } - if (webrtc_stat.address.has_value()) { - v8_stat->setAddress(String::FromUTF8(*webrtc_stat.address)); - } - if (webrtc_stat.port.has_value()) { - v8_stat->setPort(*webrtc_stat.port); - } - if (webrtc_stat.protocol.has_value()) { - v8_stat->setProtocol(String::FromUTF8(*webrtc_stat.protocol)); - } - if (webrtc_stat.candidate_type.has_value()) { - v8_stat->setCandidateType(String::FromUTF8(*webrtc_stat.candidate_type)); - } - if (webrtc_stat.priority.has_value()) { - v8_stat->setPriority(*webrtc_stat.priority); - } - if (webrtc_stat.url.has_value()) { - v8_stat->setUrl(String::FromUTF8(*webrtc_stat.url)); - } - if (webrtc_stat.relay_protocol.has_value()) { - v8_stat->setRelayProtocol(String::FromUTF8(*webrtc_stat.relay_protocol)); - } - if (webrtc_stat.foundation.has_value()) { - v8_stat->setFoundation(String::FromUTF8(*webrtc_stat.foundation)); - } - if (webrtc_stat.related_address.has_value()) { - v8_stat->setRelatedAddress(String::FromUTF8(*webrtc_stat.related_address)); - } - if (webrtc_stat.related_port.has_value()) { - v8_stat->setRelatedPort(*webrtc_stat.related_port); - } - if (webrtc_stat.username_fragment.has_value()) { - v8_stat->setUsernameFragment( - String::FromUTF8(*webrtc_stat.username_fragment)); - } - if (webrtc_stat.tcp_type.has_value()) { - v8_stat->setTcpType(String::FromUTF8(*webrtc_stat.tcp_type)); - } + SET_STAT(webrtc_stat.transport_id, v8_stat->setTransportId); + SET_STAT(webrtc_stat.address, v8_stat->setAddress); + SET_STAT(webrtc_stat.port, v8_stat->setPort); + SET_STAT(webrtc_stat.protocol, v8_stat->setProtocol); + SET_STAT(webrtc_stat.candidate_type, v8_stat->setCandidateType); + SET_STAT(webrtc_stat.priority, v8_stat->setPriority); + SET_STAT(webrtc_stat.url, v8_stat->setUrl); + SET_STAT(webrtc_stat.relay_protocol, v8_stat->setRelayProtocol); + SET_STAT(webrtc_stat.foundation, v8_stat->setFoundation); + SET_STAT(webrtc_stat.related_address, v8_stat->setRelatedAddress); + SET_STAT(webrtc_stat.related_port, v8_stat->setRelatedPort); + SET_STAT(webrtc_stat.username_fragment, v8_stat->setUsernameFragment); + SET_STAT(webrtc_stat.tcp_type, v8_stat->setTcpType); // https://w3c.github.io/webrtc-provisional-stats/#dom-rtcicecandidatestats-networktype // Note: additional work needed to reach consensus on the privacy model. - if (webrtc_stat.network_type.has_value()) { - v8_stat->setNetworkType(String::FromUTF8(*webrtc_stat.network_type)); - } + SET_STAT(webrtc_stat.network_type, v8_stat->setNetworkType); // Non-standard and obsolete stats. - if (webrtc_stat.is_remote.has_value()) { - v8_stat->setIsRemote(*webrtc_stat.is_remote); - } - if (webrtc_stat.ip.has_value()) { - v8_stat->setIp(String::FromUTF8(*webrtc_stat.ip)); - } + SET_STAT(webrtc_stat.is_remote, v8_stat->setIsRemote); + SET_STAT(webrtc_stat.ip, v8_stat->setIp); return v8_stat; } @@ -843,86 +486,40 @@ RTCIceCandidatePairStats* v8_stat = MakeGarbageCollected<RTCIceCandidatePairStats>( script_state->GetIsolate()); - if (webrtc_stat.transport_id.has_value()) { - v8_stat->setTransportId(String::FromUTF8(*webrtc_stat.transport_id)); - } - if (webrtc_stat.local_candidate_id.has_value()) { - v8_stat->setLocalCandidateId( - String::FromUTF8(*webrtc_stat.local_candidate_id)); - } - if (webrtc_stat.remote_candidate_id.has_value()) { - v8_stat->setRemoteCandidateId( - String::FromUTF8(*webrtc_stat.remote_candidate_id)); - } - if (webrtc_stat.state.has_value()) { - v8_stat->setState(String::FromUTF8(*webrtc_stat.state)); - } - if (webrtc_stat.nominated.has_value()) { - v8_stat->setNominated(*webrtc_stat.nominated); - } - if (webrtc_stat.packets_sent.has_value()) { - v8_stat->setPacketsSent(*webrtc_stat.packets_sent); - } - if (webrtc_stat.packets_received.has_value()) { - v8_stat->setPacketsReceived(*webrtc_stat.packets_received); - } - if (webrtc_stat.bytes_sent.has_value()) { - v8_stat->setBytesSent(*webrtc_stat.bytes_sent); - } - if (webrtc_stat.bytes_received.has_value()) { - v8_stat->setBytesReceived(*webrtc_stat.bytes_received); - } - if (webrtc_stat.last_packet_sent_timestamp.has_value()) { - v8_stat->setLastPacketSentTimestamp( - *webrtc_stat.last_packet_sent_timestamp); - } - if (webrtc_stat.last_packet_received_timestamp.has_value()) { - v8_stat->setLastPacketReceivedTimestamp( - *webrtc_stat.last_packet_received_timestamp); - } - if (webrtc_stat.total_round_trip_time.has_value()) { - v8_stat->setTotalRoundTripTime(*webrtc_stat.total_round_trip_time); - } - if (webrtc_stat.current_round_trip_time.has_value()) { - v8_stat->setCurrentRoundTripTime(*webrtc_stat.current_round_trip_time); - } - if (webrtc_stat.available_outgoing_bitrate.has_value()) { - v8_stat->setAvailableOutgoingBitrate( - *webrtc_stat.available_outgoing_bitrate); - } - if (webrtc_stat.available_incoming_bitrate.has_value()) { - v8_stat->setAvailableIncomingBitrate( - *webrtc_stat.available_incoming_bitrate); - } - if (webrtc_stat.requests_received.has_value()) { - v8_stat->setRequestsReceived(*webrtc_stat.requests_received); - } - if (webrtc_stat.requests_sent.has_value()) { - v8_stat->setRequestsSent(*webrtc_stat.requests_sent); - } - if (webrtc_stat.responses_received.has_value()) { - v8_stat->setResponsesReceived(*webrtc_stat.responses_received); - } - if (webrtc_stat.responses_sent.has_value()) { - v8_stat->setResponsesSent(*webrtc_stat.responses_sent); - } - if (webrtc_stat.consent_requests_sent.has_value()) { - v8_stat->setConsentRequestsSent(*webrtc_stat.consent_requests_sent); - } + SET_STAT(webrtc_stat.transport_id, v8_stat->setTransportId); + SET_STAT(webrtc_stat.local_candidate_id, v8_stat->setLocalCandidateId); + SET_STAT(webrtc_stat.remote_candidate_id, v8_stat->setRemoteCandidateId); + SET_STAT(webrtc_stat.state, v8_stat->setState); + SET_STAT(webrtc_stat.nominated, v8_stat->setNominated); + SET_STAT(webrtc_stat.packets_sent, v8_stat->setPacketsSent); + SET_STAT(webrtc_stat.packets_received, v8_stat->setPacketsReceived); + SET_STAT(webrtc_stat.bytes_sent, v8_stat->setBytesSent); + SET_STAT(webrtc_stat.bytes_received, v8_stat->setBytesReceived); + SET_STAT(webrtc_stat.last_packet_sent_timestamp, + v8_stat->setLastPacketSentTimestamp); + SET_STAT(webrtc_stat.last_packet_received_timestamp, + v8_stat->setLastPacketReceivedTimestamp); + SET_STAT(webrtc_stat.total_round_trip_time, v8_stat->setTotalRoundTripTime); + SET_STAT(webrtc_stat.current_round_trip_time, + v8_stat->setCurrentRoundTripTime); + SET_STAT(webrtc_stat.available_outgoing_bitrate, + v8_stat->setAvailableOutgoingBitrate); + SET_STAT(webrtc_stat.available_incoming_bitrate, + v8_stat->setAvailableIncomingBitrate); + SET_STAT(webrtc_stat.requests_received, v8_stat->setRequestsReceived); + SET_STAT(webrtc_stat.requests_sent, v8_stat->setRequestsSent); + SET_STAT(webrtc_stat.responses_received, v8_stat->setResponsesReceived); + SET_STAT(webrtc_stat.responses_sent, v8_stat->setResponsesSent); + SET_STAT(webrtc_stat.consent_requests_sent, v8_stat->setConsentRequestsSent); if (webrtc_stat.packets_discarded_on_send.has_value()) { v8_stat->setPacketsDiscardedOnSend( base::saturated_cast<uint32_t>(*webrtc_stat.packets_discarded_on_send)); } - if (webrtc_stat.bytes_discarded_on_send.has_value()) { - v8_stat->setBytesDiscardedOnSend(*webrtc_stat.bytes_discarded_on_send); - } + SET_STAT(webrtc_stat.bytes_discarded_on_send, + v8_stat->setBytesDiscardedOnSend); // Non-standard and obsolete stats. - if (webrtc_stat.writable.has_value()) { - v8_stat->setWritable(*webrtc_stat.writable); - } - if (webrtc_stat.priority.has_value()) { - v8_stat->setPriority(*webrtc_stat.priority); - } + SET_STAT(webrtc_stat.writable, v8_stat->setWritable); + SET_STAT(webrtc_stat.priority, v8_stat->setPriority); return v8_stat; } @@ -931,21 +528,10 @@ const webrtc::RTCCertificateStats& webrtc_stat) { RTCCertificateStats* v8_stat = MakeGarbageCollected<RTCCertificateStats>(script_state->GetIsolate()); - if (webrtc_stat.fingerprint.has_value()) { - v8_stat->setFingerprint(String::FromUTF8(*webrtc_stat.fingerprint)); - } - if (webrtc_stat.fingerprint_algorithm.has_value()) { - v8_stat->setFingerprintAlgorithm( - String::FromUTF8(*webrtc_stat.fingerprint_algorithm)); - } - if (webrtc_stat.base64_certificate.has_value()) { - v8_stat->setBase64Certificate( - String::FromUTF8(*webrtc_stat.base64_certificate)); - } - if (webrtc_stat.issuer_certificate_id.has_value()) { - v8_stat->setIssuerCertificateId( - String::FromUTF8(*webrtc_stat.issuer_certificate_id)); - } + SET_STAT(webrtc_stat.fingerprint, v8_stat->setFingerprint); + SET_STAT(webrtc_stat.fingerprint_algorithm, v8_stat->setFingerprintAlgorithm); + SET_STAT(webrtc_stat.base64_certificate, v8_stat->setBase64Certificate); + SET_STAT(webrtc_stat.issuer_certificate_id, v8_stat->setIssuerCertificateId); return v8_stat; }
diff --git a/third_party/blink/renderer/platform/geometry/math_functions.h b/third_party/blink/renderer/platform/geometry/math_functions.h index 9c11fb7..2b62620 100644 --- a/third_party/blink/renderer/platform/geometry/math_functions.h +++ b/third_party/blink/renderer/platform/geometry/math_functions.h
@@ -8,6 +8,7 @@ #include <cfloat> #include <cmath> #include <optional> +#include <type_traits> #include <utility> #include "base/notreached.h"
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 7fcb3aa..748dbbe 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1450,6 +1450,11 @@ status: "stable", }, { + // https://drafts.csswg.org/css-scroll-snap-2/#snapevent-interface + name: "CSSScrollSnapEventConstructorExposed", + status: "experimental", + }, + { // https://drafts.csswg.org/css-scroll-snap-2/#snap-events name: "CSSScrollSnapEvents", status: "stable", @@ -4231,6 +4236,12 @@ base_feature: "none", }, { + // Implements new UX for SPC including new output states, payment + // instrument details and payment entities logos. + name: "SecurePaymentConfirmationUxRefresh", + status: "test", + }, + { // Implements improved accessibility mappings for having an <input> // inside of a <select> by keeping the child <input> in the a11y tree at // the same place that its at in the DOM tree, but automatically setting
diff --git a/third_party/blink/web_tests/ASANExpectations b/third_party/blink/web_tests/ASANExpectations index a9e74ce5..8151131 100644 --- a/third_party/blink/web_tests/ASANExpectations +++ b/third_party/blink/web_tests/ASANExpectations
@@ -38,3 +38,9 @@ # Gardener 2025-02-12 crbug.com/396104415 [ Linux ] virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-image.html [ Slow ] + +# Gardener 2025-04-28. +crbug.com/414243950 [ Linux ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.html?cpu [ Crash ] +crbug.com/414243950 [ Linux ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker.html?cpu [ Crash ] +crbug.com/414243950 [ Linux ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker.html?cpu [ Crash ] +crbug.com/414243950 [ Linux ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker.html?cpu [ Crash ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index ef2580b3..0131ddc 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2813,6 +2813,7 @@ crbug.com/413411328 external/wpt/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrerpolicy-same-origin.sub.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/418175808 [ Mac12 ] external/wpt/html/cross-origin-embedder-policy/credentialless/reporting-subresource-corp.https.window.html [ Skip Timeout ] crbug.com/418024434 [ Mac13 ] external/wpt/html/document-isolation-policy/service-worker-coep-credentialless-proxy.https.tentative.window.html [ Timeout ] crbug.com/418031072 [ Linux ] external/wpt/webrtc-encoded-transform/RTCRtpScriptTransform-encoded-transform.https.html [ Pass Timeout ] crbug.com/417940356 [ Win11 ] external/wpt/page-lifecycle/child-display-none.tentative.html [ Timeout ] @@ -9398,15 +9399,13 @@ crbug.com/412431600 [ Win10.20h2 ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.html?cpu [ Failure Pass ] crbug.com/412431600 [ Win10.20h2 ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.sharedworker.html?cpu [ Failure Pass ] +# Gardener 2025-05-16 +crbug.com/418169805 [ Win ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker.html?cpu [ Failure Pass ] +crbug.com/418173365 [ Win ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker.html?cpu [ Failure Pass ] + # Gardener 2025-04-28 crbug.com/414234413 [ Mac13-arm64 ] http/tests/devtools/elements/styles-1/edit-value-with-trimmed-url.js [ Failure Pass ] -# Gardener 2025-04-28. Fails on Linux ASAN -crbug.com/414243950 [ Linux ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.html?cpu [ Crash ] -crbug.com/414243950 [ Linux ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker.html?cpu [ Crash ] -crbug.com/414243950 [ Linux ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker.html?cpu [ Crash ] -crbug.com/414243950 [ Linux ] virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker.html?cpu [ Crash ] - # Gardener 2025-05-01 crbug.com/411161567 [ Linux ] accessibility/interest-target.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 51e40dc..229bf7b4 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -320029,6 +320029,14 @@ [] ] }, + "getRandomValues.any-expected.txt": [ + "a86fd15b3b1c0c56a368f7cadffdee406d1780fa", + [] + ], + "getRandomValues.any.worker-expected.txt": [ + "a86fd15b3b1c0c56a368f7cadffdee406d1780fa", + [] + ], "import_export": { "ec_importKey_failures_fixtures.js": [ "a2d25e816cbd7354105cfde9e46ffdffbeb38e23", @@ -388005,12 +388013,20 @@ "fc59ea73f4e46d7fc9b92ecc9e755335732bad4d", [] ], + "accumulated-oversized-payload.tentative.https.window-expected.txt": [ + "df0a946017563ea1cf3f55891d150d9445f71d9f", + [] + ], "cross-origin-iframe": { "README.md": [ "bd802f0b2d2c8d30e97015a8d69804ccac564f5e", [] ] }, + "oversized-payload.tentative.https.window-expected.txt": [ + "f37e984e156572ae95d5b0c1e2515b44344fb499", + [] + ], "resources": { "helper.js": [ "bd9571c82f58459ec0a9f27d50370bc9ca7913b7", @@ -388021,6 +388037,10 @@ "README.md": [ "025422314edc35e6b84f05b63a31b607a7dcd7c0", [] + ], + "multiple-iframes.tentative.https.window-expected.txt": [ + "76f2f051d8ba36632ebc0406e4e9033a407e622f", + [] ] } }, @@ -390785,6 +390805,14 @@ "16b976ab451500a09882e7fda75b8bf2f4af2acc", [] ], + "FileSystemBaseHandle-buckets.https.any-expected.txt": [ + "6c8aec561ff5ccbad971d213d862b9d61ea647f8", + [] + ], + "FileSystemBaseHandle-buckets.https.any.worker-expected.txt": [ + "6c8aec561ff5ccbad971d213d862b9d61ea647f8", + [] + ], "FileSystemWritableFileStream.https.any-expected.txt": [ "71db9e8fa9ab81b78bdb2aff17ae0b87ed1b0043", [] @@ -421314,7 +421342,7 @@ [] ], "testharness.js": [ - "32f033a569b166b238fa9b02fbf99639f1f2f90c", + "6ccede34483b227cc41fcb15235e56aa60d4022e", [] ], "testharness.js.headers": [ @@ -426714,6 +426742,14 @@ "f14b4c0f51e47396faad24747bd58015c0c3c262", [] ], + "bucket-quota-indexeddb.tentative.https.any-expected.txt": [ + "135a0f85ca34b0d02d7c5c9907c0f71888eb496d", + [] + ], + "bucket-quota-indexeddb.tentative.https.any.worker-expected.txt": [ + "135a0f85ca34b0d02d7c5c9907c0f71888eb496d", + [] + ], "resources": { "cached-resource.txt": [ "c57eff55ebc0c54973903af5f72bac72762cf4f4", @@ -435113,6 +435149,14 @@ [] ], "es-exceptions": { + "DOMException-constructor-behavior.any-expected.txt": [ + "864f00e15f725039b1b87c4e027bf95178651151", + [] + ], + "DOMException-constructor-behavior.any.worker-expected.txt": [ + "864f00e15f725039b1b87c4e027bf95178651151", + [] + ], "DOMException-custom-bindings.any-expected.txt": [ "018987dc5956289530510ff5ab899cc2d365f22c", [] @@ -436447,6 +436491,14 @@ "c22db206a944414f21a770732ed4c5847918d8f2", [] ], + "storage_local_setitem_quotaexceedederr.window-expected.txt": [ + "46a5fb07eb8d22ccd92d911b64679a5d5f429da4", + [] + ], + "storage_session_setitem_quotaexceedederr.window-expected.txt": [ + "c5fe5ba652b61147ac139cf107297347df9bbbf9", + [] + ], "symbol-props.window-expected.txt": [ "63078d0da1d964829d01d262953f4ea2c8641d29", [] @@ -716309,7 +716361,7 @@ "storage": { "buckets": { "bucket-quota-indexeddb.tentative.https.any.js": [ - "49cd7077b7908e75ee626d307fffbba8310630fe", + "ee9202777e7ec55faee0b89f4c656f7a76c05e83", [ "storage/buckets/bucket-quota-indexeddb.tentative.https.any.html", { @@ -764433,7 +764485,7 @@ ] ], "DOMException-constructor-behavior.any.js": [ - "5bb6da77a7d1ca7d68a74538b36e609bb3f0c417", + "c4ddabdafd4597aac6f13ad5182b78566045c09a", [ "webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.html", {
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/getRandomValues.any-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/getRandomValues.any-expected.txt new file mode 100644 index 0000000..a86fd15 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/getRandomValues.any-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +[FAIL] Large length: Int8Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65537) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Int16Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65538) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Int32Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65540) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: BigInt64Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65544) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Uint8Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65537) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Uint8ClampedArray + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65537) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Uint16Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65538) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Uint32Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65540) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: BigUint64Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65544) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/WebCryptoAPI/getRandomValues.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/getRandomValues.any.worker-expected.txt new file mode 100644 index 0000000..a86fd15 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/WebCryptoAPI/getRandomValues.any.worker-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +[FAIL] Large length: Int8Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65537) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Int16Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65538) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Int32Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65540) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: BigInt64Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65544) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Uint8Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65537) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Uint8ClampedArray + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65537) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Uint16Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65538) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: Uint32Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65540) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] Large length: BigUint64Array + assert_throws_dom: crypto.getRandomValues length over 65536 function "function() {\n self.crypto.getRandomValues(new ctor(maxlength + 1))\n }" threw object "QuotaExceededError: Failed to execute 'getRandomValues' on 'Crypto': The ArrayBufferView's byte length (65544) exceeds the number of bytes of entropy available via this API (65536)." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snapevent-constructor.html b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snapevent-constructor.html new file mode 100644 index 0000000..a5257d77 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/snapevent-constructor.html
@@ -0,0 +1,42 @@ +<!DOCTYPE html> +<html> +<head> +<meta charset="utf-8"> +<link rel=help href="https://drafts.csswg.org/css-scroll-snap-2/#snapevent-interface"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> + <script> + test(function() { + assert_throws_js(TypeError, function() { + new SnapEvent(); + }, 'First argument (type) is required, so was expecting a TypeError.'); + }, 'Missing type argument'); + + test(function() { + let event = new SnapEvent(""); + assert_true(event instanceof window.SnapEvent); + }, "the event is an instance of SnapEvent"); + + test(function() { + let event = new SnapEvent("customsnapevent"); + assert_equals(event.type, "customsnapevent", + "event constructor type is honored"); + assert_equals(event.snapTargetBlock, null, "null snapTrgetBlock"); + assert_equals(event.snapTargetInline, null, "null snapTargetInline"); + }, "default init dict"); + + test(function() { + const div_element = document.createElement("div"); + let event = new SnapEvent("scrollsnapchange", { + snapTargetBlock: document, + snapTargetInline: div_element + }); + assert_equals(event.type, "scrollsnapchange"); + assert_equals(event.snapTargetBlock, document); + assert_equals(event.snapTargetInline, div_element); + }, "event constructor type is honored"); + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/pseudo-get-computed-style.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/pseudo-get-computed-style.html index 60e032b1..274e946 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/pseudo-get-computed-style.html +++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/pseudo-get-computed-style.html
@@ -47,24 +47,25 @@ assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").colorScheme, "normal", "container(target)"); assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").mixBlendMode, "normal", "container(target)"); assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(root)").mixBlendMode, "normal", "container(root)"); - - // After one frame, the activation of the view transition should be done, so - // we have updated the pseudo-element styles. - requestAnimationFrame(() => { - assert_equals(getComputedStyle(document.documentElement, "::view-transition").position, "fixed", "raf ::view-transition"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").position, "absolute", "raf container(target)"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").mixBlendMode, "multiply", "raf container(target)"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").textOrientation, "upright", "raf container(target)"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").colorScheme, "dark light", "raf container(target)"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-image-pair(target)").position, "fixed", "raf wrapper(target)"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-old(target)").position, "absolute", "raf outgoing(target)"); - - assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(root)").position, "absolute", "raf container(root)"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(root)").mixBlendMode, "normal", "raf container(root)"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-image-pair(root)").position, "absolute", "raf wrapper(root)"); - assert_equals(getComputedStyle(document.documentElement, "::view-transition-old(root)").position, "absolute", "raf outgoing(root)"); - }); }); + + // When transition is ready, the activation of the view transition should be done, so + // we have updated the pseudo-element styles. + await transition.ready; + + assert_equals(getComputedStyle(document.documentElement, "::view-transition").position, "fixed", "raf ::view-transition"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").position, "absolute", "raf container(target)"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").mixBlendMode, "multiply", "raf container(target)"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").textOrientation, "upright", "raf container(target)"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(target)").colorScheme, "dark light", "raf container(target)"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-image-pair(target)").position, "fixed", "raf wrapper(target)"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-old(target)").position, "absolute", "raf outgoing(target)"); + + assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(root)").position, "absolute", "raf container(root)"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-group(root)").mixBlendMode, "normal", "raf container(root)"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-image-pair(root)").position, "absolute", "raf wrapper(root)"); + assert_equals(getComputedStyle(document.documentElement, "::view-transition-old(root)").position, "absolute", "raf outgoing(root)"); + await transition.finished; }, "properties of pseudo elements in update callback");
diff --git a/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/accumulated-oversized-payload.tentative.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/accumulated-oversized-payload.tentative.https.window-expected.txt new file mode 100644 index 0000000..df0a946 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/accumulated-oversized-payload.tentative.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] The 2nd fetchLater(same-origin) call in the top-level document is not allowed to exceed per-origin quota for its POST body of String. + assert_throws_dom: function "() => {\n fetchLater(requestUrl, {\n method: 'POST',\n signal: controller.signal,\n body: makeBeaconData(generatePayload(quota), dataType),\n // Required, as the size of referrer also take up quota.\n referrer: '',\n });\n }" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65536 bytes, expected less than 32734 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/oversized-payload.tentative.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/oversized-payload.tentative.https.window-expected.txt new file mode 100644 index 0000000..f37e984e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/oversized-payload.tentative.https.window-expected.txt
@@ -0,0 +1,15 @@ +This is a testharness.js-based test. +[FAIL] fetchLater() does not accept payload[size=65537] exceeding per-origin quota in a POST request body of String. + assert_throws_dom: function "() => fetchLater('/', {\n activateAfter: 0,\n method: 'POST',\n body: makeBeaconData(\n generatePayload(OVERSIZED_REQUEST_BODY_SIZE), dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65616 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] fetchLater() does not accept payload[size=65537] exceeding per-origin quota in a POST request body of ArrayBuffer. + assert_throws_dom: function "() => fetchLater('/', {\n activateAfter: 0,\n method: 'POST',\n body: makeBeaconData(\n generatePayload(OVERSIZED_REQUEST_BODY_SIZE), dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65580 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] fetchLater() does not accept payload[size=65537] exceeding per-origin quota in a POST request body of FormData. + assert_throws_dom: function "() => fetchLater('/', {\n activateAfter: 0,\n method: 'POST',\n body: makeBeaconData(\n generatePayload(OVERSIZED_REQUEST_BODY_SIZE), dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65798 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] fetchLater() does not accept payload[size=65537] exceeding per-origin quota in a POST request body of URLSearchParams. + assert_throws_dom: function "() => fetchLater('/', {\n activateAfter: 0,\n method: 'POST',\n body: makeBeaconData(\n generatePayload(OVERSIZED_REQUEST_BODY_SIZE), dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65649 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] fetchLater() does not accept payload[size=65537] exceeding per-origin quota in a POST request body of Blob. + assert_throws_dom: function "() => fetchLater('/', {\n activateAfter: 0,\n method: 'POST',\n body: makeBeaconData(\n generatePayload(OVERSIZED_REQUEST_BODY_SIZE), dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65580 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +[FAIL] fetchLater() does not accept payload[size=65537] exceeding per-origin quota in a POST request body of File. + assert_throws_dom: function "() => fetchLater('/', {\n activateAfter: 0,\n method: 'POST',\n body: makeBeaconData(\n generatePayload(OVERSIZED_REQUEST_BODY_SIZE), dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65602 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/same-origin-iframe/multiple-iframes.tentative.https.window-expected.txt b/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/same-origin-iframe/multiple-iframes.tentative.https.window-expected.txt new file mode 100644 index 0000000..76f2f05 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/fetch-later/quota/same-origin-iframe/multiple-iframes.tentative.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] fetchLater() request quota are shared by same-origin iframes and root. + assert_throws_dom: function "() => fetchLater(requestUrl, {\n method: 'POST',\n body: generatePayload(\n getRemainingQuota(QUOTA_PER_ORIGIN, requestUrl, headers), dataType),\n // Required, as the size of referrer also take up quota.\n referrer: '',\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65536 bytes, expected less than 0 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fs/FileSystemBaseHandle-buckets.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/fs/FileSystemBaseHandle-buckets.https.any-expected.txt new file mode 100644 index 0000000..6c8aec5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fs/FileSystemBaseHandle-buckets.https.any-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Bucket quota restricts the size of a file that can be created + promise_rejects_dom: function "function() { throw e; }" threw object "QuotaExceededError: The operation failed because it would cause the application to exceed its storage quota." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/fs/FileSystemBaseHandle-buckets.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/fs/FileSystemBaseHandle-buckets.https.any.worker-expected.txt new file mode 100644 index 0000000..6c8aec5 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fs/FileSystemBaseHandle-buckets.https.any.worker-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Bucket quota restricts the size of a file that can be created + promise_rejects_dom: function "function() { throw e; }" threw object "QuotaExceededError: The operation failed because it would cause the application to exceed its storage quota." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/resources/testharness.js b/third_party/blink/web_tests/external/wpt/resources/testharness.js index 32f033a..6ccede34 100644 --- a/third_party/blink/web_tests/external/wpt/resources/testharness.js +++ b/third_party/blink/web_tests/external/wpt/resources/testharness.js
@@ -2321,6 +2321,7 @@ NetworkError: 19, AbortError: 20, URLMismatchError: 21, + QuotaExceededError: 22, TimeoutError: 23, InvalidNodeTypeError: 24, DataCloneError: 25, @@ -2335,8 +2336,7 @@ VersionError: 0, OperationError: 0, NotAllowedError: 0, - OptOutError: 0, - QuotaExceededError: 0 + OptOutError: 0 }; var code_name_map = {};
diff --git a/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any-expected.txt new file mode 100644 index 0000000..135a0f85 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] IDB respects bucket quota + promise_rejects_dom: function "function() { throw e; }" threw object "QuotaExceededError" that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js b/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js index 49cd707..ee920277 100644 --- a/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js +++ b/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any.js
@@ -34,11 +34,8 @@ type: 'binary/random' }), 2); - try { - await transactionPromise(txn); - } catch (e) { - assert_equals(e.name, 'QuotaExceededError'); - } + await promise_rejects_dom( + t, 'QuotaExceededError', transactionPromise(txn)); db.close(); }, 'IDB respects bucket quota');
diff --git a/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any.worker-expected.txt new file mode 100644 index 0000000..135a0f85 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/storage/buckets/bucket-quota-indexeddb.tentative.https.any.worker-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] IDB respects bucket quota + promise_rejects_dom: function "function() { throw e; }" threw object "QuotaExceededError" that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any-expected.txt b/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any-expected.txt new file mode 100644 index 0000000..864f00e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] new DOMexception("msg", "QuotaExceededError") + assert_equals: Should have matching legacy code from error names table expected 22 but got 0 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js b/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js index 5bb6da7..c4ddabd 100644 --- a/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js +++ b/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.js
@@ -107,6 +107,7 @@ {name: "NetworkError", code: 19}, {name: "AbortError", code: 20}, {name: "URLMismatchError", code: 21}, + {name: "QuotaExceededError", code: 22}, {name: "TimeoutError", code: 23}, {name: "InvalidNodeTypeError", code: 24}, {name: "DataCloneError", code: 25}, @@ -127,9 +128,7 @@ {name: "ReadOnlyError", code: 0}, {name: "VersionError", code: 0}, {name: "OperationError", code: 0}, - {name: "NotAllowedError", code: 0}, - // See https://github.com/whatwg/webidl/pull/1465. - {name: "QuotaExceededError", code: 0} + {name: "NotAllowedError", code: 0} ].forEach(function(test_case) { test(function() { var ex = new DOMException("msg", test_case.name);
diff --git a/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.worker-expected.txt new file mode 100644 index 0000000..864f00e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webidl/ecmascript-binding/es-exceptions/DOMException-constructor-behavior.any.worker-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] new DOMexception("msg", "QuotaExceededError") + assert_equals: Should have matching legacy code from error names table expected 22 but got 0 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js index 9369fce..70e8cab0 100644 --- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js +++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js
@@ -366,48 +366,47 @@ 'inputs': { 'inputA': { 'data': [ - 49.1112174987793, 11.907459259033203, 21.115795135498047, - 70.7490005493164, 94.51628112792969, 93.78905487060547, - 11.178888320922852, 32.80592346191406, 83.31897735595703, - 91.1207275390625, 0.11235756427049637, 15.397955894470215, + 49.1112174987793, 11.907459259033203, + 21.115795135498047, 70.7490005493164, ], - 'descriptor': {shape: [2, 3, 2], dataType: 'float32'}, + 'descriptor': {shape: [2, 2], dataType: 'float32'}, 'constant': false }, 'inputAScale': { - 'data': [0.003921568859368563], + 'data': [0.3921568859368563], 'descriptor': {shape: [1], dataType: 'float32'}, 'constant': true }, 'inputAZeroPoint': { - 'data': [127], + 'data': [16], 'descriptor': {shape: [1], dataType: 'int8'}, 'constant': true }, 'inputB': { 'data': [ - 2, 17, 38, 41, 5, 3, 2, 17, 38, 41, 5, 3, + 21, 24, + 8, 13 ], - 'descriptor': {shape: [2, 3, 2], dataType: 'int8'}, + 'descriptor': {shape: [2, 2], dataType: 'int8'}, 'constant': true }, 'inputBScale': { - 'data': [0.003921568859368563], + 'data': [0.3921568859368563], 'descriptor': {shape: [1], dataType: 'float32'}, 'constant': true }, 'inputBZeroPoint': { - 'data': [127], + 'data': [16], 'descriptor': {shape: [1], dataType: 'int8'}, 'constant': true }, 'outputScale': { - 'data': [0.003921568859368563], + 'data': [0.3921568859368563], 'descriptor': {shape: [1], dataType: 'float32'}, 'constant': true }, 'outputZeroPoint': { - 'data': [127], + 'data': [16], 'descriptor': {shape: [1], dataType: 'int8'}, 'constant': true }, @@ -438,24 +437,24 @@ 'outputs': 'dequantizedInputB' }, { - 'name': 'add', + 'name': 'mul', 'arguments': [ {'inputA': 'dequantizedInputA'}, {'inputB': 'dequantizedInputB'} ], - 'outputs': 'addOutput' + 'outputs': 'mulOutput' }, { 'name': 'quantizeLinear', 'arguments': [ - {'input': 'addOutput'}, + {'input': 'mulOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedAddOutput' + 'outputs': 'quantizedMulOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedAddOutput'}, + {'input': 'quantizedMulOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -464,12 +463,10 @@ 'expectedOutputs': { 'output': { 'data': [ - -0.4901961088180542, -0.43137258291244507, -0.3490196168422699, - -0.33725491166114807, -0.4784314036369324, -0.4862745404243469, - -0.4901961088180542, -0.43137258291244507, -0.3490196168422699, - -0.33725491166114807, -0.4784314036369324, -0.4862745404243469, + 43.529415130615234, 36.86274719238281, + -56.4705924987793, -51.372554779052734, ], - 'descriptor': {shape: [2, 3, 2], dataType: 'float32'} + 'descriptor': {shape: [2, 2], dataType: 'float32'} } } }
diff --git a/third_party/blink/web_tests/external/wpt/webstorage/storage_local_setitem_quotaexceedederr.window-expected.txt b/third_party/blink/web_tests/external/wpt/webstorage/storage_local_setitem_quotaexceedederr.window-expected.txt new file mode 100644 index 0000000..46a5fb0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webstorage/storage_local_setitem_quotaexceedederr.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Throws QuotaExceededError when the quota has been exceeded + assert_throws_dom: function "function() {\n while (true) {\n index++;\n localStorage.setItem("" + key + index, "" + val + index);\n }\n }" threw object "QuotaExceededError: Failed to execute 'setItem' on 'Storage': Setting the value of 'name5063' exceeded the quota." that is not a DOMException QUOTA_EXCEEDED_ERR: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/webstorage/storage_session_setitem_quotaexceedederr.window-expected.txt b/third_party/blink/web_tests/external/wpt/webstorage/storage_session_setitem_quotaexceedederr.window-expected.txt new file mode 100644 index 0000000..c5fe5ba6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/webstorage/storage_session_setitem_quotaexceedederr.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Throws QuotaExceededError when the quota has been exceeded + assert_throws_dom: function "function() {\n while (true) {\n index++;\n sessionStorage.setItem("" + key + index, "" + val + index);\n }\n }" threw object "QuotaExceededError: Failed to execute 'setItem' on 'Storage': Setting the value of 'name5063' exceeded the quota." that is not a DOMException QUOTA_EXCEEDED_ERR: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/virtual/threaded/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/virtual/threaded/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt deleted file mode 100644 index 87069df6..0000000 --- a/third_party/blink/web_tests/flag-specific/highdpi/virtual/threaded/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -[FAIL] properties of pseudo elements in update callback - assert_equals: wrapper(target) expected "fixed" but got "absolute" -[FAIL] properties of pseudo elements outside of transition - assert_equals: expected "fixed" but got "absolute" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/background-fetch/fetch.https.window-expected.txt new file mode 100644 index 0000000..cad6dcc --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +[FAIL] Requests with PUT method require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Requests with text/json content type require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Background Fetch that exceeds the quota throws a QuotaExceededError + promise_rejects_dom: This fetch should have thrown a quota exceeded error function "function() { throw e; }" threw object "QuotaExceededError: Failed to execute 'fetch' on 'BackgroundFetchManager': Quota exceeded." that is not a DOMException QUOTA_EXCEEDED_ERR: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt new file mode 100644 index 0000000..56fc77f --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] fetchLater() rejects max+1 payload in a POST request body of String. + assert_throws_dom: function "() => fetchLater(requestUrl, {\n activateAfter: 0,\n method: 'POST',\n body: generatePayload(\n getRemainingQuota(QUOTA_PER_ORIGIN, requestUrl, headers) + 1,\n dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65549 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac12/virtual/keepalive-in-browser-migration/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/blink/web_tests/platform/mac-mac12/virtual/keepalive-in-browser-migration/external/wpt/background-fetch/fetch.https.window-expected.txt new file mode 100644 index 0000000..8589e7b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac12/virtual/keepalive-in-browser-migration/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -0,0 +1,7 @@ +This is a testharness.js-based test. +[FAIL] Requests with PUT method require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Requests with text/json content type require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac13/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/blink/web_tests/platform/mac-mac13/external/wpt/background-fetch/fetch.https.window-expected.txt new file mode 100644 index 0000000..8589e7b --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac13/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -0,0 +1,7 @@ +This is a testharness.js-based test. +[FAIL] Requests with PUT method require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Requests with text/json content type require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_cpu-expected.txt new file mode 100644 index 0000000..5b37deb --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_cpu-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +All subtests passed and are omitted for brevity. +See https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/writing_web_tests.md#Text-Test-Baselines for details. +Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_cpu-expected.txt new file mode 100644 index 0000000..5b37deb --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac14-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_cpu-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +All subtests passed and are omitted for brevity. +See https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/writing_web_tests.md#Text-Test-Baselines for details. +Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac-mac14/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt b/third_party/blink/web_tests/platform/mac-mac14/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt new file mode 100644 index 0000000..5b37deb --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac14/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +All subtests passed and are omitted for brevity. +See https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/writing_web_tests.md#Text-Test-Baselines for details. +Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt new file mode 100644 index 0000000..5b37deb --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +All subtests passed and are omitted for brevity. +See https://chromium.googlesource.com/chromium/src/+/HEAD/docs/testing/writing_web_tests.md#Text-Test-Baselines for details. +Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_cpu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_cpu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_cpu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_cpu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_cpu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_cpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_cpu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_cpu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_npu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_npu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_npu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_npu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_npu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_npu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_npu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-on-npu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_npu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.serviceworker_gpu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_gpu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.sharedworker_gpu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_gpu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.worker_gpu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_gpu-expected.txt b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_gpu-expected.txt new file mode 100644 index 0000000..f3cfa81 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any_gpu-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] quantized element-wise binary mul + assert_less_than_equal: assert_array_approx_equals_ulp: test quantizeLinear dequantizeLinear dequantizeLinear mul quantizeLinear dequantizeLinear float32 actual 36.86275100708008 should be close enough to expected 36.86274719238281 by ULP distance: expected a number less than or equal to 0n but got 1n +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/background-fetch/fetch.https.window-expected.txt new file mode 100644 index 0000000..cad6dcc --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +[FAIL] Requests with PUT method require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Requests with text/json content type require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Background Fetch that exceeds the quota throws a QuotaExceededError + promise_rejects_dom: This fetch should have thrown a quota exceeded error function "function() { throw e; }" threw object "QuotaExceededError: Failed to execute 'fetch' on 'BackgroundFetchManager': Quota exceeded." that is not a DOMException QUOTA_EXCEEDED_ERR: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt new file mode 100644 index 0000000..8e20281 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-conditional/container-queries/scroll-state/scroll-state-snapped-snap-changing-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] scroll-state(snapped) matching #snapped2 while scrolling + assert_equals: snapchanging has been called for #snapped2 expected (object) Element node <div id="snapped2" class="snapped">\n <span id="target2">... but got (undefined) undefined +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt new file mode 100644 index 0000000..56fc77f --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] fetchLater() rejects max+1 payload in a POST request body of String. + assert_throws_dom: function "() => fetchLater(requestUrl, {\n activateAfter: 0,\n method: 'POST',\n body: generatePayload(\n getRemainingQuota(QUOTA_PER_ORIGIN, requestUrl, headers) + 1,\n dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65549 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/virtual/keepalive-in-browser-migration/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/blink/web_tests/platform/mac/virtual/keepalive-in-browser-migration/external/wpt/background-fetch/fetch.https.window-expected.txt new file mode 100644 index 0000000..cad6dcc --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/keepalive-in-browser-migration/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +[FAIL] Requests with PUT method require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Requests with text/json content type require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Background Fetch that exceeds the quota throws a QuotaExceededError + promise_rejects_dom: This fetch should have thrown a quota exceeded error function "function() { throw e; }" threw object "QuotaExceededError: Failed to execute 'fetch' on 'BackgroundFetchManager': Quota exceeded." that is not a DOMException QUOTA_EXCEEDED_ERR: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win10/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/blink/web_tests/platform/win10/external/wpt/background-fetch/fetch.https.window-expected.txt new file mode 100644 index 0000000..cad6dcc --- /dev/null +++ b/third_party/blink/web_tests/platform/win10/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +[FAIL] Requests with PUT method require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Requests with text/json content type require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Background Fetch that exceeds the quota throws a QuotaExceededError + promise_rejects_dom: This fetch should have thrown a quota exceeded error function "function() { throw e; }" threw object "QuotaExceededError: Failed to execute 'fetch' on 'BackgroundFetchManager': Quota exceeded." that is not a DOMException QUOTA_EXCEEDED_ERR: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win10/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt b/third_party/blink/web_tests/platform/win10/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt new file mode 100644 index 0000000..56fc77f --- /dev/null +++ b/third_party/blink/web_tests/platform/win10/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] fetchLater() rejects max+1 payload in a POST request body of String. + assert_throws_dom: function "() => fetchLater(requestUrl, {\n activateAfter: 0,\n method: 'POST',\n body: generatePayload(\n getRemainingQuota(QUOTA_PER_ORIGIN, requestUrl, headers) + 1,\n dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65549 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win10/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt b/third_party/blink/web_tests/platform/win10/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt deleted file mode 100644 index 2cf9296..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.serviceworker_cpu-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] batchNormalization options.axis=0 + gelu - assert_less_than_equal: assert_array_approx_equals_ulp: test batchNormalization gelu float32 actual -0.035951387137174606 should be close enough to expected -0.03595117852091789 by ULP distance: expected a number less than or equal to 24n but got 56n -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win10/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_cpu-expected.txt b/third_party/blink/web_tests/platform/win10/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_cpu-expected.txt deleted file mode 100644 index 2cf9296..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/webnn-service-on-cpu/external/wpt/webnn/conformance_tests/subgraph.https.any.worker_cpu-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] batchNormalization options.axis=0 + gelu - assert_less_than_equal: assert_array_approx_equals_ulp: test batchNormalization gelu float32 actual -0.035951387137174606 should be close enough to expected -0.03595117852091789 by ULP distance: expected a number less than or equal to 24n but got 56n -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win11-arm64/external/wpt/background-fetch/fetch.https.window-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/external/wpt/background-fetch/fetch.https.window-expected.txt new file mode 100644 index 0000000..cad6dcc --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/external/wpt/background-fetch/fetch.https.window-expected.txt
@@ -0,0 +1,9 @@ +This is a testharness.js-based test. +[FAIL] Requests with PUT method require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Requests with text/json content type require CORS Preflight and succeed. + assert_equals: expected "backgroundfetchsuccess" but got "backgroundfetchfail" +[FAIL] Background Fetch that exceeds the quota throws a QuotaExceededError + promise_rejects_dom: This fetch should have thrown a quota exceeded error function "function() { throw e; }" threw object "QuotaExceededError: Failed to execute 'fetch' on 'BackgroundFetchManager': Quota exceeded." that is not a DOMException QUOTA_EXCEEDED_ERR: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win11-arm64/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt b/third_party/blink/web_tests/platform/win11-arm64/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt new file mode 100644 index 0000000..56fc77f --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] fetchLater() rejects max+1 payload in a POST request body of String. + assert_throws_dom: function "() => fetchLater(requestUrl, {\n activateAfter: 0,\n method: 'POST',\n body: generatePayload(\n getRemainingQuota(QUOTA_PER_ORIGIN, requestUrl, headers) + 1,\n dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65549 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/keepalive-in-browser-migration/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt b/third_party/blink/web_tests/virtual/keepalive-in-browser-migration/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt new file mode 100644 index 0000000..56fc77f --- /dev/null +++ b/third_party/blink/web_tests/virtual/keepalive-in-browser-migration/external/wpt/fetch/fetch-later/quota/max-payload.tentative.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] fetchLater() rejects max+1 payload in a POST request body of String. + assert_throws_dom: function "() => fetchLater(requestUrl, {\n activateAfter: 0,\n method: 'POST',\n body: generatePayload(\n getRemainingQuota(QUOTA_PER_ORIGIN, requestUrl, headers) + 1,\n dataType),\n })" threw object "QuotaExceededError: Failed to execute 'fetchLater' on 'Window': fetchLater exceeds its quota for the origin: got 65549 bytes, expected less than 65536 bytes." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/threaded/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt b/third_party/blink/web_tests/virtual/threaded/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt deleted file mode 100644 index 87069df6..0000000 --- a/third_party/blink/web_tests/virtual/threaded/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -[FAIL] properties of pseudo elements in update callback - assert_equals: wrapper(target) expected "fixed" but got "absolute" -[FAIL] properties of pseudo elements outside of transition - assert_equals: expected "fixed" but got "absolute" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt b/third_party/blink/web_tests/virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt deleted file mode 100644 index 87069df6..0000000 --- a/third_party/blink/web_tests/virtual/view-transition-mpa-serialization/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -[FAIL] properties of pseudo elements in update callback - assert_equals: wrapper(target) expected "fixed" but got "absolute" -[FAIL] properties of pseudo elements outside of transition - assert_equals: expected "fixed" but got "absolute" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt b/third_party/blink/web_tests/virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt deleted file mode 100644 index 87069df6..0000000 --- a/third_party/blink/web_tests/virtual/view-transition-wide-gamut/external/wpt/css/css-view-transitions/pseudo-get-computed-style-expected.txt +++ /dev/null
@@ -1,7 +0,0 @@ -This is a testharness.js-based test. -[FAIL] properties of pseudo elements in update callback - assert_equals: wrapper(target) expected "fixed" but got "absolute" -[FAIL] properties of pseudo elements outside of transition - assert_equals: expected "fixed" but got "absolute" -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-quota-exceeded.https.window-expected.txt b/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-quota-exceeded.https.window-expected.txt new file mode 100644 index 0000000..287e754 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/ai/language-model-api-prompt-quota-exceeded.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Language Model Prompt Quota Exceeded + promise_rejects_dom: function "function() { throw e; }" threw object "QuotaExceededError: The input is too large." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/wpt_internal/ai/language-model-api-quota-exceeded.https.window-expected.txt b/third_party/blink/web_tests/wpt_internal/ai/language-model-api-quota-exceeded.https.window-expected.txt new file mode 100644 index 0000000..ca8a90c3 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/ai/language-model-api-quota-exceeded.https.window-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] QuotaExceededError is thrown when initial prompts are too large. + promise_rejects_dom: function "function() { throw e; }" threw object "QuotaExceededError: The input is too large." that is not a DOMException QuotaExceededError: property "code" is equal to 0, expected 22 +Harness: the test ran to completion. +
diff --git a/third_party/chromite b/third_party/chromite index ac8a9cb..3808d01 160000 --- a/third_party/chromite +++ b/third_party/chromite
@@ -1 +1 @@ -Subproject commit ac8a9cb56cfff1346e2f2b9b77175e7a748ad10b +Subproject commit 3808d0167301afd2a0a9c45b0b19dd07f3dce1fc
diff --git a/third_party/crabbyavif/README.chromium b/third_party/crabbyavif/README.chromium index 99b29a08..ddf6109c 100644 --- a/third_party/crabbyavif/README.chromium +++ b/third_party/crabbyavif/README.chromium
@@ -2,7 +2,7 @@ Short Name: crabbyavif URL: https://github.com/webmproject/CrabbyAvif Version: N/A -Revision: b097e11df62db2a6b8561f60aeae0718901122cb +Revision: 91072f337edd69508dbefaf290f01722e228738a License: Apache-2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/crabbyavif/src b/third_party/crabbyavif/src index b097e11..91072f3 160000 --- a/third_party/crabbyavif/src +++ b/third_party/crabbyavif/src
@@ -1 +1 @@ -Subproject commit b097e11df62db2a6b8561f60aeae0718901122cb +Subproject commit 91072f337edd69508dbefaf290f01722e228738a
diff --git a/third_party/crossbench b/third_party/crossbench index 8f9e09a..55f89b7 160000 --- a/third_party/crossbench +++ b/third_party/crossbench
@@ -1 +1 @@ -Subproject commit 8f9e09ad773d1e3fbb3021d3ab09246db491df5c +Subproject commit 55f89b770f9573fb07765a4975ee586640feaf63
diff --git a/third_party/dawn b/third_party/dawn index f1ac40b..449c0af 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit f1ac40b54eb53282eff2e587a08fae81de9408ea +Subproject commit 449c0afbaf08f5e1c1f6e2edfa41ada6bd166c58
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index a606a77..9901bf0 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit a606a77310848ca4f22c139777106f9100f8e318 +Subproject commit 9901bf08fdd7f65bc1561e71331ff10b4df614e5
diff --git a/third_party/fontconfig/README.chromium b/third_party/fontconfig/README.chromium index c742e109..6bf9c2e 100644 --- a/third_party/fontconfig/README.chromium +++ b/third_party/fontconfig/README.chromium
@@ -1,7 +1,7 @@ Name: fontconfig URL: http://www.freedesktop.org/wiki/Software/fontconfig/ -Version: 14d466b30a8ab4a9d789977ed94f2c30e7209267 -CPEPrefix: cpe:/a:fontconfig_project:fontconfig:2.15.0 +Version: 24ed9b4d73dc068ed2baeb0da583c51879d5cabc +CPEPrefix: cpe:/a:fontconfig_project:fontconfig:2.16.2 License: public-domain-md5, MIT-Modern-Variant, HPND-sell-variant, MIT License File: src/COPYING Security Critical: yes
diff --git a/third_party/fontconfig/include/config.h b/third_party/fontconfig/include/config.h index b0e2427..bfb7ebe 100644 --- a/third_party/fontconfig/include/config.h +++ b/third_party/fontconfig/include/config.h
@@ -1,111 +1,5 @@ -/* - * Autogenerated by the Meson build system. - * Do not edit, your changes will be lost. - */ - -#pragma once - -#define ALIGNOF_DOUBLE 8 - -#define ALIGNOF_VOID_P 8 - -#define CONFIGDIR "/etc/fonts/conf.d" - -#define FC_CACHEDIR "/var/cache/fontconfig" - -#define FC_DEFAULT_FONTS "\t<dir>/usr/share/fonts</dir>\n\t<dir>/usr/local/share/fonts</dir>\n" - -#define FC_FONTPATH "" - -/* The type of gperf "len" parameter */ -#define FC_GPERF_SIZE_T size_t - -#define FC_TEMPLATEDIR "/usr/share/fontconfig/conf.avail" - -#define FLEXIBLE_ARRAY_MEMBER - -#define FONTCONFIG_PATH "/etc/fonts" - -#define GETTEXT_PACKAGE "fontconfig" - -#define HAVE_DIRENT_H 1 - -#define HAVE_FCNTL_H 1 - -#define HAVE_FSTATFS 1 - -#define HAVE_FSTATVFS 1 - -#define HAVE_FT_DONE_MM_VAR 1 - -#define HAVE_FT_GET_BDF_PROPERTY 1 - -#define HAVE_FT_GET_PS_FONT_INFO 1 - -#define HAVE_FT_GET_X11_FONT_FORMAT 1 - -#define HAVE_FT_HAS_PS_GLYPH_NAMES 1 - -#define HAVE_GETOPT 1 - -#define HAVE_GETOPT_LONG 1 - -#define HAVE_INTEL_ATOMIC_PRIMITIVES 1 - -#define HAVE_LINK 1 - -#define HAVE_LRAND48 1 - -#define HAVE_LSTAT 1 - -#define HAVE_MKDTEMP 1 - -#define HAVE_MKOSTEMP 1 - -#define HAVE_MKSTEMP 1 - -#define HAVE_MMAP 1 - -#define HAVE_POSIX_FADVISE 1 - -#define HAVE_PTHREAD 1 - -#define HAVE_RAND 1 - -#define HAVE_RANDOM 1 - -#define HAVE_RANDOM_R 1 - -#define HAVE_RAND_R 1 - -#define HAVE_READLINK 1 - -#define HAVE_STDATOMIC_PRIMITIVES 1 - -#define HAVE_STDLIB_H 1 - -#define HAVE_STRING_H 1 - -#define HAVE_STRUCT_DIRENT_D_TYPE 1 - -#define HAVE_SYS_MOUNT_H 1 - -#define HAVE_SYS_PARAM_H 1 - -#define HAVE_SYS_STATFS_H 1 - -#define HAVE_SYS_STATVFS_H 1 - -#define HAVE_SYS_VFS_H 1 - -#define HAVE_UNISTD_H 1 - -#define HAVE_VPRINTF 1 - -#define SIZEOF_VOID_P 8 - -#define USE_ICONV 0 - -#define _GNU_SOURCE 1 - +/* Copyright (C) 2025 fontconfig Authors */ +/* SPDX-License-Identifier: HPND */ +#include "meson-config.h" +#include "config-fixups.h" #define ENABLE_LIBXML2 1
diff --git a/third_party/fontconfig/include/fc-case/fccase.h b/third_party/fontconfig/include/fc-case/fccase.h index 7c844f3..ffdc1e7 100644 --- a/third_party/fontconfig/include/fc-case/fccase.h +++ b/third_party/fontconfig/include/fc-case/fccase.h
@@ -1,25 +1,7 @@ /* - * fontconfig/fc-case/fccase.tmpl.h - * - * Copyright © 2003 Keith Packard - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of the author(s) not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. The authors make no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. + * This file was generated against CaseFolding.txt from Unicode.org. + * All the data in array is a part of them and licensed under a terms of use: + * https://www.unicode.org/terms_of_use.html */ #define FC_NUM_CASE_FOLD 302
diff --git a/third_party/fontconfig/include/fc-lang/fclang.h b/third_party/fontconfig/include/fc-lang/fclang.h index ebce21e7b..95bafdf 100644 --- a/third_party/fontconfig/include/fc-lang/fclang.h +++ b/third_party/fontconfig/include/fc-lang/fclang.h
@@ -22,11 +22,11 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* total size: 1655 unique leaves: 739 */ +/* total size: 1658 unique leaves: 742 */ -#define LEAF0 (279 * sizeof (FcLangCharSet)) -#define OFF0 (LEAF0 + 739 * sizeof (FcCharLeaf)) -#define NUM0 (OFF0 + 883 * sizeof (uintptr_t)) +#define LEAF0 (281 * sizeof (FcLangCharSet)) +#define OFF0 (LEAF0 + 742 * sizeof (FcCharLeaf)) +#define NUM0 (OFF0 + 886 * sizeof (uintptr_t)) #define SET(n) (n * sizeof (FcLangCharSet) + offsetof (FcLangCharSet, charset)) #define OFF(s,o) (OFF0 + o * sizeof (uintptr_t) - SET(s)) #define NUM(s,n) (NUM0 + n * sizeof (FcChar16) - SET(s)) @@ -36,12 +36,12 @@ #define fcLangCharSetIndicesInv (fcLangData.langIndicesInv) static const struct { - FcLangCharSet langCharSets[279]; - FcCharLeaf leaves[739]; - uintptr_t leaf_offsets[883]; - FcChar16 numbers[883]; - FcChar16 langIndices[279]; - FcChar16 langIndicesInv[279]; + FcLangCharSet langCharSets[281]; + FcCharLeaf leaves[742]; + uintptr_t leaf_offsets[886]; + FcChar16 numbers[886]; + FcChar16 langIndices[281]; + FcChar16 langIndicesInv[281]; } fcLangData = { { { "aa", { FC_REF_CONSTANT, 1, OFF(0,0), NUM(0,0) } }, /* 0 */ @@ -87,242 +87,244 @@ { "ckb", { FC_REF_CONSTANT, 1, OFF(40,55), NUM(40,55) } }, /* 40 */ { "cmn", { FC_REF_CONSTANT, 83, OFF(41,56), NUM(41,56) } }, /* 41 */ { "co", { FC_REF_CONSTANT, 2, OFF(42,139), NUM(42,139) } }, /* 42 */ - { "crh", { FC_REF_CONSTANT, 2, OFF(43,141), NUM(43,141) } }, /* 43 */ - { "cs", { FC_REF_CONSTANT, 2, OFF(44,143), NUM(44,143) } }, /* 44 */ - { "csb", { FC_REF_CONSTANT, 2, OFF(45,145), NUM(45,145) } }, /* 45 */ - { "cu", { FC_REF_CONSTANT, 1, OFF(46,147), NUM(46,147) } }, /* 46 */ - { "cv", { FC_REF_CONSTANT, 2, OFF(47,148), NUM(47,148) } }, /* 47 */ - { "cy", { FC_REF_CONSTANT, 3, OFF(48,150), NUM(48,150) } }, /* 48 */ - { "da", { FC_REF_CONSTANT, 1, OFF(49,153), NUM(49,153) } }, /* 49 */ - { "de", { FC_REF_CONSTANT, 1, OFF(50,154), NUM(50,154) } }, /* 50 */ - { "doi", { FC_REF_CONSTANT, 1, OFF(51,155), NUM(51,155) } }, /* 51 */ - { "dsb", { FC_REF_CONSTANT, 2, OFF(52,143), NUM(52,143) } }, /* 52 */ - { "dv", { FC_REF_CONSTANT, 1, OFF(53,156), NUM(53,156) } }, /* 53 */ - { "dz", { FC_REF_CONSTANT, 1, OFF(54,42), NUM(54,42) } }, /* 54 */ - { "ee", { FC_REF_CONSTANT, 4, OFF(55,157), NUM(55,157) } }, /* 55 */ - { "el", { FC_REF_CONSTANT, 1, OFF(56,161), NUM(56,161) } }, /* 56 */ - { "en", { FC_REF_CONSTANT, 1, OFF(57,162), NUM(57,162) } }, /* 57 */ - { "eo", { FC_REF_CONSTANT, 2, OFF(58,163), NUM(58,163) } }, /* 58 */ - { "es", { FC_REF_CONSTANT, 1, OFF(59,12), NUM(59,12) } }, /* 59 */ - { "et", { FC_REF_CONSTANT, 2, OFF(60,165), NUM(60,165) } }, /* 60 */ - { "eu", { FC_REF_CONSTANT, 1, OFF(61,167), NUM(61,167) } }, /* 61 */ - { "fa", { FC_REF_CONSTANT, 1, OFF(62,24), NUM(62,24) } }, /* 62 */ - { "fat", { FC_REF_CONSTANT, 5, OFF(63,5), NUM(63,5) } }, /* 63 */ - { "ff", { FC_REF_CONSTANT, 3, OFF(64,168), NUM(64,168) } }, /* 64 */ - { "fi", { FC_REF_CONSTANT, 2, OFF(65,171), NUM(65,171) } }, /* 65 */ - { "fil", { FC_REF_CONSTANT, 1, OFF(66,173), NUM(66,173) } }, /* 66 */ - { "fj", { FC_REF_CONSTANT, 1, OFF(67,27), NUM(67,27) } }, /* 67 */ - { "fo", { FC_REF_CONSTANT, 1, OFF(68,174), NUM(68,174) } }, /* 68 */ - { "fr", { FC_REF_CONSTANT, 2, OFF(69,139), NUM(69,139) } }, /* 69 */ - { "fur", { FC_REF_CONSTANT, 1, OFF(70,175), NUM(70,175) } }, /* 70 */ - { "fy", { FC_REF_CONSTANT, 1, OFF(71,176), NUM(71,176) } }, /* 71 */ - { "ga", { FC_REF_CONSTANT, 3, OFF(72,177), NUM(72,177) } }, /* 72 */ - { "gd", { FC_REF_CONSTANT, 1, OFF(73,180), NUM(73,180) } }, /* 73 */ - { "gez", { FC_REF_CONSTANT, 2, OFF(74,181), NUM(74,181) } }, /* 74 */ - { "gl", { FC_REF_CONSTANT, 1, OFF(75,12), NUM(75,12) } }, /* 75 */ - { "gn", { FC_REF_CONSTANT, 3, OFF(76,183), NUM(76,183) } }, /* 76 */ - { "gu", { FC_REF_CONSTANT, 1, OFF(77,186), NUM(77,186) } }, /* 77 */ - { "gv", { FC_REF_CONSTANT, 1, OFF(78,187), NUM(78,187) } }, /* 78 */ - { "ha", { FC_REF_CONSTANT, 3, OFF(79,188), NUM(79,188) } }, /* 79 */ - { "hak", { FC_REF_CONSTANT, 83, OFF(80,56), NUM(80,56) } }, /* 80 */ - { "haw", { FC_REF_CONSTANT, 3, OFF(81,191), NUM(81,191) } }, /* 81 */ - { "he", { FC_REF_CONSTANT, 1, OFF(82,194), NUM(82,194) } }, /* 82 */ - { "hi", { FC_REF_CONSTANT, 1, OFF(83,13), NUM(83,13) } }, /* 83 */ - { "hif", { FC_REF_CONSTANT, 1, OFF(84,13), NUM(84,13) } }, /* 84 */ - { "hne", { FC_REF_CONSTANT, 1, OFF(85,13), NUM(85,13) } }, /* 85 */ - { "ho", { FC_REF_CONSTANT, 1, OFF(86,27), NUM(86,27) } }, /* 86 */ - { "hr", { FC_REF_CONSTANT, 2, OFF(87,45), NUM(87,45) } }, /* 87 */ - { "hsb", { FC_REF_CONSTANT, 2, OFF(88,195), NUM(88,195) } }, /* 88 */ - { "ht", { FC_REF_CONSTANT, 1, OFF(89,197), NUM(89,197) } }, /* 89 */ - { "hu", { FC_REF_CONSTANT, 2, OFF(90,198), NUM(90,198) } }, /* 90 */ - { "hy", { FC_REF_CONSTANT, 1, OFF(91,200), NUM(91,200) } }, /* 91 */ - { "hz", { FC_REF_CONSTANT, 3, OFF(92,201), NUM(92,201) } }, /* 92 */ - { "ia", { FC_REF_CONSTANT, 1, OFF(93,27), NUM(93,27) } }, /* 93 */ - { "id", { FC_REF_CONSTANT, 1, OFF(94,204), NUM(94,204) } }, /* 94 */ - { "ie", { FC_REF_CONSTANT, 1, OFF(95,205), NUM(95,205) } }, /* 95 */ - { "ig", { FC_REF_CONSTANT, 2, OFF(96,206), NUM(96,206) } }, /* 96 */ - { "ii", { FC_REF_CONSTANT, 5, OFF(97,208), NUM(97,208) } }, /* 97 */ - { "ik", { FC_REF_CONSTANT, 1, OFF(98,213), NUM(98,213) } }, /* 98 */ - { "io", { FC_REF_CONSTANT, 1, OFF(99,27), NUM(99,27) } }, /* 99 */ - { "is", { FC_REF_CONSTANT, 1, OFF(100,214), NUM(100,214) } }, /* 100 */ - { "it", { FC_REF_CONSTANT, 1, OFF(101,215), NUM(101,215) } }, /* 101 */ - { "iu", { FC_REF_CONSTANT, 3, OFF(102,216), NUM(102,216) } }, /* 102 */ - { "ja", { FC_REF_CONSTANT, 83, OFF(103,219), NUM(103,219) } }, /* 103 */ - { "jv", { FC_REF_CONSTANT, 1, OFF(104,302), NUM(104,302) } }, /* 104 */ - { "ka", { FC_REF_CONSTANT, 1, OFF(105,303), NUM(105,303) } }, /* 105 */ - { "kaa", { FC_REF_CONSTANT, 1, OFF(106,304), NUM(106,304) } }, /* 106 */ - { "kab", { FC_REF_CONSTANT, 4, OFF(107,28), NUM(107,28) } }, /* 107 */ - { "ki", { FC_REF_CONSTANT, 2, OFF(108,305), NUM(108,305) } }, /* 108 */ - { "kj", { FC_REF_CONSTANT, 1, OFF(109,27), NUM(109,27) } }, /* 109 */ - { "kk", { FC_REF_CONSTANT, 1, OFF(110,307), NUM(110,307) } }, /* 110 */ - { "kl", { FC_REF_CONSTANT, 2, OFF(111,308), NUM(111,308) } }, /* 111 */ - { "km", { FC_REF_CONSTANT, 1, OFF(112,310), NUM(112,310) } }, /* 112 */ - { "kn", { FC_REF_CONSTANT, 1, OFF(113,311), NUM(113,311) } }, /* 113 */ - { "ko", { FC_REF_CONSTANT, 45, OFF(114,312), NUM(114,312) } }, /* 114 */ - { "kok", { FC_REF_CONSTANT, 1, OFF(115,13), NUM(115,13) } }, /* 115 */ - { "kr", { FC_REF_CONSTANT, 3, OFF(116,357), NUM(116,357) } }, /* 116 */ - { "ks", { FC_REF_CONSTANT, 1, OFF(117,360), NUM(117,360) } }, /* 117 */ - { "ku-am", { FC_REF_CONSTANT, 2, OFF(118,361), NUM(118,361) } }, /* 118 */ - { "ku-iq", { FC_REF_CONSTANT, 1, OFF(119,55), NUM(119,55) } }, /* 119 */ - { "ku-ir", { FC_REF_CONSTANT, 1, OFF(120,55), NUM(120,55) } }, /* 120 */ - { "ku-tr", { FC_REF_CONSTANT, 2, OFF(121,363), NUM(121,363) } }, /* 121 */ - { "kum", { FC_REF_CONSTANT, 1, OFF(122,365), NUM(122,365) } }, /* 122 */ - { "kv", { FC_REF_CONSTANT, 1, OFF(123,366), NUM(123,366) } }, /* 123 */ - { "kw", { FC_REF_CONSTANT, 3, OFF(124,367), NUM(124,367) } }, /* 124 */ - { "kwm", { FC_REF_CONSTANT, 1, OFF(125,27), NUM(125,27) } }, /* 125 */ - { "ky", { FC_REF_CONSTANT, 1, OFF(126,370), NUM(126,370) } }, /* 126 */ - { "la", { FC_REF_CONSTANT, 2, OFF(127,371), NUM(127,371) } }, /* 127 */ - { "lah", { FC_REF_CONSTANT, 1, OFF(128,373), NUM(128,373) } }, /* 128 */ - { "lb", { FC_REF_CONSTANT, 1, OFF(129,374), NUM(129,374) } }, /* 129 */ - { "lez", { FC_REF_CONSTANT, 1, OFF(130,18), NUM(130,18) } }, /* 130 */ - { "lg", { FC_REF_CONSTANT, 2, OFF(131,375), NUM(131,375) } }, /* 131 */ - { "li", { FC_REF_CONSTANT, 1, OFF(132,377), NUM(132,377) } }, /* 132 */ - { "lij", { FC_REF_CONSTANT, 1, OFF(133,378), NUM(133,378) } }, /* 133 */ - { "ln", { FC_REF_CONSTANT, 4, OFF(134,379), NUM(134,379) } }, /* 134 */ - { "lo", { FC_REF_CONSTANT, 1, OFF(135,383), NUM(135,383) } }, /* 135 */ - { "lt", { FC_REF_CONSTANT, 2, OFF(136,384), NUM(136,384) } }, /* 136 */ - { "lv", { FC_REF_CONSTANT, 2, OFF(137,386), NUM(137,386) } }, /* 137 */ - { "lzh", { FC_REF_CONSTANT, 83, OFF(138,56), NUM(138,56) } }, /* 138 */ - { "mag", { FC_REF_CONSTANT, 1, OFF(139,13), NUM(139,13) } }, /* 139 */ - { "mai", { FC_REF_CONSTANT, 1, OFF(140,13), NUM(140,13) } }, /* 140 */ - { "mfe", { FC_REF_CONSTANT, 2, OFF(141,139), NUM(141,139) } }, /* 141 */ - { "mg", { FC_REF_CONSTANT, 1, OFF(142,388), NUM(142,388) } }, /* 142 */ - { "mh", { FC_REF_CONSTANT, 2, OFF(143,389), NUM(143,389) } }, /* 143 */ - { "mhr", { FC_REF_CONSTANT, 1, OFF(144,365), NUM(144,365) } }, /* 144 */ - { "mi", { FC_REF_CONSTANT, 3, OFF(145,391), NUM(145,391) } }, /* 145 */ - { "miq", { FC_REF_CONSTANT, 3, OFF(146,394), NUM(146,394) } }, /* 146 */ - { "mjw", { FC_REF_CONSTANT, 1, OFF(147,162), NUM(147,162) } }, /* 147 */ - { "mk", { FC_REF_CONSTANT, 1, OFF(148,397), NUM(148,397) } }, /* 148 */ - { "ml", { FC_REF_CONSTANT, 1, OFF(149,398), NUM(149,398) } }, /* 149 */ - { "mn-cn", { FC_REF_CONSTANT, 1, OFF(150,399), NUM(150,399) } }, /* 150 */ - { "mn-mn", { FC_REF_CONSTANT, 1, OFF(151,400), NUM(151,400) } }, /* 151 */ - { "mni", { FC_REF_CONSTANT, 1, OFF(152,401), NUM(152,401) } }, /* 152 */ - { "mnw", { FC_REF_CONSTANT, 1, OFF(153,402), NUM(153,402) } }, /* 153 */ - { "mo", { FC_REF_CONSTANT, 4, OFF(154,403), NUM(154,403) } }, /* 154 */ - { "mr", { FC_REF_CONSTANT, 1, OFF(155,13), NUM(155,13) } }, /* 155 */ - { "ms", { FC_REF_CONSTANT, 1, OFF(156,27), NUM(156,27) } }, /* 156 */ - { "mt", { FC_REF_CONSTANT, 2, OFF(157,407), NUM(157,407) } }, /* 157 */ - { "my", { FC_REF_CONSTANT, 1, OFF(158,402), NUM(158,402) } }, /* 158 */ - { "na", { FC_REF_CONSTANT, 2, OFF(159,409), NUM(159,409) } }, /* 159 */ - { "nan", { FC_REF_CONSTANT, 84, OFF(160,411), NUM(160,411) } }, /* 160 */ - { "nb", { FC_REF_CONSTANT, 1, OFF(161,495), NUM(161,495) } }, /* 161 */ - { "nds", { FC_REF_CONSTANT, 1, OFF(162,154), NUM(162,154) } }, /* 162 */ - { "ne", { FC_REF_CONSTANT, 1, OFF(163,496), NUM(163,496) } }, /* 163 */ - { "ng", { FC_REF_CONSTANT, 1, OFF(164,27), NUM(164,27) } }, /* 164 */ - { "nhn", { FC_REF_CONSTANT, 2, OFF(165,497), NUM(165,497) } }, /* 165 */ - { "niu", { FC_REF_CONSTANT, 2, OFF(166,499), NUM(166,499) } }, /* 166 */ - { "nl", { FC_REF_CONSTANT, 1, OFF(167,501), NUM(167,501) } }, /* 167 */ - { "nn", { FC_REF_CONSTANT, 1, OFF(168,502), NUM(168,502) } }, /* 168 */ - { "no", { FC_REF_CONSTANT, 1, OFF(169,495), NUM(169,495) } }, /* 169 */ - { "nqo", { FC_REF_CONSTANT, 1, OFF(170,503), NUM(170,503) } }, /* 170 */ - { "nr", { FC_REF_CONSTANT, 1, OFF(171,27), NUM(171,27) } }, /* 171 */ - { "nso", { FC_REF_CONSTANT, 2, OFF(172,504), NUM(172,504) } }, /* 172 */ - { "nv", { FC_REF_CONSTANT, 4, OFF(173,506), NUM(173,506) } }, /* 173 */ - { "ny", { FC_REF_CONSTANT, 2, OFF(174,510), NUM(174,510) } }, /* 174 */ - { "oc", { FC_REF_CONSTANT, 1, OFF(175,512), NUM(175,512) } }, /* 175 */ - { "om", { FC_REF_CONSTANT, 1, OFF(176,27), NUM(176,27) } }, /* 176 */ - { "or", { FC_REF_CONSTANT, 1, OFF(177,513), NUM(177,513) } }, /* 177 */ - { "os", { FC_REF_CONSTANT, 1, OFF(178,365), NUM(178,365) } }, /* 178 */ - { "ota", { FC_REF_CONSTANT, 1, OFF(179,514), NUM(179,514) } }, /* 179 */ - { "pa", { FC_REF_CONSTANT, 1, OFF(180,515), NUM(180,515) } }, /* 180 */ - { "pa-pk", { FC_REF_CONSTANT, 1, OFF(181,373), NUM(181,373) } }, /* 181 */ - { "pap-an", { FC_REF_CONSTANT, 1, OFF(182,516), NUM(182,516) } }, /* 182 */ - { "pap-aw", { FC_REF_CONSTANT, 1, OFF(183,517), NUM(183,517) } }, /* 183 */ - { "pl", { FC_REF_CONSTANT, 2, OFF(184,518), NUM(184,518) } }, /* 184 */ - { "ps-af", { FC_REF_CONSTANT, 1, OFF(185,520), NUM(185,520) } }, /* 185 */ - { "ps-pk", { FC_REF_CONSTANT, 1, OFF(186,521), NUM(186,521) } }, /* 186 */ - { "pt", { FC_REF_CONSTANT, 1, OFF(187,522), NUM(187,522) } }, /* 187 */ - { "qu", { FC_REF_CONSTANT, 2, OFF(188,523), NUM(188,523) } }, /* 188 */ - { "quz", { FC_REF_CONSTANT, 2, OFF(189,523), NUM(189,523) } }, /* 189 */ - { "raj", { FC_REF_CONSTANT, 1, OFF(190,13), NUM(190,13) } }, /* 190 */ - { "rif", { FC_REF_CONSTANT, 4, OFF(191,525), NUM(191,525) } }, /* 191 */ - { "rm", { FC_REF_CONSTANT, 1, OFF(192,529), NUM(192,529) } }, /* 192 */ - { "rn", { FC_REF_CONSTANT, 1, OFF(193,27), NUM(193,27) } }, /* 193 */ - { "ro", { FC_REF_CONSTANT, 3, OFF(194,530), NUM(194,530) } }, /* 194 */ - { "ru", { FC_REF_CONSTANT, 1, OFF(195,365), NUM(195,365) } }, /* 195 */ - { "rw", { FC_REF_CONSTANT, 1, OFF(196,27), NUM(196,27) } }, /* 196 */ - { "sa", { FC_REF_CONSTANT, 1, OFF(197,13), NUM(197,13) } }, /* 197 */ - { "sah", { FC_REF_CONSTANT, 1, OFF(198,533), NUM(198,533) } }, /* 198 */ - { "sat", { FC_REF_CONSTANT, 1, OFF(199,534), NUM(199,534) } }, /* 199 */ - { "sc", { FC_REF_CONSTANT, 1, OFF(200,535), NUM(200,535) } }, /* 200 */ - { "sco", { FC_REF_CONSTANT, 3, OFF(201,536), NUM(201,536) } }, /* 201 */ - { "sd", { FC_REF_CONSTANT, 1, OFF(202,539), NUM(202,539) } }, /* 202 */ - { "se", { FC_REF_CONSTANT, 2, OFF(203,540), NUM(203,540) } }, /* 203 */ - { "sel", { FC_REF_CONSTANT, 1, OFF(204,365), NUM(204,365) } }, /* 204 */ - { "sg", { FC_REF_CONSTANT, 1, OFF(205,542), NUM(205,542) } }, /* 205 */ - { "sgs", { FC_REF_CONSTANT, 3, OFF(206,543), NUM(206,543) } }, /* 206 */ - { "sh", { FC_REF_CONSTANT, 3, OFF(207,546), NUM(207,546) } }, /* 207 */ - { "shn", { FC_REF_CONSTANT, 1, OFF(208,402), NUM(208,402) } }, /* 208 */ - { "shs", { FC_REF_CONSTANT, 2, OFF(209,549), NUM(209,549) } }, /* 209 */ - { "si", { FC_REF_CONSTANT, 1, OFF(210,551), NUM(210,551) } }, /* 210 */ - { "sid", { FC_REF_CONSTANT, 2, OFF(211,552), NUM(211,552) } }, /* 211 */ - { "sk", { FC_REF_CONSTANT, 2, OFF(212,554), NUM(212,554) } }, /* 212 */ - { "sl", { FC_REF_CONSTANT, 2, OFF(213,45), NUM(213,45) } }, /* 213 */ - { "sm", { FC_REF_CONSTANT, 2, OFF(214,556), NUM(214,556) } }, /* 214 */ - { "sma", { FC_REF_CONSTANT, 1, OFF(215,558), NUM(215,558) } }, /* 215 */ - { "smj", { FC_REF_CONSTANT, 1, OFF(216,559), NUM(216,559) } }, /* 216 */ - { "smn", { FC_REF_CONSTANT, 2, OFF(217,560), NUM(217,560) } }, /* 217 */ - { "sms", { FC_REF_CONSTANT, 3, OFF(218,562), NUM(218,562) } }, /* 218 */ - { "sn", { FC_REF_CONSTANT, 1, OFF(219,27), NUM(219,27) } }, /* 219 */ - { "so", { FC_REF_CONSTANT, 1, OFF(220,27), NUM(220,27) } }, /* 220 */ - { "sq", { FC_REF_CONSTANT, 1, OFF(221,565), NUM(221,565) } }, /* 221 */ - { "sr", { FC_REF_CONSTANT, 1, OFF(222,566), NUM(222,566) } }, /* 222 */ - { "ss", { FC_REF_CONSTANT, 1, OFF(223,27), NUM(223,27) } }, /* 223 */ - { "st", { FC_REF_CONSTANT, 1, OFF(224,27), NUM(224,27) } }, /* 224 */ - { "su", { FC_REF_CONSTANT, 1, OFF(225,204), NUM(225,204) } }, /* 225 */ - { "sv", { FC_REF_CONSTANT, 1, OFF(226,567), NUM(226,567) } }, /* 226 */ - { "sw", { FC_REF_CONSTANT, 1, OFF(227,27), NUM(227,27) } }, /* 227 */ - { "syr", { FC_REF_CONSTANT, 1, OFF(228,568), NUM(228,568) } }, /* 228 */ - { "szl", { FC_REF_CONSTANT, 2, OFF(229,569), NUM(229,569) } }, /* 229 */ - { "ta", { FC_REF_CONSTANT, 1, OFF(230,571), NUM(230,571) } }, /* 230 */ - { "tcy", { FC_REF_CONSTANT, 1, OFF(231,311), NUM(231,311) } }, /* 231 */ - { "te", { FC_REF_CONSTANT, 1, OFF(232,572), NUM(232,572) } }, /* 232 */ - { "tg", { FC_REF_CONSTANT, 1, OFF(233,573), NUM(233,573) } }, /* 233 */ - { "th", { FC_REF_CONSTANT, 1, OFF(234,574), NUM(234,574) } }, /* 234 */ - { "the", { FC_REF_CONSTANT, 1, OFF(235,13), NUM(235,13) } }, /* 235 */ - { "ti-er", { FC_REF_CONSTANT, 2, OFF(236,48), NUM(236,48) } }, /* 236 */ - { "ti-et", { FC_REF_CONSTANT, 2, OFF(237,552), NUM(237,552) } }, /* 237 */ - { "tig", { FC_REF_CONSTANT, 2, OFF(238,575), NUM(238,575) } }, /* 238 */ - { "tk", { FC_REF_CONSTANT, 2, OFF(239,577), NUM(239,577) } }, /* 239 */ - { "tl", { FC_REF_CONSTANT, 1, OFF(240,173), NUM(240,173) } }, /* 240 */ - { "tn", { FC_REF_CONSTANT, 2, OFF(241,504), NUM(241,504) } }, /* 241 */ - { "to", { FC_REF_CONSTANT, 2, OFF(242,556), NUM(242,556) } }, /* 242 */ - { "tpi", { FC_REF_CONSTANT, 1, OFF(243,162), NUM(243,162) } }, /* 243 */ - { "tr", { FC_REF_CONSTANT, 2, OFF(244,579), NUM(244,579) } }, /* 244 */ - { "ts", { FC_REF_CONSTANT, 1, OFF(245,27), NUM(245,27) } }, /* 245 */ - { "tt", { FC_REF_CONSTANT, 1, OFF(246,581), NUM(246,581) } }, /* 246 */ - { "tw", { FC_REF_CONSTANT, 5, OFF(247,5), NUM(247,5) } }, /* 247 */ - { "ty", { FC_REF_CONSTANT, 3, OFF(248,582), NUM(248,582) } }, /* 248 */ - { "tyv", { FC_REF_CONSTANT, 1, OFF(249,370), NUM(249,370) } }, /* 249 */ - { "ug", { FC_REF_CONSTANT, 1, OFF(250,585), NUM(250,585) } }, /* 250 */ - { "uk", { FC_REF_CONSTANT, 1, OFF(251,586), NUM(251,586) } }, /* 251 */ - { "und-zmth", { FC_REF_CONSTANT, 12, OFF(252,587), NUM(252,587) } }, /* 252 */ - { "und-zsye", { FC_REF_CONSTANT, 12, OFF(253,599), NUM(253,599) } }, /* 253 */ - { "unm", { FC_REF_CONSTANT, 1, OFF(254,162), NUM(254,162) } }, /* 254 */ - { "ur", { FC_REF_CONSTANT, 1, OFF(255,373), NUM(255,373) } }, /* 255 */ - { "uz", { FC_REF_CONSTANT, 1, OFF(256,27), NUM(256,27) } }, /* 256 */ - { "ve", { FC_REF_CONSTANT, 2, OFF(257,611), NUM(257,611) } }, /* 257 */ - { "vi", { FC_REF_CONSTANT, 4, OFF(258,613), NUM(258,613) } }, /* 258 */ - { "vo", { FC_REF_CONSTANT, 1, OFF(259,617), NUM(259,617) } }, /* 259 */ - { "vot", { FC_REF_CONSTANT, 2, OFF(260,618), NUM(260,618) } }, /* 260 */ - { "wa", { FC_REF_CONSTANT, 1, OFF(261,620), NUM(261,620) } }, /* 261 */ - { "wae", { FC_REF_CONSTANT, 1, OFF(262,154), NUM(262,154) } }, /* 262 */ - { "wal", { FC_REF_CONSTANT, 2, OFF(263,552), NUM(263,552) } }, /* 263 */ - { "wen", { FC_REF_CONSTANT, 2, OFF(264,621), NUM(264,621) } }, /* 264 */ - { "wo", { FC_REF_CONSTANT, 2, OFF(265,623), NUM(265,623) } }, /* 265 */ - { "xh", { FC_REF_CONSTANT, 1, OFF(266,27), NUM(266,27) } }, /* 266 */ - { "yap", { FC_REF_CONSTANT, 1, OFF(267,625), NUM(267,625) } }, /* 267 */ - { "yi", { FC_REF_CONSTANT, 1, OFF(268,194), NUM(268,194) } }, /* 268 */ - { "yo", { FC_REF_CONSTANT, 4, OFF(269,626), NUM(269,626) } }, /* 269 */ - { "yue", { FC_REF_CONSTANT, 171, OFF(270,630), NUM(270,630) } }, /* 270 */ - { "yuw", { FC_REF_CONSTANT, 1, OFF(271,162), NUM(271,162) } }, /* 271 */ - { "za", { FC_REF_CONSTANT, 1, OFF(272,27), NUM(272,27) } }, /* 272 */ - { "zh-cn", { FC_REF_CONSTANT, 82, OFF(273,801), NUM(273,801) } }, /* 273 */ - { "zh-hk", { FC_REF_CONSTANT, 171, OFF(274,630), NUM(274,630) } }, /* 274 */ - { "zh-mo", { FC_REF_CONSTANT, 171, OFF(275,630), NUM(275,630) } }, /* 275 */ - { "zh-sg", { FC_REF_CONSTANT, 82, OFF(276,801), NUM(276,801) } }, /* 276 */ - { "zh-tw", { FC_REF_CONSTANT, 83, OFF(277,56), NUM(277,56) } }, /* 277 */ - { "zu", { FC_REF_CONSTANT, 1, OFF(278,27), NUM(278,27) } }, /* 278 */ + { "cop", { FC_REF_CONSTANT, 2, OFF(43,141), NUM(43,141) } }, /* 43 */ + { "crh", { FC_REF_CONSTANT, 2, OFF(44,143), NUM(44,143) } }, /* 44 */ + { "cs", { FC_REF_CONSTANT, 2, OFF(45,145), NUM(45,145) } }, /* 45 */ + { "csb", { FC_REF_CONSTANT, 2, OFF(46,147), NUM(46,147) } }, /* 46 */ + { "cu", { FC_REF_CONSTANT, 1, OFF(47,149), NUM(47,149) } }, /* 47 */ + { "cv", { FC_REF_CONSTANT, 2, OFF(48,150), NUM(48,150) } }, /* 48 */ + { "cy", { FC_REF_CONSTANT, 3, OFF(49,152), NUM(49,152) } }, /* 49 */ + { "da", { FC_REF_CONSTANT, 1, OFF(50,155), NUM(50,155) } }, /* 50 */ + { "de", { FC_REF_CONSTANT, 1, OFF(51,156), NUM(51,156) } }, /* 51 */ + { "doi", { FC_REF_CONSTANT, 1, OFF(52,157), NUM(52,157) } }, /* 52 */ + { "dsb", { FC_REF_CONSTANT, 2, OFF(53,145), NUM(53,145) } }, /* 53 */ + { "dv", { FC_REF_CONSTANT, 1, OFF(54,158), NUM(54,158) } }, /* 54 */ + { "dz", { FC_REF_CONSTANT, 1, OFF(55,42), NUM(55,42) } }, /* 55 */ + { "ee", { FC_REF_CONSTANT, 4, OFF(56,159), NUM(56,159) } }, /* 56 */ + { "el", { FC_REF_CONSTANT, 1, OFF(57,163), NUM(57,163) } }, /* 57 */ + { "en", { FC_REF_CONSTANT, 1, OFF(58,164), NUM(58,164) } }, /* 58 */ + { "eo", { FC_REF_CONSTANT, 2, OFF(59,165), NUM(59,165) } }, /* 59 */ + { "es", { FC_REF_CONSTANT, 1, OFF(60,12), NUM(60,12) } }, /* 60 */ + { "et", { FC_REF_CONSTANT, 2, OFF(61,167), NUM(61,167) } }, /* 61 */ + { "eu", { FC_REF_CONSTANT, 1, OFF(62,169), NUM(62,169) } }, /* 62 */ + { "fa", { FC_REF_CONSTANT, 1, OFF(63,24), NUM(63,24) } }, /* 63 */ + { "fat", { FC_REF_CONSTANT, 5, OFF(64,5), NUM(64,5) } }, /* 64 */ + { "ff", { FC_REF_CONSTANT, 3, OFF(65,170), NUM(65,170) } }, /* 65 */ + { "fi", { FC_REF_CONSTANT, 2, OFF(66,173), NUM(66,173) } }, /* 66 */ + { "fil", { FC_REF_CONSTANT, 1, OFF(67,175), NUM(67,175) } }, /* 67 */ + { "fj", { FC_REF_CONSTANT, 1, OFF(68,27), NUM(68,27) } }, /* 68 */ + { "fo", { FC_REF_CONSTANT, 1, OFF(69,176), NUM(69,176) } }, /* 69 */ + { "fr", { FC_REF_CONSTANT, 2, OFF(70,139), NUM(70,139) } }, /* 70 */ + { "fur", { FC_REF_CONSTANT, 1, OFF(71,177), NUM(71,177) } }, /* 71 */ + { "fy", { FC_REF_CONSTANT, 1, OFF(72,178), NUM(72,178) } }, /* 72 */ + { "ga", { FC_REF_CONSTANT, 3, OFF(73,179), NUM(73,179) } }, /* 73 */ + { "gd", { FC_REF_CONSTANT, 1, OFF(74,182), NUM(74,182) } }, /* 74 */ + { "gez", { FC_REF_CONSTANT, 2, OFF(75,183), NUM(75,183) } }, /* 75 */ + { "gl", { FC_REF_CONSTANT, 1, OFF(76,12), NUM(76,12) } }, /* 76 */ + { "gn", { FC_REF_CONSTANT, 3, OFF(77,185), NUM(77,185) } }, /* 77 */ + { "got", { FC_REF_CONSTANT, 1, OFF(78,188), NUM(78,188) } }, /* 78 */ + { "gu", { FC_REF_CONSTANT, 1, OFF(79,189), NUM(79,189) } }, /* 79 */ + { "gv", { FC_REF_CONSTANT, 1, OFF(80,190), NUM(80,190) } }, /* 80 */ + { "ha", { FC_REF_CONSTANT, 3, OFF(81,191), NUM(81,191) } }, /* 81 */ + { "hak", { FC_REF_CONSTANT, 83, OFF(82,56), NUM(82,56) } }, /* 82 */ + { "haw", { FC_REF_CONSTANT, 3, OFF(83,194), NUM(83,194) } }, /* 83 */ + { "he", { FC_REF_CONSTANT, 1, OFF(84,197), NUM(84,197) } }, /* 84 */ + { "hi", { FC_REF_CONSTANT, 1, OFF(85,13), NUM(85,13) } }, /* 85 */ + { "hif", { FC_REF_CONSTANT, 1, OFF(86,13), NUM(86,13) } }, /* 86 */ + { "hne", { FC_REF_CONSTANT, 1, OFF(87,13), NUM(87,13) } }, /* 87 */ + { "ho", { FC_REF_CONSTANT, 1, OFF(88,27), NUM(88,27) } }, /* 88 */ + { "hr", { FC_REF_CONSTANT, 2, OFF(89,45), NUM(89,45) } }, /* 89 */ + { "hsb", { FC_REF_CONSTANT, 2, OFF(90,198), NUM(90,198) } }, /* 90 */ + { "ht", { FC_REF_CONSTANT, 1, OFF(91,200), NUM(91,200) } }, /* 91 */ + { "hu", { FC_REF_CONSTANT, 2, OFF(92,201), NUM(92,201) } }, /* 92 */ + { "hy", { FC_REF_CONSTANT, 1, OFF(93,203), NUM(93,203) } }, /* 93 */ + { "hz", { FC_REF_CONSTANT, 3, OFF(94,204), NUM(94,204) } }, /* 94 */ + { "ia", { FC_REF_CONSTANT, 1, OFF(95,27), NUM(95,27) } }, /* 95 */ + { "id", { FC_REF_CONSTANT, 1, OFF(96,207), NUM(96,207) } }, /* 96 */ + { "ie", { FC_REF_CONSTANT, 1, OFF(97,208), NUM(97,208) } }, /* 97 */ + { "ig", { FC_REF_CONSTANT, 2, OFF(98,209), NUM(98,209) } }, /* 98 */ + { "ii", { FC_REF_CONSTANT, 5, OFF(99,211), NUM(99,211) } }, /* 99 */ + { "ik", { FC_REF_CONSTANT, 1, OFF(100,216), NUM(100,216) } }, /* 100 */ + { "io", { FC_REF_CONSTANT, 1, OFF(101,27), NUM(101,27) } }, /* 101 */ + { "is", { FC_REF_CONSTANT, 1, OFF(102,217), NUM(102,217) } }, /* 102 */ + { "it", { FC_REF_CONSTANT, 1, OFF(103,218), NUM(103,218) } }, /* 103 */ + { "iu", { FC_REF_CONSTANT, 3, OFF(104,219), NUM(104,219) } }, /* 104 */ + { "ja", { FC_REF_CONSTANT, 83, OFF(105,222), NUM(105,222) } }, /* 105 */ + { "jv", { FC_REF_CONSTANT, 1, OFF(106,305), NUM(106,305) } }, /* 106 */ + { "ka", { FC_REF_CONSTANT, 1, OFF(107,306), NUM(107,306) } }, /* 107 */ + { "kaa", { FC_REF_CONSTANT, 1, OFF(108,307), NUM(108,307) } }, /* 108 */ + { "kab", { FC_REF_CONSTANT, 4, OFF(109,28), NUM(109,28) } }, /* 109 */ + { "ki", { FC_REF_CONSTANT, 2, OFF(110,308), NUM(110,308) } }, /* 110 */ + { "kj", { FC_REF_CONSTANT, 1, OFF(111,27), NUM(111,27) } }, /* 111 */ + { "kk", { FC_REF_CONSTANT, 1, OFF(112,310), NUM(112,310) } }, /* 112 */ + { "kl", { FC_REF_CONSTANT, 2, OFF(113,311), NUM(113,311) } }, /* 113 */ + { "km", { FC_REF_CONSTANT, 1, OFF(114,313), NUM(114,313) } }, /* 114 */ + { "kn", { FC_REF_CONSTANT, 1, OFF(115,314), NUM(115,314) } }, /* 115 */ + { "ko", { FC_REF_CONSTANT, 45, OFF(116,315), NUM(116,315) } }, /* 116 */ + { "kok", { FC_REF_CONSTANT, 1, OFF(117,13), NUM(117,13) } }, /* 117 */ + { "kr", { FC_REF_CONSTANT, 3, OFF(118,360), NUM(118,360) } }, /* 118 */ + { "ks", { FC_REF_CONSTANT, 1, OFF(119,363), NUM(119,363) } }, /* 119 */ + { "ku-am", { FC_REF_CONSTANT, 2, OFF(120,364), NUM(120,364) } }, /* 120 */ + { "ku-iq", { FC_REF_CONSTANT, 1, OFF(121,55), NUM(121,55) } }, /* 121 */ + { "ku-ir", { FC_REF_CONSTANT, 1, OFF(122,55), NUM(122,55) } }, /* 122 */ + { "ku-tr", { FC_REF_CONSTANT, 2, OFF(123,366), NUM(123,366) } }, /* 123 */ + { "kum", { FC_REF_CONSTANT, 1, OFF(124,368), NUM(124,368) } }, /* 124 */ + { "kv", { FC_REF_CONSTANT, 1, OFF(125,369), NUM(125,369) } }, /* 125 */ + { "kw", { FC_REF_CONSTANT, 3, OFF(126,370), NUM(126,370) } }, /* 126 */ + { "kwm", { FC_REF_CONSTANT, 1, OFF(127,27), NUM(127,27) } }, /* 127 */ + { "ky", { FC_REF_CONSTANT, 1, OFF(128,373), NUM(128,373) } }, /* 128 */ + { "la", { FC_REF_CONSTANT, 2, OFF(129,374), NUM(129,374) } }, /* 129 */ + { "lah", { FC_REF_CONSTANT, 1, OFF(130,376), NUM(130,376) } }, /* 130 */ + { "lb", { FC_REF_CONSTANT, 1, OFF(131,377), NUM(131,377) } }, /* 131 */ + { "lez", { FC_REF_CONSTANT, 1, OFF(132,18), NUM(132,18) } }, /* 132 */ + { "lg", { FC_REF_CONSTANT, 2, OFF(133,378), NUM(133,378) } }, /* 133 */ + { "li", { FC_REF_CONSTANT, 1, OFF(134,380), NUM(134,380) } }, /* 134 */ + { "lij", { FC_REF_CONSTANT, 1, OFF(135,381), NUM(135,381) } }, /* 135 */ + { "ln", { FC_REF_CONSTANT, 4, OFF(136,382), NUM(136,382) } }, /* 136 */ + { "lo", { FC_REF_CONSTANT, 1, OFF(137,386), NUM(137,386) } }, /* 137 */ + { "lt", { FC_REF_CONSTANT, 2, OFF(138,387), NUM(138,387) } }, /* 138 */ + { "lv", { FC_REF_CONSTANT, 2, OFF(139,389), NUM(139,389) } }, /* 139 */ + { "lzh", { FC_REF_CONSTANT, 83, OFF(140,56), NUM(140,56) } }, /* 140 */ + { "mag", { FC_REF_CONSTANT, 1, OFF(141,13), NUM(141,13) } }, /* 141 */ + { "mai", { FC_REF_CONSTANT, 1, OFF(142,13), NUM(142,13) } }, /* 142 */ + { "mfe", { FC_REF_CONSTANT, 2, OFF(143,139), NUM(143,139) } }, /* 143 */ + { "mg", { FC_REF_CONSTANT, 1, OFF(144,391), NUM(144,391) } }, /* 144 */ + { "mh", { FC_REF_CONSTANT, 2, OFF(145,392), NUM(145,392) } }, /* 145 */ + { "mhr", { FC_REF_CONSTANT, 1, OFF(146,368), NUM(146,368) } }, /* 146 */ + { "mi", { FC_REF_CONSTANT, 3, OFF(147,394), NUM(147,394) } }, /* 147 */ + { "miq", { FC_REF_CONSTANT, 3, OFF(148,397), NUM(148,397) } }, /* 148 */ + { "mjw", { FC_REF_CONSTANT, 1, OFF(149,164), NUM(149,164) } }, /* 149 */ + { "mk", { FC_REF_CONSTANT, 1, OFF(150,400), NUM(150,400) } }, /* 150 */ + { "ml", { FC_REF_CONSTANT, 1, OFF(151,401), NUM(151,401) } }, /* 151 */ + { "mn-cn", { FC_REF_CONSTANT, 1, OFF(152,402), NUM(152,402) } }, /* 152 */ + { "mn-mn", { FC_REF_CONSTANT, 1, OFF(153,403), NUM(153,403) } }, /* 153 */ + { "mni", { FC_REF_CONSTANT, 1, OFF(154,404), NUM(154,404) } }, /* 154 */ + { "mnw", { FC_REF_CONSTANT, 1, OFF(155,405), NUM(155,405) } }, /* 155 */ + { "mo", { FC_REF_CONSTANT, 4, OFF(156,406), NUM(156,406) } }, /* 156 */ + { "mr", { FC_REF_CONSTANT, 1, OFF(157,13), NUM(157,13) } }, /* 157 */ + { "ms", { FC_REF_CONSTANT, 1, OFF(158,27), NUM(158,27) } }, /* 158 */ + { "mt", { FC_REF_CONSTANT, 2, OFF(159,410), NUM(159,410) } }, /* 159 */ + { "my", { FC_REF_CONSTANT, 1, OFF(160,405), NUM(160,405) } }, /* 160 */ + { "na", { FC_REF_CONSTANT, 2, OFF(161,412), NUM(161,412) } }, /* 161 */ + { "nan", { FC_REF_CONSTANT, 84, OFF(162,414), NUM(162,414) } }, /* 162 */ + { "nb", { FC_REF_CONSTANT, 1, OFF(163,498), NUM(163,498) } }, /* 163 */ + { "nds", { FC_REF_CONSTANT, 1, OFF(164,156), NUM(164,156) } }, /* 164 */ + { "ne", { FC_REF_CONSTANT, 1, OFF(165,499), NUM(165,499) } }, /* 165 */ + { "ng", { FC_REF_CONSTANT, 1, OFF(166,27), NUM(166,27) } }, /* 166 */ + { "nhn", { FC_REF_CONSTANT, 2, OFF(167,500), NUM(167,500) } }, /* 167 */ + { "niu", { FC_REF_CONSTANT, 2, OFF(168,502), NUM(168,502) } }, /* 168 */ + { "nl", { FC_REF_CONSTANT, 1, OFF(169,504), NUM(169,504) } }, /* 169 */ + { "nn", { FC_REF_CONSTANT, 1, OFF(170,505), NUM(170,505) } }, /* 170 */ + { "no", { FC_REF_CONSTANT, 1, OFF(171,498), NUM(171,498) } }, /* 171 */ + { "nqo", { FC_REF_CONSTANT, 1, OFF(172,506), NUM(172,506) } }, /* 172 */ + { "nr", { FC_REF_CONSTANT, 1, OFF(173,27), NUM(173,27) } }, /* 173 */ + { "nso", { FC_REF_CONSTANT, 2, OFF(174,507), NUM(174,507) } }, /* 174 */ + { "nv", { FC_REF_CONSTANT, 4, OFF(175,509), NUM(175,509) } }, /* 175 */ + { "ny", { FC_REF_CONSTANT, 2, OFF(176,513), NUM(176,513) } }, /* 176 */ + { "oc", { FC_REF_CONSTANT, 1, OFF(177,515), NUM(177,515) } }, /* 177 */ + { "om", { FC_REF_CONSTANT, 1, OFF(178,27), NUM(178,27) } }, /* 178 */ + { "or", { FC_REF_CONSTANT, 1, OFF(179,516), NUM(179,516) } }, /* 179 */ + { "os", { FC_REF_CONSTANT, 1, OFF(180,368), NUM(180,368) } }, /* 180 */ + { "ota", { FC_REF_CONSTANT, 1, OFF(181,517), NUM(181,517) } }, /* 181 */ + { "pa", { FC_REF_CONSTANT, 1, OFF(182,518), NUM(182,518) } }, /* 182 */ + { "pa-pk", { FC_REF_CONSTANT, 1, OFF(183,376), NUM(183,376) } }, /* 183 */ + { "pap-an", { FC_REF_CONSTANT, 1, OFF(184,519), NUM(184,519) } }, /* 184 */ + { "pap-aw", { FC_REF_CONSTANT, 1, OFF(185,520), NUM(185,520) } }, /* 185 */ + { "pl", { FC_REF_CONSTANT, 2, OFF(186,521), NUM(186,521) } }, /* 186 */ + { "ps-af", { FC_REF_CONSTANT, 1, OFF(187,523), NUM(187,523) } }, /* 187 */ + { "ps-pk", { FC_REF_CONSTANT, 1, OFF(188,524), NUM(188,524) } }, /* 188 */ + { "pt", { FC_REF_CONSTANT, 1, OFF(189,525), NUM(189,525) } }, /* 189 */ + { "qu", { FC_REF_CONSTANT, 2, OFF(190,526), NUM(190,526) } }, /* 190 */ + { "quz", { FC_REF_CONSTANT, 2, OFF(191,526), NUM(191,526) } }, /* 191 */ + { "raj", { FC_REF_CONSTANT, 1, OFF(192,13), NUM(192,13) } }, /* 192 */ + { "rif", { FC_REF_CONSTANT, 4, OFF(193,528), NUM(193,528) } }, /* 193 */ + { "rm", { FC_REF_CONSTANT, 1, OFF(194,532), NUM(194,532) } }, /* 194 */ + { "rn", { FC_REF_CONSTANT, 1, OFF(195,27), NUM(195,27) } }, /* 195 */ + { "ro", { FC_REF_CONSTANT, 3, OFF(196,533), NUM(196,533) } }, /* 196 */ + { "ru", { FC_REF_CONSTANT, 1, OFF(197,368), NUM(197,368) } }, /* 197 */ + { "rw", { FC_REF_CONSTANT, 1, OFF(198,27), NUM(198,27) } }, /* 198 */ + { "sa", { FC_REF_CONSTANT, 1, OFF(199,13), NUM(199,13) } }, /* 199 */ + { "sah", { FC_REF_CONSTANT, 1, OFF(200,536), NUM(200,536) } }, /* 200 */ + { "sat", { FC_REF_CONSTANT, 1, OFF(201,537), NUM(201,537) } }, /* 201 */ + { "sc", { FC_REF_CONSTANT, 1, OFF(202,538), NUM(202,538) } }, /* 202 */ + { "sco", { FC_REF_CONSTANT, 3, OFF(203,539), NUM(203,539) } }, /* 203 */ + { "sd", { FC_REF_CONSTANT, 1, OFF(204,542), NUM(204,542) } }, /* 204 */ + { "se", { FC_REF_CONSTANT, 2, OFF(205,543), NUM(205,543) } }, /* 205 */ + { "sel", { FC_REF_CONSTANT, 1, OFF(206,368), NUM(206,368) } }, /* 206 */ + { "sg", { FC_REF_CONSTANT, 1, OFF(207,545), NUM(207,545) } }, /* 207 */ + { "sgs", { FC_REF_CONSTANT, 3, OFF(208,546), NUM(208,546) } }, /* 208 */ + { "sh", { FC_REF_CONSTANT, 3, OFF(209,549), NUM(209,549) } }, /* 209 */ + { "shn", { FC_REF_CONSTANT, 1, OFF(210,405), NUM(210,405) } }, /* 210 */ + { "shs", { FC_REF_CONSTANT, 2, OFF(211,552), NUM(211,552) } }, /* 211 */ + { "si", { FC_REF_CONSTANT, 1, OFF(212,554), NUM(212,554) } }, /* 212 */ + { "sid", { FC_REF_CONSTANT, 2, OFF(213,555), NUM(213,555) } }, /* 213 */ + { "sk", { FC_REF_CONSTANT, 2, OFF(214,557), NUM(214,557) } }, /* 214 */ + { "sl", { FC_REF_CONSTANT, 2, OFF(215,45), NUM(215,45) } }, /* 215 */ + { "sm", { FC_REF_CONSTANT, 2, OFF(216,559), NUM(216,559) } }, /* 216 */ + { "sma", { FC_REF_CONSTANT, 1, OFF(217,561), NUM(217,561) } }, /* 217 */ + { "smj", { FC_REF_CONSTANT, 1, OFF(218,562), NUM(218,562) } }, /* 218 */ + { "smn", { FC_REF_CONSTANT, 2, OFF(219,563), NUM(219,563) } }, /* 219 */ + { "sms", { FC_REF_CONSTANT, 3, OFF(220,565), NUM(220,565) } }, /* 220 */ + { "sn", { FC_REF_CONSTANT, 1, OFF(221,27), NUM(221,27) } }, /* 221 */ + { "so", { FC_REF_CONSTANT, 1, OFF(222,27), NUM(222,27) } }, /* 222 */ + { "sq", { FC_REF_CONSTANT, 1, OFF(223,568), NUM(223,568) } }, /* 223 */ + { "sr", { FC_REF_CONSTANT, 1, OFF(224,569), NUM(224,569) } }, /* 224 */ + { "ss", { FC_REF_CONSTANT, 1, OFF(225,27), NUM(225,27) } }, /* 225 */ + { "st", { FC_REF_CONSTANT, 1, OFF(226,27), NUM(226,27) } }, /* 226 */ + { "su", { FC_REF_CONSTANT, 1, OFF(227,207), NUM(227,207) } }, /* 227 */ + { "sv", { FC_REF_CONSTANT, 1, OFF(228,570), NUM(228,570) } }, /* 228 */ + { "sw", { FC_REF_CONSTANT, 1, OFF(229,27), NUM(229,27) } }, /* 229 */ + { "syr", { FC_REF_CONSTANT, 1, OFF(230,571), NUM(230,571) } }, /* 230 */ + { "szl", { FC_REF_CONSTANT, 2, OFF(231,572), NUM(231,572) } }, /* 231 */ + { "ta", { FC_REF_CONSTANT, 1, OFF(232,574), NUM(232,574) } }, /* 232 */ + { "tcy", { FC_REF_CONSTANT, 1, OFF(233,314), NUM(233,314) } }, /* 233 */ + { "te", { FC_REF_CONSTANT, 1, OFF(234,575), NUM(234,575) } }, /* 234 */ + { "tg", { FC_REF_CONSTANT, 1, OFF(235,576), NUM(235,576) } }, /* 235 */ + { "th", { FC_REF_CONSTANT, 1, OFF(236,577), NUM(236,577) } }, /* 236 */ + { "the", { FC_REF_CONSTANT, 1, OFF(237,13), NUM(237,13) } }, /* 237 */ + { "ti-er", { FC_REF_CONSTANT, 2, OFF(238,48), NUM(238,48) } }, /* 238 */ + { "ti-et", { FC_REF_CONSTANT, 2, OFF(239,555), NUM(239,555) } }, /* 239 */ + { "tig", { FC_REF_CONSTANT, 2, OFF(240,578), NUM(240,578) } }, /* 240 */ + { "tk", { FC_REF_CONSTANT, 2, OFF(241,580), NUM(241,580) } }, /* 241 */ + { "tl", { FC_REF_CONSTANT, 1, OFF(242,175), NUM(242,175) } }, /* 242 */ + { "tn", { FC_REF_CONSTANT, 2, OFF(243,507), NUM(243,507) } }, /* 243 */ + { "to", { FC_REF_CONSTANT, 2, OFF(244,559), NUM(244,559) } }, /* 244 */ + { "tpi", { FC_REF_CONSTANT, 1, OFF(245,164), NUM(245,164) } }, /* 245 */ + { "tr", { FC_REF_CONSTANT, 2, OFF(246,582), NUM(246,582) } }, /* 246 */ + { "ts", { FC_REF_CONSTANT, 1, OFF(247,27), NUM(247,27) } }, /* 247 */ + { "tt", { FC_REF_CONSTANT, 1, OFF(248,584), NUM(248,584) } }, /* 248 */ + { "tw", { FC_REF_CONSTANT, 5, OFF(249,5), NUM(249,5) } }, /* 249 */ + { "ty", { FC_REF_CONSTANT, 3, OFF(250,585), NUM(250,585) } }, /* 250 */ + { "tyv", { FC_REF_CONSTANT, 1, OFF(251,373), NUM(251,373) } }, /* 251 */ + { "ug", { FC_REF_CONSTANT, 1, OFF(252,588), NUM(252,588) } }, /* 252 */ + { "uk", { FC_REF_CONSTANT, 1, OFF(253,589), NUM(253,589) } }, /* 253 */ + { "und-zmth", { FC_REF_CONSTANT, 12, OFF(254,590), NUM(254,590) } }, /* 254 */ + { "und-zsye", { FC_REF_CONSTANT, 12, OFF(255,602), NUM(255,602) } }, /* 255 */ + { "unm", { FC_REF_CONSTANT, 1, OFF(256,164), NUM(256,164) } }, /* 256 */ + { "ur", { FC_REF_CONSTANT, 1, OFF(257,376), NUM(257,376) } }, /* 257 */ + { "uz", { FC_REF_CONSTANT, 1, OFF(258,27), NUM(258,27) } }, /* 258 */ + { "ve", { FC_REF_CONSTANT, 2, OFF(259,614), NUM(259,614) } }, /* 259 */ + { "vi", { FC_REF_CONSTANT, 4, OFF(260,616), NUM(260,616) } }, /* 260 */ + { "vo", { FC_REF_CONSTANT, 1, OFF(261,620), NUM(261,620) } }, /* 261 */ + { "vot", { FC_REF_CONSTANT, 2, OFF(262,621), NUM(262,621) } }, /* 262 */ + { "wa", { FC_REF_CONSTANT, 1, OFF(263,623), NUM(263,623) } }, /* 263 */ + { "wae", { FC_REF_CONSTANT, 1, OFF(264,156), NUM(264,156) } }, /* 264 */ + { "wal", { FC_REF_CONSTANT, 2, OFF(265,555), NUM(265,555) } }, /* 265 */ + { "wen", { FC_REF_CONSTANT, 2, OFF(266,624), NUM(266,624) } }, /* 266 */ + { "wo", { FC_REF_CONSTANT, 2, OFF(267,626), NUM(267,626) } }, /* 267 */ + { "xh", { FC_REF_CONSTANT, 1, OFF(268,27), NUM(268,27) } }, /* 268 */ + { "yap", { FC_REF_CONSTANT, 1, OFF(269,628), NUM(269,628) } }, /* 269 */ + { "yi", { FC_REF_CONSTANT, 1, OFF(270,197), NUM(270,197) } }, /* 270 */ + { "yo", { FC_REF_CONSTANT, 4, OFF(271,629), NUM(271,629) } }, /* 271 */ + { "yue", { FC_REF_CONSTANT, 171, OFF(272,633), NUM(272,633) } }, /* 272 */ + { "yuw", { FC_REF_CONSTANT, 1, OFF(273,164), NUM(273,164) } }, /* 273 */ + { "za", { FC_REF_CONSTANT, 1, OFF(274,27), NUM(274,27) } }, /* 274 */ + { "zh-cn", { FC_REF_CONSTANT, 82, OFF(275,804), NUM(275,804) } }, /* 275 */ + { "zh-hk", { FC_REF_CONSTANT, 171, OFF(276,633), NUM(276,633) } }, /* 276 */ + { "zh-mo", { FC_REF_CONSTANT, 171, OFF(277,633), NUM(277,633) } }, /* 277 */ + { "zh-sg", { FC_REF_CONSTANT, 82, OFF(278,804), NUM(278,804) } }, /* 278 */ + { "zh-tw", { FC_REF_CONSTANT, 83, OFF(279,56), NUM(279,56) } }, /* 279 */ + { "zu", { FC_REF_CONSTANT, 1, OFF(280,27), NUM(280,27) } }, /* 280 */ }, { { { /* 0 */ @@ -874,2410 +876,2422 @@ 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 137 */ - 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x10420084, 0x10420084, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x0000fffc, } }, { { /* 138 */ - 0xc0000000, 0x00030000, 0xc0000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0xffffffff, 0xffffffff, 0xffffffff, 0xfe0fffff, } }, { { /* 139 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x24082202, 0x24082202, + 0x00000000, 0x00000000, 0x10420084, 0x10420084, } }, { { /* 140 */ - 0x0c00f000, 0x00000000, 0x03000180, 0x6000c033, + 0xc0000000, 0x00030000, 0xc0000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 141 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x021c0a08, 0x021c0a08, + 0x00000000, 0x00000000, 0x24082202, 0x24082202, } }, { { /* 142 */ - 0x00000030, 0x00000000, 0x0000001e, 0x18000000, + 0x0c00f000, 0x00000000, 0x03000180, 0x6000c033, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 143 */ - 0xfdffa966, 0xffffdfff, 0xa965dfff, 0x03ffffff, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, + 0x00000000, 0x00000000, 0x021c0a08, 0x021c0a08, } }, { { /* 144 */ - 0x0000000c, 0x00000000, 0x00000000, 0x00000000, + 0x00000030, 0x00000000, 0x0000001e, 0x18000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 145 */ + 0xfdffa966, 0xffffdfff, 0xa965dfff, 0x03ffffff, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 146 */ + 0x0000000c, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 147 */ 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, 0x00000000, 0x00000c00, 0x00c00000, 0x000c0000, } }, - { { /* 146 */ + { { /* 148 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x0010c604, 0x8010c604, } }, - { { /* 147 */ + { { /* 149 */ 0x00000000, 0x00000000, 0x00000000, 0x01f00000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 148 */ + { { /* 150 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000003f, 0x00000000, 0x00000000, 0x000c0000, } }, - { { /* 149 */ + { { /* 151 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x25082262, 0x25082262, } }, - { { /* 150 */ + { { /* 152 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x90400010, 0x10400010, } }, - { { /* 151 */ + { { /* 153 */ 0xfff99fec, 0xf3e5fdff, 0xf807399f, 0x0000ffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 152 */ + { { /* 154 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x0001ffff, 0x00000000, 0x00000000, } }, - { { /* 153 */ + { { /* 155 */ 0x0c000000, 0x00000000, 0x00000c00, 0x00000000, 0x00170240, 0x00040000, 0x001fe000, 0x00000000, } }, - { { /* 154 */ + { { /* 156 */ 0x00000000, 0x00000000, 0x08500000, 0x00000008, 0x00000800, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 155 */ + { { /* 157 */ 0x00001003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 156 */ + { { /* 158 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffd740, 0xfffffffb, 0x00007fff, 0x00000000, } }, - { { /* 157 */ + { { /* 159 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00528f81, 0x00528f81, } }, - { { /* 158 */ - 0x30000300, 0x00300030, 0x30000000, 0x00003000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, - { { /* 159 */ - 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x10600010, 0x10600010, - } }, { { /* 160 */ - 0x00000000, 0x00000000, 0x00000000, 0x60000003, + 0x30000300, 0x00300030, 0x30000000, 0x00003000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 161 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x10020000, 0x10020000, + 0x00000000, 0x00000000, 0x10600010, 0x10600010, } }, { { /* 162 */ + 0x00000000, 0x00000000, 0x00000000, 0x60000003, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 163 */ + 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, + 0x00000000, 0x00000000, 0x10020000, 0x10020000, + } }, + { { /* 164 */ 0x00000000, 0x00000000, 0x00000c00, 0x00000000, 0x20000402, 0x00180000, 0x00000000, 0x00000000, } }, - { { /* 163 */ + { { /* 165 */ 0x00000000, 0x00000000, 0x00880000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 164 */ + { { /* 166 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00400030, 0x00400030, } }, - { { /* 165 */ + { { /* 167 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x0e1e7707, 0x0e1e7707, } }, - { { /* 166 */ + { { /* 168 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x25092042, 0x25092042, } }, - { { /* 167 */ + { { /* 169 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x02041107, 0x02041107, } }, - { { /* 168 */ + { { /* 170 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x9c508e14, 0x1c508e14, } }, - { { /* 169 */ + { { /* 171 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x04082202, 0x04082202, } }, - { { /* 170 */ + { { /* 172 */ 0x00000c00, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 171 */ + { { /* 173 */ 0xc0000c0c, 0x00000000, 0x00c00003, 0x00000c03, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 172 */ + { { /* 174 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x020c1383, 0x020c1383, } }, - { { /* 173 */ + { { /* 175 */ 0xff7fff7f, 0xff01ff7f, 0x00003d7f, 0x00ff00ff, 0x00ff3d7f, 0x003d7fff, 0xff7f7f00, 0x00ff7f00, } }, - { { /* 174 */ + { { /* 176 */ 0x003d7f00, 0xffff01ff, 0x007fff7f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 175 */ + { { /* 177 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x040a2202, 0x042a220a, } }, - { { /* 176 */ + { { /* 178 */ 0x00000000, 0x00000200, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 177 */ + { { /* 179 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20000000, 0x00000000, 0x02000000, } }, - { { /* 178 */ + { { /* 180 */ + 0x00000000, 0xffff0000, 0x000007ff, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 181 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfffbafee, 0xf3edfdff, 0x00013bbf, 0x00000001, } }, - { { /* 179 */ + { { /* 182 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00000080, 0x00000080, } }, - { { /* 180 */ + { { /* 183 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x03000402, 0x00180000, 0x00000000, 0x00000000, } }, - { { /* 181 */ + { { /* 184 */ 0x00000000, 0x00000000, 0x00880000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 182 */ + { { /* 185 */ 0x000c0003, 0x00000c00, 0x00003000, 0x00000c00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 183 */ + { { /* 186 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08000000, 0x00000000, 0x00000000, } }, - { { /* 184 */ + { { /* 187 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffff0000, 0x000007ff, } }, - { { /* 185 */ + { { /* 188 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00080000, 0x00080000, } }, - { { /* 186 */ + { { /* 189 */ 0x0c0030c0, 0x00000000, 0x0300001e, 0x66000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 187 */ + { { /* 190 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00040100, 0x00040100, } }, - { { /* 188 */ + { { /* 191 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x14482202, 0x14482202, } }, - { { /* 189 */ + { { /* 192 */ 0x00000000, 0x00000000, 0x00030000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 190 */ + { { /* 193 */ 0x00000000, 0xfffe0000, 0x007fffff, 0xfffffffe, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 191 */ + { { /* 194 */ 0x00000000, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 192 */ + { { /* 195 */ 0x000c0000, 0x00000000, 0x00000c00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 193 */ + { { /* 196 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00000200, 0x00000200, } }, - { { /* 194 */ + { { /* 197 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00003c00, 0x00000030, } }, - { { /* 195 */ + { { /* 198 */ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, } }, - { { /* 196 */ + { { /* 199 */ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x00001fff, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 197 */ + { { /* 200 */ 0xffff4002, 0xffffffff, 0x4002ffff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 198 */ + { { /* 201 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x64092242, 0x64092242, } }, - { { /* 199 */ + { { /* 202 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x060cb301, 0x060cb301, } }, - { { /* 200 */ + { { /* 203 */ 0x00000c7e, 0x031f8000, 0x0063f200, 0x000df840, 0x00037e08, 0x08000dfa, 0x0df901bf, 0x5437e400, } }, - { { /* 201 */ + { { /* 204 */ 0x00000025, 0x40006fc0, 0x27f91be4, 0xdee00000, 0x007ff83f, 0x00007f7f, 0x00000000, 0x00000000, } }, - { { /* 202 */ + { { /* 205 */ 0x00000000, 0x00000000, 0x00000000, 0x007f8000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 203 */ + { { /* 206 */ 0x000000a7, 0x00000000, 0xfffffffe, 0xffffffff, 0x780fffff, 0xfffffffe, 0xffffffff, 0x787fffff, } }, - { { /* 204 */ + { { /* 207 */ 0x03506f8b, 0x1b042042, 0x62808020, 0x400a0000, 0x10341b41, 0x04003812, 0x03608c02, 0x08454038, } }, - { { /* 205 */ + { { /* 208 */ 0x2403c002, 0x15108000, 0x1229e040, 0x80280000, 0x28002800, 0x8060c002, 0x2080040c, 0x05284002, } }, - { { /* 206 */ + { { /* 209 */ 0x82042a00, 0x02000818, 0x10008200, 0x20700020, 0x03022000, 0x40a41000, 0x0420a020, 0x00000080, } }, - { { /* 207 */ + { { /* 210 */ 0x80040011, 0x00000400, 0x04012b78, 0x11a23920, 0x02842460, 0x00c01021, 0x20002050, 0x07400042, } }, - { { /* 208 */ + { { /* 211 */ 0x208205c9, 0x0fc10230, 0x08402480, 0x00258018, 0x88000080, 0x42120609, 0xa32002a8, 0x40040094, } }, - { { /* 209 */ + { { /* 212 */ 0x00c00024, 0x8e000001, 0x059e058a, 0x013b0001, 0x85000010, 0x08080000, 0x02d07d04, 0x018d9838, } }, - { { /* 210 */ + { { /* 213 */ 0x8803f310, 0x03000840, 0x00000704, 0x30080500, 0x00001000, 0x20040000, 0x00000003, 0x04040002, } }, - { { /* 211 */ + { { /* 214 */ 0x000100d0, 0x40028000, 0x00088040, 0x00000000, 0x34000210, 0x00400e00, 0x00000020, 0x00000008, } }, - { { /* 212 */ + { { /* 215 */ 0x00000040, 0x00060000, 0x00000000, 0x00100100, 0x00000080, 0x00000000, 0x4c000000, 0x240d0009, } }, - { { /* 213 */ + { { /* 216 */ 0x80048000, 0x00010180, 0x00020484, 0x00000400, 0x00000804, 0x00000008, 0x80004800, 0x16800000, } }, - { { /* 214 */ + { { /* 217 */ 0x00200065, 0x00120410, 0x44920403, 0x40000200, 0x10880008, 0x40080100, 0x00001482, 0x00074800, } }, - { { /* 215 */ + { { /* 218 */ 0x14608200, 0x00024e84, 0x00128380, 0x20184520, 0x0240041c, 0x0a001120, 0x00180a00, 0x88000800, } }, - { { /* 216 */ + { { /* 219 */ 0x01000002, 0x00008001, 0x04000040, 0x80000040, 0x08040000, 0x00000000, 0x00001202, 0x00000002, } }, - { { /* 217 */ + { { /* 220 */ 0x00000000, 0x00000004, 0x21910000, 0x00000858, 0xbf8013a0, 0x8279401c, 0xa8041054, 0xc5004282, } }, - { { /* 218 */ + { { /* 221 */ 0x0402ce56, 0xfc020000, 0x40200d21, 0x00028030, 0x00010000, 0x01081202, 0x00000000, 0x00410003, } }, - { { /* 219 */ + { { /* 222 */ 0x00404080, 0x00000200, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x60000000, 0x480241ea, } }, - { { /* 220 */ + { { /* 223 */ 0x2000104c, 0x2109a820, 0x00200020, 0x7b1c0008, 0x10a0840a, 0x01c028c0, 0x00000608, 0x04c00000, } }, - { { /* 221 */ + { { /* 224 */ 0x80398412, 0x40a200e0, 0x02080000, 0x12030a04, 0x008d1833, 0x02184602, 0x13803028, 0x00200801, } }, - { { /* 222 */ + { { /* 225 */ 0x20440000, 0x000005a1, 0x00050800, 0x0020a328, 0x80100000, 0x10040649, 0x10020020, 0x00090180, } }, - { { /* 223 */ + { { /* 226 */ 0x8c008202, 0x00000000, 0x00205910, 0x0041410c, 0x00004004, 0x40441290, 0x00010080, 0x01040000, } }, - { { /* 224 */ + { { /* 227 */ 0x04070000, 0x89108040, 0x00282a81, 0x82420000, 0x51a20411, 0x32220800, 0x2b0d2220, 0x40c83003, } }, - { { /* 225 */ + { { /* 228 */ 0x82020082, 0x80008900, 0x10a00200, 0x08004100, 0x09041108, 0x000405a6, 0x0c018000, 0x04104002, } }, - { { /* 226 */ + { { /* 229 */ 0x00002000, 0x44003000, 0x01000004, 0x00008200, 0x00000008, 0x00044010, 0x00002002, 0x00001040, } }, - { { /* 227 */ + { { /* 230 */ 0x00000000, 0xca008000, 0x02828020, 0x00b1100c, 0x12824280, 0x22013030, 0x00808820, 0x040013e4, } }, - { { /* 228 */ + { { /* 231 */ 0x801840c0, 0x1000a1a1, 0x00000004, 0x0050c200, 0x00c20082, 0x00104840, 0x10400080, 0xa3140000, } }, - { { /* 229 */ + { { /* 232 */ 0xa8a02301, 0x24123d00, 0x80030200, 0xc0028022, 0x34a10000, 0x00408005, 0x00190010, 0x882a0000, } }, - { { /* 230 */ + { { /* 233 */ 0x00080018, 0x33000402, 0x9002010a, 0x00000000, 0x00800020, 0x00010100, 0x84040810, 0x04004000, } }, - { { /* 231 */ + { { /* 234 */ 0x10006020, 0x00000000, 0x00000000, 0x30a02000, 0x00000004, 0x00000000, 0x01000800, 0x20000000, } }, - { { /* 232 */ + { { /* 235 */ 0x02000000, 0x02000602, 0x80000800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 233 */ + { { /* 236 */ 0x00000010, 0x44040083, 0x00081000, 0x0818824c, 0x00400e00, 0x8c300000, 0x08146001, 0x00000000, } }, - { { /* 234 */ + { { /* 237 */ 0x00828000, 0x41900000, 0x84804006, 0x24010001, 0x02400108, 0x9b080006, 0x00201602, 0x0009012e, } }, - { { /* 235 */ + { { /* 238 */ 0x40800800, 0x48000420, 0x10000032, 0x01904440, 0x02000100, 0x10048000, 0x00020000, 0x08820802, } }, - { { /* 236 */ + { { /* 239 */ 0x08080ba0, 0x00009242, 0x00400000, 0xc0008080, 0x20410001, 0x04400000, 0x60020820, 0x00100000, } }, - { { /* 237 */ + { { /* 240 */ 0x00108046, 0x01001805, 0x90100000, 0x00014010, 0x00000010, 0x00000000, 0x0000000b, 0x00008800, } }, - { { /* 238 */ + { { /* 241 */ 0x00000000, 0x00001000, 0x00000000, 0x20018800, 0x00004600, 0x06002000, 0x00000100, 0x00000000, } }, - { { /* 239 */ + { { /* 242 */ 0x00000000, 0x10400042, 0x02004000, 0x00004280, 0x80000400, 0x00020000, 0x00000008, 0x00000020, } }, - { { /* 240 */ + { { /* 243 */ 0x00000040, 0x20600400, 0x0a000180, 0x02040280, 0x00000000, 0x00409001, 0x02000004, 0x00003200, } }, - { { /* 241 */ + { { /* 244 */ 0x88000000, 0x80404800, 0x00000010, 0x00040008, 0x00000a90, 0x00000200, 0x00002000, 0x40002001, } }, - { { /* 242 */ + { { /* 245 */ 0x00000048, 0x00100000, 0x00000000, 0x00000001, 0x00000008, 0x20010080, 0x00000000, 0x00400040, } }, - { { /* 243 */ + { { /* 246 */ 0x85000000, 0x0c8f0108, 0x32129000, 0x80090420, 0x00024000, 0x40040800, 0x092000a0, 0x00100204, } }, - { { /* 244 */ + { { /* 247 */ 0x00002000, 0x00000000, 0x00440004, 0x6c000000, 0x000000d0, 0x80004000, 0x88800440, 0x41144018, } }, - { { /* 245 */ + { { /* 248 */ 0x80001a02, 0x14000001, 0x00000001, 0x0000004a, 0x00000000, 0x00083000, 0x08000000, 0x0008a024, } }, - { { /* 246 */ + { { /* 249 */ 0x00300004, 0x00140000, 0x20000000, 0x00001800, 0x00020002, 0x04000000, 0x00000002, 0x00000100, } }, - { { /* 247 */ + { { /* 250 */ 0x00004002, 0x54000000, 0x60400300, 0x00002120, 0x0000a022, 0x00000000, 0x81060803, 0x08010200, } }, - { { /* 248 */ + { { /* 251 */ 0x04004800, 0xb0044000, 0x0000a005, 0x04500800, 0x800c000a, 0x0000c000, 0x10000800, 0x02408021, } }, - { { /* 249 */ + { { /* 252 */ 0x08020000, 0x00001040, 0x00540a40, 0x00000000, 0x00800880, 0x01020002, 0x00000211, 0x00000010, } }, - { { /* 250 */ + { { /* 253 */ 0x00000000, 0x80000002, 0x00002000, 0x00080001, 0x09840a00, 0x40000080, 0x00400000, 0x49000080, } }, - { { /* 251 */ + { { /* 254 */ 0x0e102831, 0x06098807, 0x40011014, 0x02620042, 0x06000000, 0x88062000, 0x04068400, 0x08108301, } }, - { { /* 252 */ + { { /* 255 */ 0x08000012, 0x40004840, 0x00300402, 0x00012000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 253 */ + { { /* 256 */ 0x00000000, 0x00400000, 0x00000000, 0x00a54400, 0x40004420, 0x20000310, 0x00041002, 0x18000000, } }, - { { /* 254 */ + { { /* 257 */ 0x00a1002a, 0x00080000, 0x40400000, 0x00900000, 0x21401200, 0x04048626, 0x40005048, 0x21100000, } }, - { { /* 255 */ + { { /* 258 */ 0x040005a4, 0x000a0000, 0x00214000, 0x07010800, 0x34000000, 0x00080100, 0x00080040, 0x10182508, } }, - { { /* 256 */ + { { /* 259 */ 0xc0805100, 0x02c01400, 0x00000080, 0x00448040, 0x20000800, 0x210a8000, 0x08800000, 0x00020060, } }, - { { /* 257 */ + { { /* 260 */ 0x00004004, 0x00400100, 0x01040200, 0x00800000, 0x00000000, 0x00000000, 0x10081400, 0x00008000, } }, - { { /* 258 */ + { { /* 261 */ 0x00004000, 0x20000000, 0x08800200, 0x00001000, 0x00000000, 0x01000000, 0x00000810, 0x00000000, } }, - { { /* 259 */ + { { /* 262 */ 0x00020000, 0x20200000, 0x00000000, 0x00000000, 0x00000010, 0x00001c40, 0x00002000, 0x08000210, } }, - { { /* 260 */ + { { /* 263 */ 0x00000000, 0x00000000, 0x54014000, 0x02000800, 0x00200400, 0x00000000, 0x00002080, 0x00004000, } }, - { { /* 261 */ + { { /* 264 */ 0x10000004, 0x00000000, 0x00000000, 0x00000000, 0x00002000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 262 */ + { { /* 265 */ 0x00000000, 0x00000000, 0x28881041, 0x0081010a, 0x00400800, 0x00000800, 0x10208026, 0x61000000, } }, - { { /* 263 */ + { { /* 266 */ 0x00050080, 0x00000000, 0x80000000, 0x80040000, 0x044088c2, 0x00080480, 0x00040000, 0x00000048, } }, - { { /* 264 */ + { { /* 267 */ 0x8188410d, 0x141a2400, 0x40310000, 0x000f4249, 0x41283280, 0x80053011, 0x00400880, 0x410060c0, } }, - { { /* 265 */ + { { /* 268 */ 0x2a004013, 0x02000002, 0x11000000, 0x00850040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 266 */ + { { /* 269 */ 0x00000000, 0x00800000, 0x04000440, 0x00000402, 0x60001000, 0x99909f87, 0x5808049d, 0x10002445, } }, - { { /* 267 */ + { { /* 270 */ 0x00000100, 0x00000000, 0x00000000, 0x00910050, 0x00000420, 0x00080008, 0x20000000, 0x00288002, } }, - { { /* 268 */ + { { /* 271 */ 0x00008400, 0x00000400, 0x00000000, 0x00100000, 0x00002000, 0x00000800, 0x80043400, 0x21000004, } }, - { { /* 269 */ + { { /* 272 */ 0x20000208, 0x01000600, 0x00000010, 0x00000000, 0x48000000, 0x14060008, 0x00124020, 0x20812800, } }, - { { /* 270 */ + { { /* 273 */ 0xa419804b, 0x01064009, 0x10386ca4, 0x85a0620b, 0x00000010, 0x01000448, 0x00004400, 0x20a02102, } }, - { { /* 271 */ + { { /* 274 */ 0x00000000, 0x00000000, 0x00147000, 0x01a01404, 0x10040000, 0x01000000, 0x3002f180, 0x00000008, } }, - { { /* 272 */ + { { /* 275 */ 0x00002000, 0x00100000, 0x08000010, 0x00020004, 0x01000029, 0x00002000, 0x00000000, 0x10082000, } }, - { { /* 273 */ + { { /* 276 */ 0x00000000, 0x0004d041, 0x08000800, 0x00200000, 0x00401000, 0x00004000, 0x00000000, 0x00000002, } }, - { { /* 274 */ + { { /* 277 */ 0x01000000, 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 275 */ + { { /* 278 */ 0x00000000, 0x00000000, 0x00000000, 0x00800000, 0x000a0a01, 0x0004002c, 0x01000080, 0x00000000, } }, - { { /* 276 */ + { { /* 279 */ 0x10000000, 0x08040400, 0x08012010, 0x2569043c, 0x1a10c460, 0x08800009, 0x000210f0, 0x08c5050c, } }, - { { /* 277 */ + { { /* 280 */ 0x10000481, 0x00040080, 0x42040000, 0x00100204, 0x00000000, 0x00000000, 0x00080000, 0x88080000, } }, - { { /* 278 */ + { { /* 281 */ 0x010f016c, 0x18002000, 0x41307000, 0x00000080, 0x00000000, 0x00000100, 0x88000000, 0x70048004, } }, - { { /* 279 */ + { { /* 282 */ 0x00081420, 0x00000100, 0x00000000, 0x00000000, 0x02400000, 0x00001000, 0x00050070, 0x00000000, } }, - { { /* 280 */ + { { /* 283 */ 0x000c4000, 0x00010000, 0x04000000, 0x00000000, 0x00000000, 0x01000100, 0x01000010, 0x00000400, } }, - { { /* 281 */ + { { /* 284 */ 0x00000000, 0x10020000, 0x04100024, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0x00000100, } }, - { { /* 282 */ + { { /* 285 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00100020, } }, - { { /* 283 */ + { { /* 286 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00008000, 0x00100000, 0x00000000, 0x00000000, } }, - { { /* 284 */ + { { /* 287 */ 0x00000000, 0x00000000, 0x00000000, 0x80000000, 0x00880000, 0x0c000040, 0x02040010, 0x00000000, } }, - { { /* 285 */ + { { /* 288 */ 0x00080000, 0x08000000, 0x00000000, 0x00000004, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 286 */ + { { /* 289 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00000300, 0x00000300, } }, - { { /* 287 */ + { { /* 290 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffff0000, 0x0001ffff, } }, - { { /* 288 */ + { { /* 291 */ 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, 0x0c0c0000, 0x000cc00c, 0x03000000, 0x00000000, } }, - { { /* 289 */ + { { /* 292 */ 0x00000000, 0x00000300, 0x00000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 290 */ + { { /* 293 */ 0xffff0000, 0xffffffff, 0x0040ffff, 0x00000000, 0x0c0c0000, 0x0c00000c, 0x03000000, 0x00000300, } }, - { { /* 291 */ + { { /* 294 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x0d10646e, 0x0d10646e, } }, - { { /* 292 */ + { { /* 295 */ 0x00000000, 0x01000300, 0x00000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 293 */ + { { /* 296 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x9fffffff, 0xffcffee7, 0x0000003f, 0x00000000, } }, - { { /* 294 */ + { { /* 297 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfffddfec, 0xc3effdff, 0x40603ddf, 0x00000003, } }, - { { /* 295 */ + { { /* 298 */ 0x00000000, 0xfffe0000, 0xffffffff, 0xffffffef, 0x00007fff, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 296 */ + { { /* 299 */ 0x3eff0793, 0x1303b011, 0x11102801, 0x05930000, 0xb0111e7b, 0x3b019703, 0x00a01112, 0x306b9593, } }, - { { /* 297 */ + { { /* 300 */ 0x1102b051, 0x11303201, 0x011102b0, 0xb879300a, 0x30011306, 0x00800010, 0x100b0113, 0x93000011, } }, - { { /* 298 */ + { { /* 301 */ 0x00102b03, 0x05930000, 0xb051746b, 0x3b011323, 0x00001030, 0x70000000, 0x1303b011, 0x11102900, } }, - { { /* 299 */ + { { /* 302 */ 0x00012180, 0xb0153000, 0x3001030e, 0x02000030, 0x10230111, 0x13000000, 0x10106b81, 0x01130300, } }, - { { /* 300 */ + { { /* 303 */ 0x30111013, 0x00000100, 0x22b85530, 0x30000000, 0x9702b011, 0x113afb07, 0x011303b0, 0x00000021, } }, - { { /* 301 */ + { { /* 304 */ 0x3b0d1b00, 0x03b01138, 0x11330113, 0x13000001, 0x111c2b05, 0x00000100, 0xb0111000, 0x2a011300, } }, - { { /* 302 */ + { { /* 305 */ 0x02b01930, 0x10100001, 0x11000000, 0x10300301, 0x07130230, 0x0011146b, 0x2b051300, 0x8fb8f974, } }, - { { /* 303 */ + { { /* 306 */ 0x103b0113, 0x00000000, 0xd9700000, 0x01134ab0, 0x0011103b, 0x00001103, 0x2ab15930, 0x10000111, } }, - { { /* 304 */ + { { /* 307 */ 0x11010000, 0x00100b01, 0x01130000, 0x0000102b, 0x20000101, 0x02a01110, 0x30210111, 0x0102b059, } }, - { { /* 305 */ + { { /* 308 */ 0x19300000, 0x011307b0, 0xb011383b, 0x00000003, 0x00000000, 0x383b0d13, 0x0103b011, 0x00001000, } }, - { { /* 306 */ + { { /* 309 */ 0x01130000, 0x00101020, 0x00000100, 0x00000110, 0x30000000, 0x00021811, 0x00100000, 0x01110000, } }, - { { /* 307 */ + { { /* 310 */ 0x00000023, 0x0b019300, 0x00301110, 0x302b0111, 0x13c7b011, 0x01303b01, 0x00000280, 0xb0113000, } }, - { { /* 308 */ + { { /* 311 */ 0x2b011383, 0x03b01130, 0x300a0011, 0x1102b011, 0x00002000, 0x01110100, 0xa011102b, 0x2b011302, } }, - { { /* 309 */ + { { /* 312 */ 0x01000010, 0x30000001, 0x13029011, 0x11302b01, 0x000066b0, 0xb0113000, 0x6b07d302, 0x07b0113a, } }, - { { /* 310 */ + { { /* 313 */ 0x00200103, 0x13000000, 0x11386b05, 0x011303b0, 0x000010b8, 0x2b051b00, 0x03000110, 0x10000000, } }, - { { /* 311 */ + { { /* 314 */ 0x1102a011, 0x79700a01, 0x0111a2b0, 0x0000100a, 0x00011100, 0x00901110, 0x00090111, 0x93000000, } }, - { { /* 312 */ + { { /* 315 */ 0xf9f2bb05, 0x011322b0, 0x2001323b, 0x00000000, 0x06b05930, 0x303b0193, 0x1123a011, 0x11700000, } }, - { { /* 313 */ + { { /* 316 */ 0x001102b0, 0x00001010, 0x03011301, 0x00000110, 0x162b0793, 0x01010010, 0x11300000, 0x01110200, } }, - { { /* 314 */ + { { /* 317 */ 0xb0113029, 0x00000000, 0x0eb05130, 0x383b0513, 0x0303b011, 0x00000100, 0x01930000, 0x00001039, } }, - { { /* 315 */ + { { /* 318 */ 0x3b000302, 0x00000000, 0x00230113, 0x00000000, 0x00100000, 0x00010000, 0x90113020, 0x00000002, } }, - { { /* 316 */ + { { /* 319 */ 0x00000000, 0x10000000, 0x11020000, 0x00000301, 0x01130000, 0xb079b02b, 0x3b011323, 0x02b01130, } }, - { { /* 317 */ + { { /* 320 */ 0xf0210111, 0x1343b0d9, 0x11303b01, 0x011103b0, 0xb0517020, 0x20011322, 0x01901110, 0x300b0111, } }, - { { /* 318 */ + { { /* 321 */ 0x9302b011, 0x0016ab01, 0x01130100, 0xb0113021, 0x29010302, 0x02b03130, 0x30000000, 0x1b42b819, } }, - { { /* 319 */ + { { /* 322 */ 0x11383301, 0x00000330, 0x00000020, 0x33051300, 0x00001110, 0x00000000, 0x93000000, 0x01302305, } }, - { { /* 320 */ + { { /* 323 */ 0x00010100, 0x30111010, 0x00000100, 0x02301130, 0x10100001, 0x11000000, 0x00000000, 0x85130200, } }, - { { /* 321 */ + { { /* 324 */ 0x10111003, 0x2b011300, 0x63b87730, 0x303b0113, 0x11a2b091, 0x7b300201, 0x011357f0, 0xf0d1702b, } }, - { { /* 322 */ + { { /* 325 */ 0x1b0111e3, 0x0ab97130, 0x303b0113, 0x13029001, 0x11302b01, 0x071302b0, 0x3011302b, 0x23011303, } }, - { { /* 323 */ + { { /* 326 */ 0x02b01130, 0x30ab0113, 0x11feb411, 0x71300901, 0x05d347b8, 0xb011307b, 0x21015303, 0x00001110, } }, - { { /* 324 */ + { { /* 327 */ 0x306b0513, 0x1102b011, 0x00103301, 0x05130000, 0xa01038eb, 0x30000102, 0x02b01110, 0x30200013, } }, - { { /* 325 */ + { { /* 328 */ 0x0102b071, 0x00101000, 0x01130000, 0x1011100b, 0x2b011300, 0x00000000, 0x366b0593, 0x1303b095, } }, - { { /* 326 */ + { { /* 329 */ 0x01103b01, 0x00000200, 0xb0113000, 0x20000103, 0x01000010, 0x30000000, 0x030ab011, 0x00101001, } }, - { { /* 327 */ + { { /* 330 */ 0x01110100, 0x00000003, 0x23011302, 0x03000010, 0x10000000, 0x01000000, 0x00100000, 0x00000290, } }, - { { /* 328 */ + { { /* 331 */ 0x30113000, 0x7b015386, 0x03b01130, 0x00210151, 0x13000000, 0x11303b01, 0x001102b0, 0x00011010, } }, - { { /* 329 */ + { { /* 332 */ 0x2b011302, 0x02001110, 0x10000000, 0x0102b011, 0x11300100, 0x000102b0, 0x00011010, 0x2b011100, } }, - { { /* 330 */ + { { /* 333 */ 0x02101110, 0x002b0113, 0x93000000, 0x11302b03, 0x011302b0, 0x0000303b, 0x00000002, 0x03b01930, } }, - { { /* 331 */ + { { /* 334 */ 0x102b0113, 0x0103b011, 0x11300000, 0x011302b0, 0x00001021, 0x00010102, 0x00000010, 0x102b0113, } }, - { { /* 332 */ + { { /* 335 */ 0x01020011, 0x11302000, 0x011102b0, 0x30113001, 0x00000002, 0x02b01130, 0x303b0313, 0x0103b011, } }, - { { /* 333 */ + { { /* 336 */ 0x00002000, 0x05130000, 0xb011303b, 0x10001102, 0x00000110, 0x142b0113, 0x01000001, 0x01100000, } }, - { { /* 334 */ + { { /* 337 */ 0x00010280, 0xb0113000, 0x10000102, 0x00000010, 0x10230113, 0x93021011, 0x11100b05, 0x01130030, } }, - { { /* 335 */ + { { /* 338 */ 0xb051702b, 0x3b011323, 0x00000030, 0x30000000, 0x1303b011, 0x11102b01, 0x01010330, 0xb011300a, } }, - { { /* 336 */ + { { /* 339 */ 0x20000102, 0x00000000, 0x10000011, 0x9300a011, 0x00102b05, 0x00000200, 0x90111000, 0x29011100, } }, - { { /* 337 */ + { { /* 340 */ 0x00b01110, 0x30000000, 0x1302b011, 0x11302b21, 0x000103b0, 0x00000020, 0x2b051300, 0x02b01130, } }, - { { /* 338 */ + { { /* 341 */ 0x103b0113, 0x13002011, 0x11322b21, 0x00130280, 0xa0113028, 0x0a011102, 0x02921130, 0x30210111, } }, - { { /* 339 */ + { { /* 342 */ 0x13020011, 0x11302b01, 0x03d30290, 0x3011122b, 0x2b011302, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 340 */ + { { /* 343 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0x20000000, 0x00000000, } }, - { { /* 341 */ + { { /* 344 */ 0x00000000, 0x00000000, 0x00003000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 342 */ + { { /* 345 */ 0x00000000, 0x040001df, 0x80800176, 0x420c0000, 0x01020140, 0x44008200, 0x00041018, 0x00000000, } }, - { { /* 343 */ + { { /* 346 */ 0xffff0000, 0xffff27bf, 0x000027bf, 0x00000000, 0x00000000, 0x0c000000, 0x03000000, 0x000000c0, } }, - { { /* 344 */ + { { /* 347 */ 0x3c000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 345 */ + { { /* 348 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x08004480, 0x08004480, } }, - { { /* 346 */ - 0x00000000, 0x00000000, 0xc0000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, - { { /* 347 */ - 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, - { { /* 348 */ - 0xffff0042, 0xffffffff, 0x0042ffff, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x000000c0, - } }, { { /* 349 */ - 0x00000000, 0x000c0000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0xc0000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 350 */ 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, - 0x00000000, 0x0000c00c, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 351 */ + 0xffff0042, 0xffffffff, 0x0042ffff, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x000000c0, + } }, + { { /* 352 */ + 0x00000000, 0x000c0000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 353 */ + 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, + 0x00000000, 0x0000c00c, 0x00000000, 0x00000000, + } }, + { { /* 354 */ 0x000c0003, 0x00003c00, 0x0000f000, 0x00003c00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 352 */ + { { /* 355 */ 0x00000000, 0x040001de, 0x00000176, 0x42000000, 0x01020140, 0x44008200, 0x00041008, 0x00000000, } }, - { { /* 353 */ + { { /* 356 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x98504f14, 0x18504f14, } }, - { { /* 354 */ + { { /* 357 */ 0x00000000, 0x00000000, 0x00000c00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 355 */ + { { /* 358 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00480910, 0x00480910, } }, - { { /* 356 */ + { { /* 359 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x060cb301, 0x060eb3d5, } }, - { { /* 357 */ + { { /* 360 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x0c186606, 0x0c186606, } }, - { { /* 358 */ + { { /* 361 */ 0x0c000000, 0x00000000, 0x00000000, 0x00000000, 0x00010040, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 359 */ + { { /* 362 */ 0x00001006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 360 */ + { { /* 363 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfef02596, 0x3bffecae, 0x30003f5f, 0x00000000, } }, - { { /* 361 */ + { { /* 364 */ 0x03c03030, 0x0000c000, 0x00000000, 0x600c0c03, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 362 */ - 0x000c3003, 0x18c00c0c, 0x00c03060, 0x60000c03, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, - { { /* 363 */ - 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x00100002, 0x00100002, - } }, - { { /* 364 */ - 0x00000003, 0x18000000, 0x00003060, 0x00000c00, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, { { /* 365 */ - 0x00000000, 0x00300000, 0x00000000, 0x00000000, + 0x000c3003, 0x18c00c0c, 0x00c03060, 0x60000c03, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 366 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x140a2202, 0x142a220a, + 0x00000000, 0x00000000, 0x00100002, 0x00100002, } }, { { /* 367 */ + 0x00000003, 0x18000000, 0x00003060, 0x00000c00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x20000000, 0x00000000, 0x00000000, } }, { { /* 368 */ - 0xfdffb729, 0x000001ff, 0xb7290000, 0x00000000, + 0x00000000, 0x00300000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 369 */ + 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, + 0x00000000, 0x00000000, 0x140a2202, 0x142a220a, + } }, + { { /* 370 */ + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x20000000, 0x00000000, 0x00000000, + } }, + { { /* 371 */ + 0xfdffb729, 0x000001ff, 0xb7290000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 372 */ 0xfffddfec, 0xc3fffdff, 0x00803dcf, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 370 */ + { { /* 373 */ 0x00000000, 0xffffffff, 0xffffffff, 0x00ffffff, 0xffffffff, 0x000003ff, 0x00000000, 0x00000000, } }, - { { /* 371 */ + { { /* 374 */ 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, 0x00000000, 0x0000c000, 0x00000000, 0x00000300, } }, - { { /* 372 */ + { { /* 375 */ 0x00000000, 0x00000000, 0x00000000, 0x00000010, 0xfff99fee, 0xf3c5fdff, 0xb000798f, 0x0002ffc0, } }, - { { /* 373 */ + { { /* 376 */ 0xffffffff, 0x0007f6fb, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 374 */ + { { /* 377 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00004004, 0x00004004, } }, - { { /* 375 */ - 0x0f000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, - { { /* 376 */ - 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x02045101, 0x02045101, - } }, - { { /* 377 */ - 0x00000c00, 0x000000c3, 0x00000000, 0x18000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, { { /* 378 */ - 0x00000000, 0x00000000, 0x00000000, 0x00000300, + 0x0f000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 379 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x011c0661, 0x011c0661, + 0x00000000, 0x00000000, 0x02045101, 0x02045101, } }, { { /* 380 */ - 0xfff98fee, 0xc3e5fdff, 0x0001398f, 0x0001fff0, + 0x00000c00, 0x000000c3, 0x00000000, 0x18000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 381 */ - 0x00000002, 0x00000000, 0x00002000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 382 */ + 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, + 0x00000000, 0x00000000, 0x011c0661, 0x011c0661, + } }, + { { /* 383 */ + 0xfff98fee, 0xc3e5fdff, 0x0001398f, 0x0001fff0, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 384 */ + 0x00000002, 0x00000000, 0x00002000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 385 */ 0x00080002, 0x00000800, 0x00002000, 0x00000800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 383 */ + { { /* 386 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x1c58af16, 0x1c58af16, } }, - { { /* 384 */ + { { /* 387 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x115c0671, 0x115c0671, } }, - { { /* 385 */ + { { /* 388 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x07ffffff, } }, - { { /* 386 */ + { { /* 389 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00100400, 0x00100400, } }, - { { /* 387 */ + { { /* 390 */ 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 388 */ + { { /* 391 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00082202, 0x00082202, } }, - { { /* 389 */ + { { /* 392 */ 0x03000030, 0x0000c000, 0x00000006, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000c00, } }, - { { /* 390 */ + { { /* 393 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, } }, - { { /* 391 */ + { { /* 394 */ 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 392 */ + { { /* 395 */ 0x00000000, 0x00000000, 0x00000000, 0x00300000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 393 */ + { { /* 396 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x040c2383, 0x040c2383, } }, - { { /* 394 */ + { { /* 397 */ 0xfff99fee, 0xf3cdfdff, 0xb0c0398f, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 395 */ + { { /* 398 */ 0x00000000, 0x07ffffc6, 0x000001fe, 0x40000000, 0x01000040, 0x0000a000, 0x00001000, 0x00000000, } }, - { { /* 396 */ + { { /* 399 */ 0xfff987e0, 0xd36dfdff, 0x1e003987, 0x001f0000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 397 */ + { { /* 400 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x160e2302, 0x160e2302, } }, - { { /* 398 */ + { { /* 401 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00020000, 0x00020000, } }, - { { /* 399 */ + { { /* 402 */ 0x030000f0, 0x00000000, 0x0c00001e, 0x1e000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 400 */ + { { /* 403 */ 0x00000000, 0x07ffffde, 0x000005f6, 0x50000000, 0x05480262, 0x10000a00, 0x00013000, 0x00000000, } }, - { { /* 401 */ + { { /* 404 */ 0x00000000, 0x07ffffde, 0x000005f6, 0x50000000, 0x05480262, 0x10000a00, 0x00052000, 0x00000000, } }, - { { /* 402 */ + { { /* 405 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x143c278f, 0x143c278f, } }, - { { /* 403 */ + { { /* 406 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000, } }, - { { /* 404 */ + { { /* 407 */ 0x00002000, 0x00000000, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000080, } }, - { { /* 405 */ + { { /* 408 */ 0x00002000, 0x00000020, 0x08000000, 0x00002008, 0x00080000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 406 */ + { { /* 409 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x02045301, 0x02045301, } }, - { { /* 407 */ + { { /* 410 */ 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, 0x00300000, 0x0c00c030, 0x03000000, 0x00000000, } }, - { { /* 408 */ + { { /* 411 */ 0xfff987ee, 0xf325fdff, 0x00013987, 0x0001fff0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 409 */ + { { /* 412 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x02041101, 0x02041101, } }, - { { /* 410 */ + { { /* 413 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00800000, 0x00000000, 0x00000000, } }, - { { /* 411 */ + { { /* 414 */ 0x30000000, 0x00000000, 0x00000000, 0x00000000, 0x00040000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 412 */ + { { /* 415 */ 0x00000000, 0x07fffdd6, 0x000005f6, 0xec000000, 0x0200b4d9, 0x480a8640, 0x00000000, 0x00000000, } }, - { { /* 413 */ + { { /* 416 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00000002, 0x00000002, } }, - { { /* 414 */ + { { /* 417 */ 0x00033000, 0x00000000, 0x00000c00, 0x600000c3, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 415 */ + { { /* 418 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x1850cc14, 0x1850cc14, } }, - { { /* 416 */ + { { /* 419 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00000000, 0x00200000, } }, - { { /* 417 */ + { { /* 420 */ 0x03c83032, 0x0000c800, 0x00002000, 0x600c0c03, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 418 */ - 0x00000010, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, - { { /* 419 */ - 0xffff8f04, 0xffffffff, 0x8f04ffff, 0x00000000, - 0x030c0000, 0x0c00cc0f, 0x03000000, 0x00000300, - } }, - { { /* 420 */ - 0x00000000, 0x00800000, 0x03bffbaa, 0x03bffbaa, - 0x00000000, 0x00000000, 0x00002202, 0x00002202, - } }, { { /* 421 */ - 0x00080000, 0x00000000, 0x00000000, 0x00000000, + 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 422 */ + 0xffff8f04, 0xffffffff, 0x8f04ffff, 0x00000000, + 0x030c0000, 0x0c00cc0f, 0x03000000, 0x00000300, + } }, + { { /* 423 */ + 0x00000000, 0x00800000, 0x03bffbaa, 0x03bffbaa, + 0x00000000, 0x00000000, 0x00002202, 0x00002202, + } }, + { { /* 424 */ + 0x00080000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 425 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xfc7e3fec, 0x2ffbffbf, 0x7f5f847f, 0x00040000, } }, - { { /* 423 */ + { { /* 426 */ 0xff7fff7f, 0xff01ff7f, 0x3d7f3d7f, 0xffff7fff, 0xffff3d7f, 0x003d7fff, 0xff7f7f3d, 0x00ff7fff, } }, - { { /* 424 */ + { { /* 427 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x24182212, 0x24182212, } }, - { { /* 425 */ + { { /* 428 */ 0x0000f000, 0x66000000, 0x00300180, 0x60000033, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 426 */ + { { /* 429 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00408030, 0x00408030, } }, - { { /* 427 */ + { { /* 430 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00020032, 0x00020032, } }, - { { /* 428 */ + { { /* 431 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00000016, 0x00000016, } }, - { { /* 429 */ - 0x00033000, 0x00000000, 0x00000c00, 0x60000003, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, - { { /* 430 */ - 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x00200034, 0x00200034, - } }, - { { /* 431 */ - 0x00033000, 0x00000000, 0x00000c00, 0x60000003, - 0x00000000, 0x00800000, 0x00000000, 0x0000c3f0, - } }, { { /* 432 */ + 0x00033000, 0x00000000, 0x00000c00, 0x60000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00040000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 433 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, - 0x00000000, 0x00000000, 0x00000880, 0x00000880, + 0x00000000, 0x00000000, 0x00200034, 0x00200034, } }, { { /* 434 */ + 0x00033000, 0x00000000, 0x00000c00, 0x60000003, + 0x00000000, 0x00800000, 0x00000000, 0x0000c3f0, + } }, + { { /* 435 */ + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00040000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 436 */ + 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, + 0x00000000, 0x00000000, 0x00000880, 0x00000880, + } }, + { { /* 437 */ 0xfdff8f04, 0xfdff01ff, 0x8f0401ff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 435 */ + { { /* 438 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x10400a33, 0x10400a33, } }, - { { /* 436 */ + { { /* 439 */ 0xffff0000, 0xffff1fff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 437 */ + { { /* 440 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00380008, 0x00080000, } }, - { { /* 438 */ + { { /* 441 */ 0x030000f0, 0x00000000, 0x0c00501e, 0x1e004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 439 */ + { { /* 442 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xd63dc7e8, 0xc3bfc718, 0x00803dc7, 0x00000000, } }, - { { /* 440 */ + { { /* 443 */ 0xfffddfee, 0xc3effdff, 0x00603ddf, 0x00000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 441 */ + { { /* 444 */ 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, 0x0c0c0000, 0x00cc0000, 0x00000000, 0x0000c00c, } }, - { { /* 442 */ + { { /* 445 */ 0xfffffffe, 0x87ffffff, 0x00007fff, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 443 */ + { { /* 446 */ 0xff7fff7f, 0xff01ff00, 0x00003d7f, 0xffff7fff, 0x00ff0000, 0x003d7f7f, 0xff7f7f00, 0x00ff7f00, } }, - { { /* 444 */ + { { /* 447 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x30400090, 0x30400090, } }, - { { /* 445 */ + { { /* 448 */ 0x00000000, 0x00000000, 0xc0000180, 0x60000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 446 */ + { { /* 449 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x18404084, 0x18404084, } }, - { { /* 447 */ + { { /* 450 */ 0xffff0002, 0xffffffff, 0x0002ffff, 0x00000000, 0x00c00000, 0x0c00c00c, 0x03000000, 0x00000000, } }, - { { /* 448 */ + { { /* 451 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00008000, 0x00008000, } }, - { { /* 449 */ + { { /* 452 */ 0x00000000, 0x041ed5c0, 0x0000077e, 0x40000000, 0x01000040, 0x4000a000, 0x002109c0, 0x00000000, } }, - { { /* 450 */ + { { /* 453 */ 0xffff00d0, 0xffffffff, 0x00d0ffff, 0x00000000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 451 */ + { { /* 454 */ 0x00000000, 0xffffff7b, 0x7fffffff, 0x7ffffffe, 0x00000000, 0x80e310fe, 0x00800000, 0x00800000, } }, - { { /* 452 */ + { { /* 455 */ 0x00000000, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 453 */ + { { /* 456 */ 0x00001500, 0x01000000, 0x00000000, 0x00000000, 0xfffe0000, 0xfffe03db, 0x006003fb, 0x00030000, } }, - { { /* 454 */ + { { /* 457 */ 0x00400000, 0x00000047, 0x00800010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, } }, - { { /* 455 */ + { { /* 458 */ 0x3f2fc004, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 456 */ + { { /* 459 */ 0xe3ffbfff, 0xfff007ff, 0x00000001, 0x00000000, 0xfffff000, 0x0000003f, 0x0000e10f, 0x00000000, } }, - { { /* 457 */ + { { /* 460 */ 0x00000f00, 0x0000000c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 458 */ + { { /* 461 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000003, 0x00000000, 0x00000000, } }, - { { /* 459 */ + { { /* 462 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000003c0, } }, - { { /* 460 */ + { { /* 463 */ 0xffffffff, 0xffffffff, 0xffdfffff, 0xffffffff, 0xdfffffff, 0x00001e64, 0x00000000, 0x00000000, } }, - { { /* 461 */ + { { /* 464 */ 0x00000000, 0x78000000, 0x0001fc5f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 462 */ + { { /* 465 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000030, 0x00000000, 0x00000000, } }, - { { /* 463 */ + { { /* 466 */ 0x0c000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00091e00, } }, - { { /* 464 */ + { { /* 467 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x60000000, } }, - { { /* 465 */ + { { /* 468 */ 0x00300000, 0x00000000, 0x000fff00, 0x80000000, 0x00080000, 0x60000c02, 0x00104030, 0x242c0400, } }, - { { /* 466 */ + { { /* 469 */ 0x00000c20, 0x00000100, 0x00b85000, 0x00000000, 0x00e00000, 0x80010000, 0x00000000, 0x00000000, } }, - { { /* 467 */ + { { /* 470 */ 0x18000000, 0x00000000, 0x00210000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 468 */ + { { /* 471 */ 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00008000, 0x00000000, } }, - { { /* 469 */ + { { /* 472 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x07fe4000, 0x00000000, 0x00000000, 0xffffffc0, } }, - { { /* 470 */ + { { /* 473 */ 0x04000002, 0x077c8000, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 471 */ + { { /* 474 */ 0xffffffff, 0xffbf0001, 0xffffffff, 0x1fffffff, 0x000fffff, 0xffffffff, 0x000007df, 0x0001ffff, } }, - { { /* 472 */ + { { /* 475 */ 0x00000000, 0x00000000, 0xfffffffd, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0x1effffff, } }, - { { /* 473 */ + { { /* 476 */ 0xffffffff, 0x3fffffff, 0xffff0000, 0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0xf8000000, } }, - { { /* 474 */ + { { /* 477 */ 0x755dfffe, 0xffef2f3f, 0x0000ffe1, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 475 */ + { { /* 478 */ 0x000c0000, 0x30000000, 0x00000c30, 0x00030000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 476 */ + { { /* 479 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x263c370f, 0x263c370f, } }, - { { /* 477 */ + { { /* 480 */ 0x0003000c, 0x00000300, 0x00000000, 0x00000300, 0x00000000, 0x00018003, 0x00000000, 0x00000000, } }, - { { /* 478 */ + { { /* 481 */ 0x0800024f, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 479 */ + { { /* 482 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0xffffffff, 0x03ffffff, } }, - { { /* 480 */ + { { /* 483 */ 0x00000000, 0x00000000, 0x077dfffe, 0x077dfffe, 0x00000000, 0x00000000, 0x10400010, 0x10400010, } }, - { { /* 481 */ + { { /* 484 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x10400010, 0x10400010, } }, - { { /* 482 */ + { { /* 485 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x081047a4, 0x081047a4, } }, - { { /* 483 */ + { { /* 486 */ 0x0c0030c0, 0x00000000, 0x0f30001e, 0x66000003, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 484 */ + { { /* 487 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x000a0a09, 0x000a0a09, } }, - { { /* 485 */ + { { /* 488 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x00400810, 0x00400810, } }, - { { /* 486 */ + { { /* 489 */ 0x00000000, 0x00000000, 0x07fffffe, 0x07fffffe, 0x00000000, 0x00000000, 0x0e3c770f, 0x0e3c770f, } }, - { { /* 487 */ + { { /* 490 */ 0x0c000000, 0x00000300, 0x00000018, 0x00000300, 0x00000000, 0x00000000, 0x001fe000, 0x03000000, } }, - { { /* 488 */ + { { /* 491 */ 0x0000100f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 489 */ + { { /* 492 */ 0x00000000, 0xc0000000, 0x00000000, 0x0000000c, 0x00000000, 0x33000000, 0x00003000, 0x00000000, } }, - { { /* 490 */ + { { /* 493 */ 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 491 */ + { { /* 494 */ 0x00000000, 0x00000000, 0x00001000, 0x64080010, 0x00480000, 0x10000020, 0x80000102, 0x08000010, } }, - { { /* 492 */ + { { /* 495 */ 0x00000040, 0x40000000, 0x00020000, 0x01852002, 0x00800010, 0x80002022, 0x084444a2, 0x480e0000, } }, - { { /* 493 */ + { { /* 496 */ 0x04000200, 0x02202008, 0x80004380, 0x04000000, 0x00000002, 0x12231420, 0x2058003a, 0x00200060, } }, - { { /* 494 */ + { { /* 497 */ 0x10002508, 0x040d0028, 0x00000009, 0x00008004, 0x00800000, 0x42000001, 0x00000000, 0x09040000, } }, - { { /* 495 */ + { { /* 498 */ 0x02008000, 0x01402001, 0x00000000, 0x00000008, 0x00000000, 0x00000001, 0x00021008, 0x04000000, } }, - { { /* 496 */ + { { /* 499 */ 0x00100100, 0x80040080, 0x00002000, 0x00000008, 0x08040601, 0x01000012, 0x10000000, 0x49001024, } }, - { { /* 497 */ + { { /* 500 */ 0x0180004a, 0x00100600, 0x50840800, 0x000000c0, 0x00800000, 0x20000800, 0x40000000, 0x08050000, } }, - { { /* 498 */ + { { /* 501 */ 0x02004000, 0x02000804, 0x01000004, 0x18060001, 0x02400001, 0x40000002, 0x20800014, 0x000c1000, } }, - { { /* 499 */ + { { /* 502 */ 0x00222000, 0x00000000, 0x00100000, 0x00000000, 0x00000000, 0x00000000, 0x10422800, 0x00000800, } }, - { { /* 500 */ + { { /* 503 */ 0x20080000, 0x00040000, 0x80025040, 0x20208604, 0x00028020, 0x80102020, 0x080820c0, 0x10880800, } }, - { { /* 501 */ + { { /* 504 */ 0x00000000, 0x00000000, 0x00200109, 0x00100000, 0x00000000, 0x81022700, 0x40c21404, 0x84010882, } }, - { { /* 502 */ + { { /* 505 */ 0x00004010, 0x00000000, 0x03000000, 0x00000008, 0x00080000, 0x00000000, 0x10800001, 0x06002020, } }, - { { /* 503 */ + { { /* 506 */ 0x00000010, 0x02000000, 0x00880020, 0x00008424, 0x00000000, 0x88000000, 0x81000100, 0x04000000, } }, - { { /* 504 */ + { { /* 507 */ 0x00004218, 0x00040000, 0x00000000, 0x80005080, 0x00010000, 0x00040000, 0x08008000, 0x02008000, } }, - { { /* 505 */ + { { /* 508 */ 0x00020000, 0x00000000, 0x00000001, 0x04000401, 0x00100000, 0x12200004, 0x00000000, 0x18100000, } }, - { { /* 506 */ + { { /* 509 */ 0x00000000, 0x00000800, 0x00000000, 0x00004000, 0x00800000, 0x04000000, 0x82000002, 0x00042000, } }, - { { /* 507 */ + { { /* 510 */ 0x00080006, 0x00000000, 0x00000000, 0x04000000, 0x80008000, 0x00810001, 0xa0000000, 0x00100410, } }, - { { /* 508 */ + { { /* 511 */ 0x00400218, 0x88084080, 0x00260008, 0x00800404, 0x00000020, 0x00000000, 0x00000000, 0x00000200, } }, - { { /* 509 */ + { { /* 512 */ 0x00a08048, 0x00000000, 0x08000000, 0x04000000, 0x00000000, 0x00000000, 0x00018000, 0x00200000, } }, - { { /* 510 */ + { { /* 513 */ 0x01000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00200000, 0x00102000, } }, - { { /* 511 */ + { { /* 514 */ 0x00000801, 0x00000000, 0x00000000, 0x00020000, 0x08000000, 0x00002000, 0x20010000, 0x04002000, } }, - { { /* 512 */ + { { /* 515 */ 0x40000040, 0x50202400, 0x000a0020, 0x00040420, 0x00000200, 0x00000080, 0x80000000, 0x00000020, } }, - { { /* 513 */ + { { /* 516 */ 0x20008000, 0x00200010, 0x00000000, 0x00000000, 0x00400000, 0x01100000, 0x00020000, 0x80000010, } }, - { { /* 514 */ + { { /* 517 */ 0x02000000, 0x00801000, 0x00000000, 0x48058000, 0x20c94000, 0x60000000, 0x00000001, 0x00000000, } }, - { { /* 515 */ + { { /* 518 */ 0x00004090, 0x48000000, 0x08000000, 0x28802000, 0x00000002, 0x00014000, 0x00002000, 0x00002002, } }, - { { /* 516 */ + { { /* 519 */ 0x00010200, 0x00100000, 0x00000000, 0x00800000, 0x10020000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 517 */ + { { /* 520 */ 0x00000010, 0x00000402, 0x0c000000, 0x01000400, 0x01000021, 0x00000000, 0x00004000, 0x00004000, } }, - { { /* 518 */ + { { /* 521 */ 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000020, } }, - { { /* 519 */ + { { /* 522 */ 0x00000100, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00002000, 0x00000000, } }, - { { /* 520 */ + { { /* 523 */ 0x00006000, 0x00000000, 0x00000000, 0x00000400, 0x04000040, 0x003c0180, 0x00000200, 0x00102000, } }, - { { /* 521 */ + { { /* 524 */ 0x00000800, 0x101000c0, 0x00800000, 0x00000000, 0x00008000, 0x02200000, 0x00020020, 0x00000000, } }, - { { /* 522 */ + { { /* 525 */ 0x00000000, 0x01000000, 0x00000000, 0x20100000, 0x00080000, 0x00000141, 0x02001002, 0x40400001, } }, - { { /* 523 */ + { { /* 526 */ 0x00580000, 0x00000002, 0x00003000, 0x00002400, 0x00988000, 0x00040010, 0x00002800, 0x00000008, } }, - { { /* 524 */ + { { /* 527 */ 0x40080004, 0x00000020, 0x20080000, 0x02060a00, 0x00010040, 0x14010200, 0x40800000, 0x08031000, } }, - { { /* 525 */ + { { /* 528 */ 0x40020020, 0x0000202c, 0x2014a008, 0x00000000, 0x80040200, 0x82020012, 0x00400000, 0x20000000, } }, - { { /* 526 */ + { { /* 529 */ 0x00000000, 0x00000000, 0x00000004, 0x04000000, 0x00000000, 0x00000000, 0x40800100, 0x00000000, } }, - { { /* 527 */ + { { /* 530 */ 0x00000008, 0x04000040, 0x00000001, 0x000c0200, 0x00000000, 0x08000400, 0x00000000, 0x080c0001, } }, - { { /* 528 */ + { { /* 531 */ 0x00000400, 0x00000000, 0x00000000, 0x00200000, 0x80000000, 0x00001000, 0x00000200, 0x01000800, } }, - { { /* 529 */ + { { /* 532 */ 0x00000000, 0x00000800, 0x00000000, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x04040000, } }, - { { /* 530 */ + { { /* 533 */ 0x00000000, 0x00000000, 0x00000040, 0x00002000, 0xa0000000, 0x00000000, 0x08000008, 0x00080000, } }, - { { /* 531 */ + { { /* 534 */ 0x00000020, 0x00000000, 0x40000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00008000, } }, - { { /* 532 */ + { { /* 535 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000800, 0x00000000, 0x00000000, 0x00200000, } }, - { { /* 533 */ + { { /* 536 */ 0x00000000, 0x00000000, 0x00000000, 0x04000000, 0x00000008, 0x00000000, 0x00010000, 0x1b000000, } }, - { { /* 534 */ + { { /* 537 */ 0x00007000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000080, 0x80000000, 0x00000000, } }, - { { /* 535 */ + { { /* 538 */ 0x00000000, 0x00020000, 0x00000000, 0x00200000, 0x40000000, 0x00000010, 0x00800000, 0x00000008, } }, - { { /* 536 */ + { { /* 539 */ 0x00000000, 0x00000000, 0x02000000, 0x20000010, 0x00000080, 0x00000000, 0x00010000, 0x00000000, } }, - { { /* 537 */ + { { /* 540 */ 0x00000000, 0x02000000, 0x00000000, 0x00000000, 0x20000000, 0x00000040, 0x00200028, 0x00000000, } }, - { { /* 538 */ + { { /* 541 */ 0x00000000, 0x00020000, 0x00000000, 0x02000000, 0x00000000, 0x02000000, 0x40020000, 0x51000040, } }, - { { /* 539 */ + { { /* 542 */ 0x00000080, 0x04040000, 0x00000000, 0x10000000, 0x00022000, 0x00100000, 0x20000000, 0x00000082, } }, - { { /* 540 */ + { { /* 543 */ 0x40000000, 0x00010000, 0x00002000, 0x00000000, 0x00000240, 0x00000000, 0x00000000, 0x00000008, } }, - { { /* 541 */ + { { /* 544 */ 0x00000000, 0x00010000, 0x00000810, 0x00080880, 0x00004000, 0x00000000, 0x00000000, 0x00020000, } }, - { { /* 542 */ + { { /* 545 */ 0x00000000, 0x00400020, 0x00000000, 0x00000082, 0x00000000, 0x00020001, 0x00000000, 0x00000000, } }, - { { /* 543 */ + { { /* 546 */ 0x40000018, 0x00000004, 0x00000000, 0x00000000, 0x01000000, 0x00400000, 0x00000000, 0x00000000, } }, - { { /* 544 */ + { { /* 547 */ 0x00000001, 0x00400000, 0x00000000, 0x00080002, 0x00000400, 0x00040000, 0x00000000, 0x00000000, } }, - { { /* 545 */ + { { /* 548 */ 0x00000800, 0x00000800, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, 0x00000000, } }, - { { /* 546 */ + { { /* 549 */ 0x00000000, 0x00200000, 0x00000000, 0x04108000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, } }, - { { /* 547 */ + { { /* 550 */ 0x00000000, 0x02800000, 0x04000000, 0x00000000, 0x00000000, 0x00000004, 0x00000000, 0x00000400, } }, - { { /* 548 */ + { { /* 551 */ 0x00000000, 0x00000000, 0x10000000, 0x00040000, 0x00400000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 549 */ + { { /* 552 */ 0x00200000, 0x00000200, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x2a000000, 0x00000000, } }, - { { /* 550 */ + { { /* 553 */ 0x00400000, 0x00000000, 0x00400000, 0x00000000, 0x00000002, 0x40000000, 0x00000000, 0x00400000, } }, - { { /* 551 */ + { { /* 554 */ 0x40000000, 0x00001000, 0x00000000, 0x00000000, 0x00000202, 0x02000000, 0x80000000, 0x00020000, } }, - { { /* 552 */ + { { /* 555 */ 0x00000020, 0x00000800, 0x00020421, 0x00020000, 0x00000000, 0x00000000, 0x00000000, 0x00400000, } }, - { { /* 553 */ + { { /* 556 */ 0x00200000, 0x00000000, 0x00000001, 0x00000000, 0x00000084, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 554 */ + { { /* 557 */ 0x00000000, 0x00004400, 0x00000002, 0x00100000, 0x00000000, 0x00000000, 0x00008200, 0x00000000, } }, - { { /* 555 */ + { { /* 558 */ 0x00000000, 0x12000000, 0x00000100, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 556 */ + { { /* 559 */ 0x00000020, 0x08100000, 0x000a0400, 0x00000081, 0x00006000, 0x00120000, 0x00000000, 0x00000000, } }, - { { /* 557 */ + { { /* 560 */ 0x00000004, 0x08000000, 0x00004000, 0x044000c0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 558 */ + { { /* 561 */ 0x40001000, 0x00000000, 0x01000001, 0x05000000, 0x00080000, 0x02000000, 0x00000800, 0x00000000, } }, - { { /* 559 */ + { { /* 562 */ 0x00000100, 0x00000000, 0x00000000, 0x00000000, 0x00002002, 0x01020000, 0x00800000, 0x00000000, } }, - { { /* 560 */ + { { /* 563 */ 0x00000040, 0x00004000, 0x01000000, 0x00000004, 0x00020000, 0x00000000, 0x00000010, 0x00000000, } }, - { { /* 561 */ + { { /* 564 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00010000, 0x30000300, 0x00000400, } }, - { { /* 562 */ + { { /* 565 */ 0x00000800, 0x02000000, 0x00000000, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 563 */ + { { /* 566 */ 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000040c0, 0x00002200, 0x12002000, } }, - { { /* 564 */ + { { /* 567 */ 0x00000000, 0x00000020, 0x20000000, 0x00000000, 0x00000200, 0x00080800, 0x1000a000, 0x00000000, } }, - { { /* 565 */ + { { /* 568 */ 0x00000000, 0x00000000, 0x00000000, 0x00004000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 566 */ + { { /* 569 */ 0x00000000, 0x00000000, 0x00004280, 0x01000000, 0x00800000, 0x00000008, 0x00000000, 0x00000000, } }, - { { /* 567 */ + { { /* 570 */ 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x20400000, 0x00000040, 0x00000000, } }, - { { /* 568 */ + { { /* 571 */ 0x00800080, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00400020, 0x00000000, 0x00008000, } }, - { { /* 569 */ + { { /* 572 */ 0x01000000, 0x00000040, 0x00000000, 0x00400000, 0x00000000, 0x00000440, 0x00000000, 0x00800000, } }, - { { /* 570 */ + { { /* 573 */ 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00000000, } }, - { { /* 571 */ + { { /* 574 */ 0x01000000, 0x00000001, 0x00000000, 0x00020000, 0x00000000, 0x20002000, 0x00000000, 0x00000004, } }, - { { /* 572 */ + { { /* 575 */ 0x00000008, 0x00100000, 0x00000000, 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 573 */ + { { /* 576 */ 0x00000004, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00008000, } }, - { { /* 574 */ + { { /* 577 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000040, 0x00000000, 0x00004000, 0x00000000, } }, - { { /* 575 */ + { { /* 578 */ 0x00000010, 0x00002000, 0x40000040, 0x00000000, 0x10000000, 0x00000000, 0x00008080, 0x00000000, } }, - { { /* 576 */ + { { /* 579 */ 0x00000000, 0x00000000, 0x00000080, 0x00000000, 0x00100080, 0x000000a0, 0x00000000, 0x00000000, } }, - { { /* 577 */ + { { /* 580 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00100000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 578 */ + { { /* 581 */ 0x00000000, 0x00000000, 0x00001000, 0x00000000, 0x0001000a, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 579 */ + { { /* 582 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08002000, 0x00000000, } }, - { { /* 580 */ + { { /* 583 */ 0x00000808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 581 */ + { { /* 584 */ 0x00004000, 0x00002400, 0x00008000, 0x40000000, 0x00000001, 0x00002000, 0x04000000, 0x00040004, } }, - { { /* 582 */ + { { /* 585 */ 0x00000000, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x1c200000, 0x00000000, 0x02000000, } }, - { { /* 583 */ + { { /* 586 */ 0x00000000, 0x00080000, 0x00400000, 0x00000002, 0x00000000, 0x00000100, 0x00000000, 0x00000000, } }, - { { /* 584 */ + { { /* 587 */ 0x00000000, 0x00000000, 0x00000000, 0x00400000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 585 */ + { { /* 588 */ 0x00004100, 0x00000400, 0x20200010, 0x00004004, 0x00000000, 0x42000000, 0x00000000, 0x00000000, } }, - { { /* 586 */ + { { /* 589 */ 0x00000080, 0x00000000, 0x00000121, 0x00000200, 0x000000b0, 0x80002000, 0x00000000, 0x00010000, } }, - { { /* 587 */ + { { /* 590 */ 0x00000010, 0x000000c0, 0x08100000, 0x00000020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 588 */ + { { /* 591 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000, 0x00000404, 0x00000000, 0x00000000, } }, - { { /* 589 */ + { { /* 592 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00400000, 0x00000008, 0x00000000, 0x00000000, } }, - { { /* 590 */ + { { /* 593 */ 0x00000000, 0x00000002, 0x00020000, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00204000, } }, - { { /* 591 */ + { { /* 594 */ 0x00000000, 0x00100000, 0x00000000, 0x00000000, 0x00000000, 0x00800000, 0x00000100, 0x00000001, } }, - { { /* 592 */ + { { /* 595 */ 0x10000000, 0x01000000, 0x00002400, 0x00000004, 0x00000000, 0x00000000, 0x00000020, 0x00000002, } }, - { { /* 593 */ + { { /* 596 */ 0x00010000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 594 */ + { { /* 597 */ 0x00000000, 0x00002400, 0x00000000, 0x00000000, 0x00004802, 0x00000000, 0x00000000, 0x80022000, } }, - { { /* 595 */ + { { /* 598 */ 0x00001004, 0x04208000, 0x20000020, 0x00040000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 596 */ + { { /* 599 */ 0x00000000, 0x00100000, 0x40010000, 0x00000000, 0x00080000, 0x00000000, 0x00100211, 0x00000000, } }, - { { /* 597 */ + { { /* 600 */ 0x00001400, 0x00000000, 0x00000000, 0x00000000, 0x00610000, 0x80008c00, 0x00000000, 0x00000000, } }, - { { /* 598 */ + { { /* 601 */ 0x00000100, 0x00000040, 0x00000000, 0x00000004, 0x00004000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 599 */ + { { /* 602 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000000, } }, - { { /* 600 */ + { { /* 603 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000210, 0x00000000, 0x00000000, } }, - { { /* 601 */ + { { /* 604 */ 0x00000000, 0x00000020, 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 602 */ + { { /* 605 */ 0x00004000, 0x00000000, 0x00000000, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 603 */ + { { /* 606 */ 0x00000000, 0x00000000, 0x00080002, 0x01000020, 0x00400000, 0x00200000, 0x00008000, 0x00000000, } }, - { { /* 604 */ + { { /* 607 */ 0x00000000, 0x00020000, 0x00000000, 0xc0020000, 0x10000000, 0x00000080, 0x00000000, 0x00000000, } }, - { { /* 605 */ + { { /* 608 */ 0x00000210, 0x00000000, 0x00001000, 0x04480000, 0x20000000, 0x00000004, 0x00800000, 0x02000000, } }, - { { /* 606 */ + { { /* 609 */ 0x00000000, 0x08006000, 0x00001000, 0x00000000, 0x00000000, 0x00100000, 0x00000000, 0x00000400, } }, - { { /* 607 */ + { { /* 610 */ 0x00100000, 0x00000000, 0x10000000, 0x08608000, 0x00000000, 0x00000000, 0x00080002, 0x00000000, } }, - { { /* 608 */ + { { /* 611 */ 0x00000000, 0x20000000, 0x00008020, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 609 */ + { { /* 612 */ 0x00000000, 0x00000000, 0x00000000, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 610 */ + { { /* 613 */ 0x00000000, 0x00100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 611 */ + { { /* 614 */ 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 612 */ + { { /* 615 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x02000000, } }, - { { /* 613 */ + { { /* 616 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x00000000, } }, - { { /* 614 */ + { { /* 617 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, 0x00000000, 0x00000000, } }, - { { /* 615 */ + { { /* 618 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00008000, 0x00000000, } }, - { { /* 616 */ + { { /* 619 */ 0x00000000, 0x00000000, 0x00000008, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000000, } }, - { { /* 617 */ + { { /* 620 */ 0x00000000, 0x00000000, 0x00220000, 0x00000004, 0x00000000, 0x00040000, 0x00000004, 0x00000000, } }, - { { /* 618 */ + { { /* 621 */ 0x00000000, 0x00000000, 0x00001000, 0x00000080, 0x00002000, 0x00000000, 0x00000000, 0x00004000, } }, - { { /* 619 */ + { { /* 622 */ 0x00000000, 0x00000000, 0x00000000, 0x00100000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 620 */ + { { /* 623 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 621 */ + { { /* 624 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000000, 0x00000000, 0x00000000, } }, - { { /* 622 */ + { { /* 625 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000200, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 623 */ + { { /* 626 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 624 */ + { { /* 627 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00000000, } }, - { { /* 625 */ + { { /* 628 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x01000000, 0x00000000, 0x00000400, } }, - { { /* 626 */ + { { /* 629 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000080, 0x00000000, 0x00000000, } }, - { { /* 627 */ + { { /* 630 */ 0x00000000, 0x00000800, 0x00000100, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 628 */ + { { /* 631 */ 0x00000000, 0x00200000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 629 */ + { { /* 632 */ 0x00000000, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 630 */ + { { /* 633 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000000, 0x00000000, } }, - { { /* 631 */ + { { /* 634 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001000, 0x00000000, } }, - { { /* 632 */ + { { /* 635 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 633 */ + { { /* 636 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04040000, } }, - { { /* 634 */ + { { /* 637 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 635 */ + { { /* 638 */ 0x00000000, 0x00000000, 0x00800000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 636 */ + { { /* 639 */ 0x00000000, 0x00200000, 0x40000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 637 */ + { { /* 640 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x20000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 638 */ + { { /* 641 */ 0x00000000, 0x00000000, 0x00000000, 0x04000000, 0x00000000, 0x00000001, 0x00000000, 0x00000000, } }, - { { /* 639 */ + { { /* 642 */ 0x00000000, 0x40000000, 0x02000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 640 */ + { { /* 643 */ 0x00000000, 0x00000000, 0x00000000, 0x00080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 641 */ + { { /* 644 */ 0x00000000, 0x00000010, 0x00000000, 0x00000000, 0x00000000, 0x20000000, 0x00000000, 0x00000000, } }, - { { /* 642 */ + { { /* 645 */ 0x00000000, 0x00000000, 0x20000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 643 */ + { { /* 646 */ 0x00000080, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000004, } }, - { { /* 644 */ - 0x00000000, 0x00000000, 0x00000000, 0x00002000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, - { { /* 645 */ - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x10000001, 0x00000000, - } }, - { { /* 646 */ - 0x00008000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000000, - } }, { { /* 647 */ - 0x00000000, 0x00000000, 0x00004040, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 648 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00042400, 0x00000000, + 0x00000000, 0x00000000, 0x10000001, 0x00000000, } }, { { /* 649 */ + 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x02000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 650 */ + 0x00000000, 0x00000000, 0x00004040, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000080, } }, { { /* 651 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00000000, 0x00000020, + 0x00000000, 0x00000000, 0x00042400, 0x00000000, } }, { { /* 652 */ - 0x00000000, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000000, 0x00000000, 0x00000000, 0x00000000, } }, { { /* 653 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, - 0x00000000, 0x00000000, 0x00020000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000080, } }, { { /* 654 */ + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000020, + } }, + { { /* 655 */ + 0x00000000, 0x00000001, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + } }, + { { /* 656 */ + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00020000, 0x00000000, + } }, + { { /* 657 */ 0x00000000, 0x00000000, 0x00002000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 655 */ + { { /* 658 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x01000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 656 */ + { { /* 659 */ 0x00000000, 0x00040000, 0x08000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 657 */ + { { /* 660 */ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000280, 0x00000000, } }, - { { /* 658 */ + { { /* 661 */ 0x7f7b7f8b, 0xef553db4, 0xf35dfba8, 0x400b0243, 0x8d3efb40, 0x8c2c7bf7, 0xe3fa6eff, 0xa8ed1d3a, } }, - { { /* 659 */ + { { /* 662 */ 0xcf83e602, 0x35558cf5, 0xffabe048, 0xd85992b9, 0x2892ab18, 0x8020d7e9, 0xf583c438, 0x450ae74a, } }, - { { /* 660 */ + { { /* 663 */ 0x9714b000, 0x54007762, 0x1420d188, 0xc8c01020, 0x00002121, 0x0c0413a8, 0x04408000, 0x082870c0, } }, - { { /* 661 */ + { { /* 664 */ 0x000408c0, 0x80000002, 0x14722b7b, 0x3bfb7924, 0x1ae43327, 0x38ef9835, 0x28029ad1, 0xbf69a813, } }, - { { /* 662 */ + { { /* 665 */ 0x2fc665cf, 0xafc96b11, 0x5053340f, 0xa00486a2, 0xe8090106, 0xc00e3f0f, 0x81450a88, 0xc6010010, } }, - { { /* 663 */ + { { /* 666 */ 0x26e1a161, 0xce00444b, 0xd4eec7aa, 0x85bbcadf, 0xa5203a74, 0x8840436c, 0x8bd23f06, 0x3befff79, } }, - { { /* 664 */ + { { /* 667 */ 0xe8eff75a, 0x5b36fbcb, 0x1bfd0d49, 0x39ee0154, 0x2e75d855, 0xa91abfd8, 0xf6bff3d7, 0xb40c67e0, } }, - { { /* 665 */ + { { /* 668 */ 0x081382c2, 0xd08bd49d, 0x1061065a, 0x59e074f2, 0xb3128f9f, 0x6aaa0080, 0xb05e3230, 0x60ac9d7a, } }, - { { /* 666 */ + { { /* 669 */ 0xc900d303, 0x8a563098, 0x13907000, 0x18421f14, 0x0008c060, 0x10808008, 0xec900400, 0xe6332817, } }, - { { /* 667 */ + { { /* 670 */ 0x90000758, 0x4e09f708, 0xfc83f485, 0x18c8af53, 0x080c187c, 0x01146adf, 0xa734c80c, 0x2710a011, } }, - { { /* 668 */ + { { /* 671 */ 0x422228c5, 0x00210413, 0x41123010, 0x40001820, 0xc60c022b, 0x10000300, 0x00220022, 0x02495810, } }, - { { /* 669 */ + { { /* 672 */ 0x9670a094, 0x1792eeb0, 0x05f2cb96, 0x23580025, 0x42cc25de, 0x4a04cf38, 0x359f0c40, 0x8a001128, } }, - { { /* 670 */ + { { /* 673 */ 0x910a13fa, 0x10560229, 0x04200641, 0x84f00484, 0x0c040000, 0x412c0400, 0x11541206, 0x00020a4b, } }, - { { /* 671 */ + { { /* 674 */ 0x00c00200, 0x00940000, 0xbfbb0001, 0x242b167c, 0x7fa89bbb, 0xe3790c7f, 0xe00d10f4, 0x9f014132, } }, - { { /* 672 */ + { { /* 675 */ 0x35728652, 0xff1210b4, 0x4223cf27, 0x8602c06b, 0x1fd33106, 0xa1aa3a0c, 0x02040812, 0x08012572, } }, - { { /* 673 */ + { { /* 676 */ 0x485040cc, 0x601062d0, 0x29001c80, 0x00109a00, 0x22000004, 0x00800000, 0x68002020, 0x609ecbe6, } }, - { { /* 674 */ + { { /* 677 */ 0x3f73916e, 0x398260c0, 0x48301034, 0xbd5c0006, 0xd6fb8cd1, 0x43e820e1, 0x084e0600, 0xc4d00500, } }, - { { /* 675 */ + { { /* 678 */ 0x89aa8d1f, 0x1602a6e1, 0x21ed0001, 0x1a8b3656, 0x13a51fb7, 0x30a06502, 0x23c7b278, 0xe9226c93, } }, - { { /* 676 */ + { { /* 679 */ 0x3a74e47f, 0x98208fe3, 0x2625280e, 0xbf49bf9c, 0xac543218, 0x1916b949, 0xb5220c60, 0x0659fbc1, } }, - { { /* 677 */ + { { /* 680 */ 0x8420e343, 0x800008d9, 0x20225500, 0x00a10184, 0x20104800, 0x40801380, 0x00160d04, 0x80200040, } }, - { { /* 678 */ + { { /* 681 */ 0x8de7fd40, 0xe0985436, 0x091e7b8b, 0xd249fec8, 0x8dee0611, 0xba221937, 0x9fdd77f4, 0xf0daf3ec, } }, - { { /* 679 */ + { { /* 682 */ 0xec424386, 0x26048d3f, 0xc021fa6c, 0x0cc2628e, 0x0145d785, 0x559977ad, 0x4045e250, 0xa154260b, } }, - { { /* 680 */ + { { /* 683 */ 0x58199827, 0xa4103443, 0x411405f2, 0x07002280, 0x426600b4, 0x15a17210, 0x41856025, 0x00000054, } }, - { { /* 681 */ + { { /* 684 */ 0x01040201, 0xcb70c820, 0x6a629320, 0x0095184c, 0x9a8b1880, 0x3201aab2, 0x00c4d87a, 0x04c3f3e5, } }, - { { /* 682 */ + { { /* 685 */ 0xa238d44d, 0x5072a1a1, 0x84fc980a, 0x44d1c152, 0x20c21094, 0x42104180, 0x3a000000, 0xd29d0240, } }, - { { /* 683 */ + { { /* 686 */ 0xa8b12f01, 0x2432bd40, 0xd04bd34d, 0xd0ada723, 0x75a10a92, 0x01e9adac, 0x771f801a, 0xa01b9225, } }, - { { /* 684 */ + { { /* 687 */ 0x20cadfa1, 0x738c0602, 0x003b577f, 0x00d00bff, 0x0088806a, 0x0029a1c4, 0x05242a05, 0x16234009, } }, - { { /* 685 */ + { { /* 688 */ 0x80056822, 0xa2112011, 0x64900004, 0x13824849, 0x193023d5, 0x08922980, 0x88115402, 0xa0042001, } }, - { { /* 686 */ + { { /* 689 */ 0x81800400, 0x60228502, 0x0b010090, 0x12020022, 0x00834011, 0x00001a01, 0x00000000, 0x00000000, } }, - { { /* 687 */ + { { /* 690 */ 0x00000000, 0x4684009f, 0x020012c8, 0x1a0004fc, 0x0c4c2ede, 0x80b80402, 0x0afca826, 0x22288c02, } }, - { { /* 688 */ + { { /* 691 */ 0x8f7ba0e0, 0x2135c7d6, 0xf8b106c7, 0x62550713, 0x8a19936e, 0xfb0e6efa, 0x48f91630, 0x7debcd2f, } }, - { { /* 689 */ + { { /* 692 */ 0x4e845892, 0x7a2e4ca0, 0x561eedea, 0x1190c649, 0xe83a5324, 0x8124cfdb, 0x634218f1, 0x1a8a5853, } }, - { { /* 690 */ + { { /* 693 */ 0x24d37420, 0x0514aa3b, 0x89586018, 0xc0004800, 0x91018268, 0x2cd684a4, 0xc4ba8886, 0x02100377, } }, - { { /* 691 */ + { { /* 694 */ 0x00388244, 0x404aae11, 0x510028c0, 0x15146044, 0x10007310, 0x02480082, 0x40060205, 0x0000c003, } }, - { { /* 692 */ + { { /* 695 */ 0x0c020000, 0x02200008, 0x40009000, 0xd161b800, 0x32744621, 0x3b8af800, 0x8b00050f, 0x2280bbd0, } }, - { { /* 693 */ + { { /* 696 */ 0x07690600, 0x00438040, 0x50005420, 0x250c41d0, 0x83108410, 0x02281101, 0x00304008, 0x020040a1, } }, - { { /* 694 */ + { { /* 697 */ 0x20000040, 0xabe31500, 0xaa443180, 0xc624c2c6, 0x8004ac13, 0x03d1b000, 0x4285611e, 0x1d9ff303, } }, - { { /* 695 */ + { { /* 698 */ 0x78e8440a, 0xc3925e26, 0x00852000, 0x4000b001, 0x88424a90, 0x0c8dca04, 0x4203a705, 0x000422a1, } }, - { { /* 696 */ + { { /* 699 */ 0x0c018668, 0x10795564, 0xdea00002, 0x40c12000, 0x5001488b, 0x04000380, 0x50040000, 0x80d0c05d, } }, - { { /* 697 */ + { { /* 700 */ 0x970aa010, 0x4dafbb20, 0x1e10d921, 0x83140460, 0xa6d68848, 0x733fd83b, 0x497427bc, 0x92130ddc, } }, - { { /* 698 */ + { { /* 701 */ 0x8ba1142b, 0xd1392e75, 0x50503009, 0x69008808, 0x024a49d4, 0x80164010, 0x89d7e564, 0x5316c020, } }, - { { /* 699 */ + { { /* 702 */ 0x86002b92, 0x15e0a345, 0x0c03008b, 0xe200196e, 0x80067031, 0xa82916a5, 0x18802000, 0xe1487aac, } }, - { { /* 700 */ + { { /* 703 */ 0xb5d63207, 0x5f9132e8, 0x20e550a1, 0x10807c00, 0x9d8a7280, 0x421f00aa, 0x02310e22, 0x04941100, } }, - { { /* 701 */ + { { /* 704 */ 0x40080022, 0x5c100010, 0xfcc80343, 0x0580a1a5, 0x04008433, 0x6e080080, 0x81262a4b, 0x2901aad8, } }, - { { /* 702 */ + { { /* 705 */ 0x4490684d, 0xba880009, 0x00820040, 0x87d10000, 0xb1e6215b, 0x80083161, 0xc2400800, 0xa600a069, } }, - { { /* 703 */ + { { /* 706 */ 0x4a328d58, 0x550a5d71, 0x2d579aa0, 0x4aa64005, 0x30b12021, 0x01123fc6, 0x260a10c2, 0x50824462, } }, - { { /* 704 */ + { { /* 707 */ 0x80409880, 0x810004c0, 0x00002003, 0x38180000, 0xf1a60200, 0x720e4434, 0x92e035a2, 0x09008101, } }, - { { /* 705 */ + { { /* 708 */ 0x00000400, 0x00008885, 0x00000000, 0x00804000, 0x00000000, 0x00004040, 0x00000000, 0x00000000, } }, - { { /* 706 */ + { { /* 709 */ 0x00000000, 0x08000000, 0x00000082, 0x00000000, 0x88000004, 0xe7efbfff, 0xffbfffff, 0xfdffefef, } }, - { { /* 707 */ + { { /* 710 */ 0xbffefbff, 0x057fffff, 0x85b30034, 0x42164706, 0xe4105402, 0xb3058092, 0x81305422, 0x180b4263, } }, - { { /* 708 */ + { { /* 711 */ 0x13f5387b, 0xa9ea07e5, 0x05143c4c, 0x80020600, 0xbd481ad9, 0xf496ee37, 0x7ec0705f, 0x355fbfb2, } }, - { { /* 709 */ + { { /* 712 */ 0x455fe644, 0x41469000, 0x063b1d40, 0xfe1362a1, 0x39028505, 0x0c080548, 0x0000144f, 0x58183488, } }, - { { /* 710 */ + { { /* 713 */ 0xd8153077, 0x4bfbbd0e, 0x85008a90, 0xe61dc100, 0xb386ed14, 0x639bff72, 0xd9befd92, 0x0a92887b, } }, - { { /* 711 */ + { { /* 714 */ 0x1cb2d3fe, 0x177ab980, 0xdc1782c9, 0x3980fffb, 0x590c4260, 0x37df0f01, 0xb15094a3, 0x23070623, } }, - { { /* 712 */ + { { /* 715 */ 0x3102f85a, 0x310201f0, 0x1e820040, 0x056a3a0a, 0x12805b84, 0xa7148002, 0xa04b2612, 0x90011069, } }, - { { /* 713 */ + { { /* 716 */ 0x848a1000, 0x3f801802, 0x42400708, 0x4e140110, 0x180080b0, 0x0281c510, 0x10298202, 0x88000210, } }, - { { /* 714 */ + { { /* 717 */ 0x00420020, 0x11000280, 0x4413e000, 0xfe025804, 0x30283c07, 0x04739798, 0xcb13ced1, 0x431f6210, } }, - { { /* 715 */ + { { /* 718 */ 0x55ac278d, 0xc892422e, 0x02885380, 0x78514039, 0x8088292c, 0x2428b900, 0x080e0c41, 0x42004421, } }, - { { /* 716 */ + { { /* 719 */ 0x08680408, 0x12040006, 0x02903031, 0xe0855b3e, 0x10442936, 0x10822814, 0x83344266, 0x531b013c, } }, - { { /* 717 */ + { { /* 720 */ 0x0e0d0404, 0x00510c22, 0xc0000012, 0x88000040, 0x0000004a, 0x00000000, 0x5447dff6, 0x00088868, } }, - { { /* 718 */ + { { /* 721 */ 0x00000081, 0x40000000, 0x00000100, 0x02000000, 0x00080600, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 719 */ + { { /* 722 */ 0x00000080, 0x00000040, 0x00000000, 0x00001040, 0x00000000, 0xf7fdefff, 0xfffeff7f, 0xfffffbff, } }, - { { /* 720 */ + { { /* 723 */ 0xbffffdff, 0x00ffffff, 0x042012c2, 0x07080c06, 0x01101624, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 721 */ + { { /* 724 */ 0xe0000000, 0xfffffffe, 0x7f79ffff, 0x00f928df, 0x80120c32, 0xd53a0008, 0xecc2d858, 0x2fa89d18, } }, - { { /* 722 */ + { { /* 725 */ 0xe0109620, 0x2622d60c, 0x02060f97, 0x9055b240, 0x501180a2, 0x04049800, 0x00004000, 0x00000000, } }, - { { /* 723 */ + { { /* 726 */ 0x00000000, 0x00000000, 0x00000000, 0xfffffbc0, 0xdffbeffe, 0x62430b08, 0xfb3b41b6, 0x23896f74, } }, - { { /* 724 */ + { { /* 727 */ 0xecd7ae7f, 0x5960e047, 0x098fa096, 0xa030612c, 0x2aaa090d, 0x4f7bd44e, 0x388bc4b2, 0x6110a9c6, } }, - { { /* 725 */ + { { /* 728 */ 0x42000014, 0x0202800c, 0x6485fe48, 0xe3f7d63e, 0x0c073aa0, 0x0430e40c, 0x1002f680, 0x00000000, } }, - { { /* 726 */ + { { /* 729 */ 0x00000000, 0x00000000, 0x00000000, 0x00100000, 0x00004000, 0x00004000, 0x00000100, 0x00000000, } }, - { { /* 727 */ + { { /* 730 */ 0x00000000, 0x40000000, 0x00000000, 0x00000400, 0x00008000, 0x00000000, 0x00400400, 0x00000000, } }, - { { /* 728 */ + { { /* 731 */ 0x00000000, 0x40000000, 0x00000000, 0x00000800, 0xfebdffe0, 0xffffffff, 0xfbe77f7f, 0xf7ffffbf, } }, - { { /* 729 */ + { { /* 732 */ 0xefffffff, 0xdff7ff7e, 0xfbdff6f7, 0x804fbffe, 0x00000000, 0x00000000, 0x00000000, 0x7fffef00, } }, - { { /* 730 */ + { { /* 733 */ 0xb6f7ff7f, 0xb87e4406, 0x88313bf5, 0x00f41796, 0x1391a960, 0x72490080, 0x0024f2f3, 0x42c88701, } }, - { { /* 731 */ + { { /* 734 */ 0x5048e3d3, 0x43052400, 0x4a4c0000, 0x10580227, 0x01162820, 0x0014a809, 0x00000000, 0x00683ec0, } }, - { { /* 732 */ + { { /* 735 */ 0x00000000, 0x00000000, 0x00000000, 0xffe00000, 0xfddbb7ff, 0x000000f7, 0xc72e4000, 0x00000180, } }, - { { /* 733 */ + { { /* 736 */ 0x00012000, 0x00004000, 0x00300000, 0xb4f7ffa8, 0x03ffadf3, 0x00000120, 0x00000000, 0x00000000, } }, - { { /* 734 */ + { { /* 737 */ 0x00000000, 0x00000000, 0x00000000, 0xfffbf000, 0xfdcf9df7, 0x15c301bf, 0x810a1827, 0x0a00a842, } }, - { { /* 735 */ + { { /* 738 */ 0x80088108, 0x18048008, 0x0012a3be, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, } }, - { { /* 736 */ + { { /* 739 */ 0x00000000, 0x00000000, 0x00000000, 0x90000000, 0xdc3769e6, 0x3dff6bff, 0xf3f9fcf8, 0x00000004, } }, - { { /* 737 */ + { { /* 740 */ 0x80000000, 0xe7eebf6f, 0x5da2dffe, 0xc00b3fd8, 0xa00c0984, 0x69100040, 0xb912e210, 0x5a0086a5, } }, - { { /* 738 */ + { { /* 741 */ 0x02896800, 0x6a809005, 0x00030010, 0x80000000, 0x8e001ff9, 0x00000001, 0x00000000, 0x00000000, } }, @@ -3382,438 +3396,442 @@ LEAF( 56,132), LEAF( 56,133), LEAF( 56,134), /* co */ LEAF(139,135), LEAF(139,136), - /* crh */ + /* cop */ LEAF(141,137), LEAF(141,138), - /* cs */ + /* crh */ LEAF(143,139), LEAF(143,140), - /* csb */ + /* cs */ LEAF(145,141), LEAF(145,142), + /* csb */ + LEAF(147,143), LEAF(147,144), /* cu */ - LEAF(147,143), + LEAF(149,145), /* cv */ - LEAF(148,144), LEAF(148,145), + LEAF(150,146), LEAF(150,147), /* cy */ - LEAF(150,146), LEAF(150,147), LEAF(150,148), + LEAF(152,148), LEAF(152,149), LEAF(152,150), /* da */ - LEAF(153,149), - /* de */ - LEAF(154,150), - /* doi */ LEAF(155,151), - /* dv */ + /* de */ LEAF(156,152), + /* doi */ + LEAF(157,153), + /* dv */ + LEAF(158,154), /* ee */ - LEAF(157, 33), LEAF(157,153), LEAF(157,154), LEAF(157,155), + LEAF(159, 33), LEAF(159,155), LEAF(159,156), LEAF(159,157), /* el */ - LEAF(161,156), + LEAF(163,158), /* en */ - LEAF(162,157), + LEAF(164,159), /* eo */ - LEAF(163, 26), LEAF(163,158), + LEAF(165, 26), LEAF(165,160), /* et */ - LEAF(165,159), LEAF(165,160), + LEAF(167,161), LEAF(167,162), /* eu */ - LEAF(167,161), + LEAF(169,163), /* ff */ - LEAF(168, 26), LEAF(168,162), LEAF(168,163), + LEAF(170, 26), LEAF(170,164), LEAF(170,165), /* fi */ - LEAF(171,164), LEAF(171,160), + LEAF(173,166), LEAF(173,162), /* fil */ - LEAF(173,165), - /* fo */ - LEAF(174,166), - /* fur */ LEAF(175,167), - /* fy */ + /* fo */ LEAF(176,168), + /* fur */ + LEAF(177,169), + /* fy */ + LEAF(178,170), /* ga */ - LEAF(177,169), LEAF(177,170), LEAF(177,171), + LEAF(179,171), LEAF(179,172), LEAF(179,173), /* gd */ - LEAF(180,172), + LEAF(182,174), /* gez */ - LEAF(181,173), LEAF(181,174), + LEAF(183,175), LEAF(183,176), /* gn */ - LEAF(183,175), LEAF(183,176), LEAF(183,177), + LEAF(185,177), LEAF(185,178), LEAF(185,179), + /* got */ + LEAF(188,180), /* gu */ - LEAF(186,178), + LEAF(189,181), /* gv */ - LEAF(187,179), + LEAF(190,182), /* ha */ - LEAF(188, 26), LEAF(188,180), LEAF(188,181), + LEAF(191, 26), LEAF(191,183), LEAF(191,184), /* haw */ - LEAF(191, 26), LEAF(191,182), LEAF(191,183), + LEAF(194, 26), LEAF(194,185), LEAF(194,186), /* he */ - LEAF(194,184), - /* hsb */ - LEAF(195,185), LEAF(195,186), - /* ht */ LEAF(197,187), - /* hu */ + /* hsb */ LEAF(198,188), LEAF(198,189), - /* hy */ + /* ht */ LEAF(200,190), + /* hu */ + LEAF(201,191), LEAF(201,192), + /* hy */ + LEAF(203,193), /* hz */ - LEAF(201, 26), LEAF(201,191), LEAF(201,192), + LEAF(204, 26), LEAF(204,194), LEAF(204,195), /* id */ - LEAF(204,193), + LEAF(207,196), /* ie */ - LEAF(205,139), + LEAF(208,141), /* ig */ - LEAF(206, 26), LEAF(206,194), + LEAF(209, 26), LEAF(209,197), /* ii */ - LEAF(208,195), LEAF(208,195), LEAF(208,195), LEAF(208,195), - LEAF(208,196), + LEAF(211,198), LEAF(211,198), LEAF(211,198), LEAF(211,198), + LEAF(211,199), /* ik */ - LEAF(213,197), + LEAF(216,200), /* is */ - LEAF(214,198), + LEAF(217,201), /* it */ - LEAF(215,199), + LEAF(218,202), /* iu */ - LEAF(216,200), LEAF(216,201), LEAF(216,202), + LEAF(219,203), LEAF(219,204), LEAF(219,205), /* ja */ - LEAF(219,203), LEAF(219,204), LEAF(219,205), LEAF(219,206), - LEAF(219,207), LEAF(219,208), LEAF(219,209), LEAF(219,210), - LEAF(219,211), LEAF(219,212), LEAF(219,213), LEAF(219,214), - LEAF(219,215), LEAF(219,216), LEAF(219,217), LEAF(219,218), - LEAF(219,219), LEAF(219,220), LEAF(219,221), LEAF(219,222), - LEAF(219,223), LEAF(219,224), LEAF(219,225), LEAF(219,226), - LEAF(219,227), LEAF(219,228), LEAF(219,229), LEAF(219,230), - LEAF(219,231), LEAF(219,232), LEAF(219,233), LEAF(219,234), - LEAF(219,235), LEAF(219,236), LEAF(219,237), LEAF(219,238), - LEAF(219,239), LEAF(219,240), LEAF(219,241), LEAF(219,242), - LEAF(219,243), LEAF(219,244), LEAF(219,245), LEAF(219,246), - LEAF(219,247), LEAF(219,248), LEAF(219,249), LEAF(219,250), - LEAF(219,251), LEAF(219,252), LEAF(219,253), LEAF(219,254), - LEAF(219,255), LEAF(219,256), LEAF(219,257), LEAF(219,258), - LEAF(219,259), LEAF(219,260), LEAF(219,261), LEAF(219,262), - LEAF(219,263), LEAF(219,264), LEAF(219,265), LEAF(219,266), - LEAF(219,267), LEAF(219,268), LEAF(219,269), LEAF(219,270), - LEAF(219,271), LEAF(219,272), LEAF(219,273), LEAF(219,274), - LEAF(219,275), LEAF(219,276), LEAF(219,277), LEAF(219,278), - LEAF(219,279), LEAF(219,280), LEAF(219,281), LEAF(219,282), - LEAF(219,283), LEAF(219,284), LEAF(219,285), + LEAF(222,206), LEAF(222,207), LEAF(222,208), LEAF(222,209), + LEAF(222,210), LEAF(222,211), LEAF(222,212), LEAF(222,213), + LEAF(222,214), LEAF(222,215), LEAF(222,216), LEAF(222,217), + LEAF(222,218), LEAF(222,219), LEAF(222,220), LEAF(222,221), + LEAF(222,222), LEAF(222,223), LEAF(222,224), LEAF(222,225), + LEAF(222,226), LEAF(222,227), LEAF(222,228), LEAF(222,229), + LEAF(222,230), LEAF(222,231), LEAF(222,232), LEAF(222,233), + LEAF(222,234), LEAF(222,235), LEAF(222,236), LEAF(222,237), + LEAF(222,238), LEAF(222,239), LEAF(222,240), LEAF(222,241), + LEAF(222,242), LEAF(222,243), LEAF(222,244), LEAF(222,245), + LEAF(222,246), LEAF(222,247), LEAF(222,248), LEAF(222,249), + LEAF(222,250), LEAF(222,251), LEAF(222,252), LEAF(222,253), + LEAF(222,254), LEAF(222,255), LEAF(222,256), LEAF(222,257), + LEAF(222,258), LEAF(222,259), LEAF(222,260), LEAF(222,261), + LEAF(222,262), LEAF(222,263), LEAF(222,264), LEAF(222,265), + LEAF(222,266), LEAF(222,267), LEAF(222,268), LEAF(222,269), + LEAF(222,270), LEAF(222,271), LEAF(222,272), LEAF(222,273), + LEAF(222,274), LEAF(222,275), LEAF(222,276), LEAF(222,277), + LEAF(222,278), LEAF(222,279), LEAF(222,280), LEAF(222,281), + LEAF(222,282), LEAF(222,283), LEAF(222,284), LEAF(222,285), + LEAF(222,286), LEAF(222,287), LEAF(222,288), /* jv */ - LEAF(302,286), + LEAF(305,289), /* ka */ - LEAF(303,287), + LEAF(306,290), /* kaa */ - LEAF(304,288), + LEAF(307,291), /* ki */ - LEAF(305, 26), LEAF(305,289), + LEAF(308, 26), LEAF(308,292), /* kk */ - LEAF(307,290), - /* kl */ - LEAF(308,291), LEAF(308,292), - /* km */ LEAF(310,293), + /* kl */ + LEAF(311,294), LEAF(311,295), + /* km */ + LEAF(313,296), /* kn */ - LEAF(311,294), + LEAF(314,297), /* ko */ - LEAF(312,295), LEAF(312,296), LEAF(312,297), LEAF(312,298), - LEAF(312,299), LEAF(312,300), LEAF(312,301), LEAF(312,302), - LEAF(312,303), LEAF(312,304), LEAF(312,305), LEAF(312,306), - LEAF(312,307), LEAF(312,308), LEAF(312,309), LEAF(312,310), - LEAF(312,311), LEAF(312,312), LEAF(312,313), LEAF(312,314), - LEAF(312,315), LEAF(312,316), LEAF(312,317), LEAF(312,318), - LEAF(312,319), LEAF(312,320), LEAF(312,321), LEAF(312,322), - LEAF(312,323), LEAF(312,324), LEAF(312,325), LEAF(312,326), - LEAF(312,327), LEAF(312,328), LEAF(312,329), LEAF(312,330), - LEAF(312,331), LEAF(312,332), LEAF(312,333), LEAF(312,334), - LEAF(312,335), LEAF(312,336), LEAF(312,337), LEAF(312,338), - LEAF(312,339), + LEAF(315,298), LEAF(315,299), LEAF(315,300), LEAF(315,301), + LEAF(315,302), LEAF(315,303), LEAF(315,304), LEAF(315,305), + LEAF(315,306), LEAF(315,307), LEAF(315,308), LEAF(315,309), + LEAF(315,310), LEAF(315,311), LEAF(315,312), LEAF(315,313), + LEAF(315,314), LEAF(315,315), LEAF(315,316), LEAF(315,317), + LEAF(315,318), LEAF(315,319), LEAF(315,320), LEAF(315,321), + LEAF(315,322), LEAF(315,323), LEAF(315,324), LEAF(315,325), + LEAF(315,326), LEAF(315,327), LEAF(315,328), LEAF(315,329), + LEAF(315,330), LEAF(315,331), LEAF(315,332), LEAF(315,333), + LEAF(315,334), LEAF(315,335), LEAF(315,336), LEAF(315,337), + LEAF(315,338), LEAF(315,339), LEAF(315,340), LEAF(315,341), + LEAF(315,342), /* kr */ - LEAF(357, 26), LEAF(357,340), LEAF(357,341), + LEAF(360, 26), LEAF(360,343), LEAF(360,344), /* ks */ - LEAF(360,342), + LEAF(363,345), /* ku_am */ - LEAF(361,343), LEAF(361,344), + LEAF(364,346), LEAF(364,347), /* ku_tr */ - LEAF(363,345), LEAF(363,346), + LEAF(366,348), LEAF(366,349), /* kum */ - LEAF(365,347), + LEAF(368,350), /* kv */ - LEAF(366,348), + LEAF(369,351), /* kw */ - LEAF(367, 26), LEAF(367,182), LEAF(367,349), + LEAF(370, 26), LEAF(370,185), LEAF(370,352), /* ky */ - LEAF(370,350), + LEAF(373,353), /* la */ - LEAF(371, 26), LEAF(371,351), + LEAF(374, 26), LEAF(374,354), /* lah */ - LEAF(373,352), + LEAF(376,355), /* lb */ - LEAF(374,353), + LEAF(377,356), /* lg */ - LEAF(375, 26), LEAF(375,354), + LEAF(378, 26), LEAF(378,357), /* li */ - LEAF(377,355), + LEAF(380,358), /* lij */ - LEAF(378,356), + LEAF(381,359), /* ln */ - LEAF(379,357), LEAF(379,358), LEAF(379, 7), LEAF(379,359), + LEAF(382,360), LEAF(382,361), LEAF(382, 7), LEAF(382,362), /* lo */ - LEAF(383,360), + LEAF(386,363), /* lt */ - LEAF(384, 26), LEAF(384,361), + LEAF(387, 26), LEAF(387,364), /* lv */ - LEAF(386, 26), LEAF(386,362), + LEAF(389, 26), LEAF(389,365), /* mg */ - LEAF(388,363), + LEAF(391,366), /* mh */ - LEAF(389, 26), LEAF(389,364), + LEAF(392, 26), LEAF(392,367), /* mi */ - LEAF(391, 26), LEAF(391,182), LEAF(391,365), + LEAF(394, 26), LEAF(394,185), LEAF(394,368), /* miq */ - LEAF(394,366), LEAF(394,176), LEAF(394,367), + LEAF(397,369), LEAF(397,178), LEAF(397,370), /* mk */ - LEAF(397,368), - /* ml */ - LEAF(398,369), - /* mn_cn */ - LEAF(399,370), - /* mn_mn */ LEAF(400,371), - /* mni */ + /* ml */ LEAF(401,372), - /* mnw */ + /* mn_cn */ LEAF(402,373), + /* mn_mn */ + LEAF(403,374), + /* mni */ + LEAF(404,375), + /* mnw */ + LEAF(405,376), /* mo */ - LEAF(403,374), LEAF(403,144), LEAF(403,375), LEAF(403,347), + LEAF(406,377), LEAF(406,146), LEAF(406,378), LEAF(406,350), /* mt */ - LEAF(407,376), LEAF(407,377), + LEAF(410,379), LEAF(410,380), /* na */ - LEAF(409, 5), LEAF(409,378), + LEAF(412, 5), LEAF(412,381), /* nan */ - LEAF(411,157), LEAF(411, 52), LEAF(411, 53), LEAF(411, 54), - LEAF(411, 55), LEAF(411, 56), LEAF(411, 57), LEAF(411, 58), - LEAF(411, 59), LEAF(411, 60), LEAF(411, 61), LEAF(411, 62), - LEAF(411, 63), LEAF(411, 64), LEAF(411, 65), LEAF(411, 66), - LEAF(411, 67), LEAF(411, 68), LEAF(411, 69), LEAF(411, 70), - LEAF(411, 71), LEAF(411, 72), LEAF(411, 73), LEAF(411, 74), - LEAF(411, 75), LEAF(411, 76), LEAF(411, 77), LEAF(411, 78), - LEAF(411, 79), LEAF(411, 80), LEAF(411, 81), LEAF(411, 82), - LEAF(411, 83), LEAF(411, 84), LEAF(411, 85), LEAF(411, 86), - LEAF(411, 87), LEAF(411, 88), LEAF(411, 89), LEAF(411, 90), - LEAF(411, 91), LEAF(411, 92), LEAF(411, 93), LEAF(411, 94), - LEAF(411, 95), LEAF(411, 96), LEAF(411, 97), LEAF(411, 98), - LEAF(411, 99), LEAF(411,100), LEAF(411,101), LEAF(411,102), - LEAF(411,103), LEAF(411,104), LEAF(411,105), LEAF(411,106), - LEAF(411,107), LEAF(411,108), LEAF(411,109), LEAF(411,110), - LEAF(411,111), LEAF(411,112), LEAF(411,113), LEAF(411,114), - LEAF(411,115), LEAF(411,116), LEAF(411,117), LEAF(411,118), - LEAF(411,119), LEAF(411,120), LEAF(411,121), LEAF(411,122), - LEAF(411,123), LEAF(411,124), LEAF(411,125), LEAF(411,126), - LEAF(411,127), LEAF(411,128), LEAF(411,129), LEAF(411,130), - LEAF(411,131), LEAF(411,132), LEAF(411,133), LEAF(411,134), + LEAF(414,159), LEAF(414, 52), LEAF(414, 53), LEAF(414, 54), + LEAF(414, 55), LEAF(414, 56), LEAF(414, 57), LEAF(414, 58), + LEAF(414, 59), LEAF(414, 60), LEAF(414, 61), LEAF(414, 62), + LEAF(414, 63), LEAF(414, 64), LEAF(414, 65), LEAF(414, 66), + LEAF(414, 67), LEAF(414, 68), LEAF(414, 69), LEAF(414, 70), + LEAF(414, 71), LEAF(414, 72), LEAF(414, 73), LEAF(414, 74), + LEAF(414, 75), LEAF(414, 76), LEAF(414, 77), LEAF(414, 78), + LEAF(414, 79), LEAF(414, 80), LEAF(414, 81), LEAF(414, 82), + LEAF(414, 83), LEAF(414, 84), LEAF(414, 85), LEAF(414, 86), + LEAF(414, 87), LEAF(414, 88), LEAF(414, 89), LEAF(414, 90), + LEAF(414, 91), LEAF(414, 92), LEAF(414, 93), LEAF(414, 94), + LEAF(414, 95), LEAF(414, 96), LEAF(414, 97), LEAF(414, 98), + LEAF(414, 99), LEAF(414,100), LEAF(414,101), LEAF(414,102), + LEAF(414,103), LEAF(414,104), LEAF(414,105), LEAF(414,106), + LEAF(414,107), LEAF(414,108), LEAF(414,109), LEAF(414,110), + LEAF(414,111), LEAF(414,112), LEAF(414,113), LEAF(414,114), + LEAF(414,115), LEAF(414,116), LEAF(414,117), LEAF(414,118), + LEAF(414,119), LEAF(414,120), LEAF(414,121), LEAF(414,122), + LEAF(414,123), LEAF(414,124), LEAF(414,125), LEAF(414,126), + LEAF(414,127), LEAF(414,128), LEAF(414,129), LEAF(414,130), + LEAF(414,131), LEAF(414,132), LEAF(414,133), LEAF(414,134), /* nb */ - LEAF(495,379), + LEAF(498,382), /* ne */ - LEAF(496,380), + LEAF(499,383), /* nhn */ - LEAF(497, 12), LEAF(497,381), + LEAF(500, 12), LEAF(500,384), /* niu */ - LEAF(499,157), LEAF(499,382), + LEAF(502,159), LEAF(502,385), /* nl */ - LEAF(501,383), + LEAF(504,386), /* nn */ - LEAF(502,384), + LEAF(505,387), /* nqo */ - LEAF(503,385), + LEAF(506,388), /* nso */ - LEAF(504,386), LEAF(504,387), + LEAF(507,389), LEAF(507,390), /* nv */ - LEAF(506,388), LEAF(506,389), LEAF(506,390), LEAF(506,391), + LEAF(509,391), LEAF(509,392), LEAF(509,393), LEAF(509,394), /* ny */ - LEAF(510, 26), LEAF(510,392), + LEAF(513, 26), LEAF(513,395), /* oc */ - LEAF(512,393), - /* or */ - LEAF(513,394), - /* ota */ - LEAF(514,395), - /* pa */ LEAF(515,396), - /* pap_an */ + /* or */ LEAF(516,397), - /* pap_aw */ + /* ota */ LEAF(517,398), + /* pa */ + LEAF(518,399), + /* pap_an */ + LEAF(519,400), + /* pap_aw */ + LEAF(520,401), /* pl */ - LEAF(518,185), LEAF(518,399), + LEAF(521,188), LEAF(521,402), /* ps_af */ - LEAF(520,400), + LEAF(523,403), /* ps_pk */ - LEAF(521,401), + LEAF(524,404), /* pt */ - LEAF(522,402), + LEAF(525,405), /* qu */ - LEAF(523,398), LEAF(523,403), + LEAF(526,401), LEAF(526,406), /* rif */ - LEAF(525,157), LEAF(525,404), LEAF(525, 28), LEAF(525,405), + LEAF(528,159), LEAF(528,407), LEAF(528, 28), LEAF(528,408), /* rm */ - LEAF(529,406), + LEAF(532,409), /* ro */ - LEAF(530,374), LEAF(530,144), LEAF(530,375), + LEAF(533,377), LEAF(533,146), LEAF(533,378), /* sah */ - LEAF(533,407), + LEAF(536,410), /* sat */ - LEAF(534,408), + LEAF(537,411), /* sc */ - LEAF(535,409), + LEAF(538,412), /* sco */ - LEAF(536, 26), LEAF(536,410), LEAF(536,411), + LEAF(539, 26), LEAF(539,413), LEAF(539,414), /* sd */ - LEAF(539,412), - /* se */ - LEAF(540,413), LEAF(540,414), - /* sg */ LEAF(542,415), + /* se */ + LEAF(543,416), LEAF(543,417), + /* sg */ + LEAF(545,418), /* sgs */ - LEAF(543,416), LEAF(543,417), LEAF(543,418), + LEAF(546,419), LEAF(546,420), LEAF(546,421), /* sh */ - LEAF(546, 26), LEAF(546, 42), LEAF(546,419), + LEAF(549, 26), LEAF(549, 42), LEAF(549,422), /* shs */ - LEAF(549,420), LEAF(549,421), + LEAF(552,423), LEAF(552,424), /* si */ - LEAF(551,422), + LEAF(554,425), /* sid */ - LEAF(552,423), LEAF(552, 11), + LEAF(555,426), LEAF(555, 11), /* sk */ - LEAF(554,424), LEAF(554,425), + LEAF(557,427), LEAF(557,428), /* sm */ - LEAF(556, 26), LEAF(556,183), + LEAF(559, 26), LEAF(559,186), /* sma */ - LEAF(558,426), + LEAF(561,429), /* smj */ - LEAF(559,427), + LEAF(562,430), /* smn */ - LEAF(560,428), LEAF(560,429), + LEAF(563,431), LEAF(563,432), /* sms */ - LEAF(562,430), LEAF(562,431), LEAF(562,432), + LEAF(565,433), LEAF(565,434), LEAF(565,435), /* sq */ - LEAF(565,433), - /* sr */ - LEAF(566,434), - /* sv */ - LEAF(567,435), - /* syr */ LEAF(568,436), - /* szl */ - LEAF(569,437), LEAF(569,438), - /* ta */ + /* sr */ + LEAF(569,437), + /* sv */ + LEAF(570,438), + /* syr */ LEAF(571,439), - /* te */ - LEAF(572,440), - /* tg */ - LEAF(573,441), - /* th */ + /* szl */ + LEAF(572,440), LEAF(572,441), + /* ta */ LEAF(574,442), + /* te */ + LEAF(575,443), + /* tg */ + LEAF(576,444), + /* th */ + LEAF(577,445), /* tig */ - LEAF(575,443), LEAF(575, 45), + LEAF(578,446), LEAF(578, 45), /* tk */ - LEAF(577,444), LEAF(577,445), + LEAF(580,447), LEAF(580,448), /* tr */ - LEAF(579,446), LEAF(579,138), + LEAF(582,449), LEAF(582,140), /* tt */ - LEAF(581,447), + LEAF(584,450), /* ty */ - LEAF(582,448), LEAF(582,182), LEAF(582,390), + LEAF(585,451), LEAF(585,185), LEAF(585,393), /* ug */ - LEAF(585,449), + LEAF(588,452), /* uk */ - LEAF(586,450), + LEAF(589,453), /* und_zmth */ - LEAF(587,451), LEAF(587,452), LEAF(587,453), LEAF(587,454), - LEAF(587,455), LEAF(587,456), LEAF(587,457), LEAF(587,458), - LEAF(587,459), LEAF(587,460), LEAF(587,461), LEAF(587,462), + LEAF(590,454), LEAF(590,455), LEAF(590,456), LEAF(590,457), + LEAF(590,458), LEAF(590,459), LEAF(590,460), LEAF(590,461), + LEAF(590,462), LEAF(590,463), LEAF(590,464), LEAF(590,465), /* und_zsye */ - LEAF(599,463), LEAF(599,464), LEAF(599,465), LEAF(599,466), - LEAF(599,467), LEAF(599,468), LEAF(599,469), LEAF(599,470), - LEAF(599,471), LEAF(599,472), LEAF(599,473), LEAF(599,474), + LEAF(602,466), LEAF(602,467), LEAF(602,468), LEAF(602,469), + LEAF(602,470), LEAF(602,471), LEAF(602,472), LEAF(602,473), + LEAF(602,474), LEAF(602,475), LEAF(602,476), LEAF(602,477), /* ve */ - LEAF(611, 26), LEAF(611,475), + LEAF(614, 26), LEAF(614,478), /* vi */ - LEAF(613,476), LEAF(613,477), LEAF(613,478), LEAF(613,479), + LEAF(616,479), LEAF(616,480), LEAF(616,481), LEAF(616,482), /* vo */ - LEAF(617,480), + LEAF(620,483), /* vot */ - LEAF(618,481), LEAF(618,160), + LEAF(621,484), LEAF(621,162), /* wa */ - LEAF(620,482), + LEAF(623,485), /* wen */ - LEAF(621,185), LEAF(621,483), + LEAF(624,188), LEAF(624,486), /* wo */ - LEAF(623,484), LEAF(623,354), + LEAF(626,487), LEAF(626,357), /* yap */ - LEAF(625,485), + LEAF(628,488), /* yo */ - LEAF(626,486), LEAF(626,487), LEAF(626,488), LEAF(626,489), + LEAF(629,489), LEAF(629,490), LEAF(629,491), LEAF(629,492), /* yue */ - LEAF(630,490), LEAF(630,491), LEAF(630,492), LEAF(630,493), - LEAF(630,494), LEAF(630,495), LEAF(630,496), LEAF(630,497), - LEAF(630,498), LEAF(630,499), LEAF(630,500), LEAF(630,501), - LEAF(630,502), LEAF(630,503), LEAF(630,504), LEAF(630,505), - LEAF(630,506), LEAF(630,507), LEAF(630,508), LEAF(630,509), - LEAF(630,510), LEAF(630,511), LEAF(630,512), LEAF(630,513), - LEAF(630,514), LEAF(630,515), LEAF(630,516), LEAF(630,517), - LEAF(630,518), LEAF(630,519), LEAF(630,520), LEAF(630,521), - LEAF(630,522), LEAF(630,523), LEAF(630,524), LEAF(630,525), - LEAF(630,526), LEAF(630,527), LEAF(630,528), LEAF(630,529), - LEAF(630,530), LEAF(630,531), LEAF(630,532), LEAF(630,533), - LEAF(630,534), LEAF(630,535), LEAF(630,536), LEAF(630,537), - LEAF(630,538), LEAF(630,539), LEAF(630,540), LEAF(630,541), - LEAF(630,542), LEAF(630,543), LEAF(630,544), LEAF(630,545), - LEAF(630,546), LEAF(630,547), LEAF(630,548), LEAF(630,549), - LEAF(630,550), LEAF(630,551), LEAF(630,552), LEAF(630,553), - LEAF(630,554), LEAF(630,555), LEAF(630,556), LEAF(630,557), - LEAF(630,558), LEAF(630,559), LEAF(630,560), LEAF(630,561), - LEAF(630,562), LEAF(630,563), LEAF(630,564), LEAF(630,565), - LEAF(630,566), LEAF(630,567), LEAF(630,568), LEAF(630,569), - LEAF(630,570), LEAF(630,571), LEAF(630,572), LEAF(630,573), - LEAF(630,574), LEAF(630,575), LEAF(630,576), LEAF(630,577), - LEAF(630,578), LEAF(630,579), LEAF(630,580), LEAF(630,581), - LEAF(630,582), LEAF(630,583), LEAF(630,584), LEAF(630,585), - LEAF(630,586), LEAF(630,587), LEAF(630,588), LEAF(630,589), - LEAF(630,590), LEAF(630,591), LEAF(630,592), LEAF(630,593), - LEAF(630,594), LEAF(630,595), LEAF(630,596), LEAF(630,597), - LEAF(630,598), LEAF(630,599), LEAF(630,600), LEAF(630,601), - LEAF(630,602), LEAF(630,603), LEAF(630,604), LEAF(630,605), - LEAF(630,606), LEAF(630,607), LEAF(630,608), LEAF(630,609), - LEAF(630,610), LEAF(630,611), LEAF(630,612), LEAF(630,613), - LEAF(630,614), LEAF(630,615), LEAF(630,616), LEAF(630,617), - LEAF(630,618), LEAF(630,619), LEAF(630,452), LEAF(630,620), - LEAF(630,621), LEAF(630,410), LEAF(630,622), LEAF(630,623), - LEAF(630,624), LEAF(630,625), LEAF(630,626), LEAF(630,627), - LEAF(630,628), LEAF(630, 3), LEAF(630,629), LEAF(630,630), - LEAF(630,631), LEAF(630,632), LEAF(630,633), LEAF(630,634), - LEAF(630,619), LEAF(630,635), LEAF(630,636), LEAF(630,637), - LEAF(630,638), LEAF(630,639), LEAF(630,640), LEAF(630,641), - LEAF(630,642), LEAF(630,643), LEAF(630,644), LEAF(630,645), - LEAF(630,646), LEAF(630,647), LEAF(630,648), LEAF(630,649), - LEAF(630,650), LEAF(630,651), LEAF(630,652), LEAF(630,653), - LEAF(630,654), LEAF(630,655), LEAF(630,656), + LEAF(633,493), LEAF(633,494), LEAF(633,495), LEAF(633,496), + LEAF(633,497), LEAF(633,498), LEAF(633,499), LEAF(633,500), + LEAF(633,501), LEAF(633,502), LEAF(633,503), LEAF(633,504), + LEAF(633,505), LEAF(633,506), LEAF(633,507), LEAF(633,508), + LEAF(633,509), LEAF(633,510), LEAF(633,511), LEAF(633,512), + LEAF(633,513), LEAF(633,514), LEAF(633,515), LEAF(633,516), + LEAF(633,517), LEAF(633,518), LEAF(633,519), LEAF(633,520), + LEAF(633,521), LEAF(633,522), LEAF(633,523), LEAF(633,524), + LEAF(633,525), LEAF(633,526), LEAF(633,527), LEAF(633,528), + LEAF(633,529), LEAF(633,530), LEAF(633,531), LEAF(633,532), + LEAF(633,533), LEAF(633,534), LEAF(633,535), LEAF(633,536), + LEAF(633,537), LEAF(633,538), LEAF(633,539), LEAF(633,540), + LEAF(633,541), LEAF(633,542), LEAF(633,543), LEAF(633,544), + LEAF(633,545), LEAF(633,546), LEAF(633,547), LEAF(633,548), + LEAF(633,549), LEAF(633,550), LEAF(633,551), LEAF(633,552), + LEAF(633,553), LEAF(633,554), LEAF(633,555), LEAF(633,556), + LEAF(633,557), LEAF(633,558), LEAF(633,559), LEAF(633,560), + LEAF(633,561), LEAF(633,562), LEAF(633,563), LEAF(633,564), + LEAF(633,565), LEAF(633,566), LEAF(633,567), LEAF(633,568), + LEAF(633,569), LEAF(633,570), LEAF(633,571), LEAF(633,572), + LEAF(633,573), LEAF(633,574), LEAF(633,575), LEAF(633,576), + LEAF(633,577), LEAF(633,578), LEAF(633,579), LEAF(633,580), + LEAF(633,581), LEAF(633,582), LEAF(633,583), LEAF(633,584), + LEAF(633,585), LEAF(633,586), LEAF(633,587), LEAF(633,588), + LEAF(633,589), LEAF(633,590), LEAF(633,591), LEAF(633,592), + LEAF(633,593), LEAF(633,594), LEAF(633,595), LEAF(633,596), + LEAF(633,597), LEAF(633,598), LEAF(633,599), LEAF(633,600), + LEAF(633,601), LEAF(633,602), LEAF(633,603), LEAF(633,604), + LEAF(633,605), LEAF(633,606), LEAF(633,607), LEAF(633,608), + LEAF(633,609), LEAF(633,610), LEAF(633,611), LEAF(633,612), + LEAF(633,613), LEAF(633,614), LEAF(633,615), LEAF(633,616), + LEAF(633,617), LEAF(633,618), LEAF(633,619), LEAF(633,620), + LEAF(633,621), LEAF(633,622), LEAF(633,455), LEAF(633,623), + LEAF(633,624), LEAF(633,413), LEAF(633,625), LEAF(633,626), + LEAF(633,627), LEAF(633,628), LEAF(633,629), LEAF(633,630), + LEAF(633,631), LEAF(633, 3), LEAF(633,632), LEAF(633,633), + LEAF(633,634), LEAF(633,635), LEAF(633,636), LEAF(633,637), + LEAF(633,622), LEAF(633,638), LEAF(633,639), LEAF(633,640), + LEAF(633,641), LEAF(633,642), LEAF(633,643), LEAF(633,644), + LEAF(633,645), LEAF(633,646), LEAF(633,647), LEAF(633,648), + LEAF(633,649), LEAF(633,650), LEAF(633,651), LEAF(633,652), + LEAF(633,653), LEAF(633,654), LEAF(633,655), LEAF(633,656), + LEAF(633,657), LEAF(633,658), LEAF(633,659), /* zh_cn */ - LEAF(801,657), LEAF(801,658), LEAF(801,659), LEAF(801,660), - LEAF(801,661), LEAF(801,662), LEAF(801,663), LEAF(801,664), - LEAF(801,665), LEAF(801,666), LEAF(801,667), LEAF(801,668), - LEAF(801,669), LEAF(801,670), LEAF(801,671), LEAF(801,672), - LEAF(801,673), LEAF(801,674), LEAF(801,675), LEAF(801,676), - LEAF(801,677), LEAF(801,678), LEAF(801,679), LEAF(801,680), - LEAF(801,681), LEAF(801,682), LEAF(801,683), LEAF(801,684), - LEAF(801,685), LEAF(801,686), LEAF(801,687), LEAF(801,688), - LEAF(801,689), LEAF(801,690), LEAF(801,691), LEAF(801,692), - LEAF(801,693), LEAF(801,694), LEAF(801,695), LEAF(801,696), - LEAF(801,697), LEAF(801,698), LEAF(801,699), LEAF(801,700), - LEAF(801,701), LEAF(801,702), LEAF(801,703), LEAF(801,704), - LEAF(801,705), LEAF(801,706), LEAF(801,707), LEAF(801,708), - LEAF(801,709), LEAF(801,710), LEAF(801,711), LEAF(801,712), - LEAF(801,713), LEAF(801,714), LEAF(801,715), LEAF(801,716), - LEAF(801,717), LEAF(801,718), LEAF(801,719), LEAF(801,720), - LEAF(801,721), LEAF(801,722), LEAF(801,723), LEAF(801,724), - LEAF(801,725), LEAF(801,726), LEAF(801,727), LEAF(801,728), - LEAF(801,729), LEAF(801,730), LEAF(801,731), LEAF(801,732), - LEAF(801,733), LEAF(801,734), LEAF(801,735), LEAF(801,736), - LEAF(801,737), LEAF(801,738), + LEAF(804,660), LEAF(804,661), LEAF(804,662), LEAF(804,663), + LEAF(804,664), LEAF(804,665), LEAF(804,666), LEAF(804,667), + LEAF(804,668), LEAF(804,669), LEAF(804,670), LEAF(804,671), + LEAF(804,672), LEAF(804,673), LEAF(804,674), LEAF(804,675), + LEAF(804,676), LEAF(804,677), LEAF(804,678), LEAF(804,679), + LEAF(804,680), LEAF(804,681), LEAF(804,682), LEAF(804,683), + LEAF(804,684), LEAF(804,685), LEAF(804,686), LEAF(804,687), + LEAF(804,688), LEAF(804,689), LEAF(804,690), LEAF(804,691), + LEAF(804,692), LEAF(804,693), LEAF(804,694), LEAF(804,695), + LEAF(804,696), LEAF(804,697), LEAF(804,698), LEAF(804,699), + LEAF(804,700), LEAF(804,701), LEAF(804,702), LEAF(804,703), + LEAF(804,704), LEAF(804,705), LEAF(804,706), LEAF(804,707), + LEAF(804,708), LEAF(804,709), LEAF(804,710), LEAF(804,711), + LEAF(804,712), LEAF(804,713), LEAF(804,714), LEAF(804,715), + LEAF(804,716), LEAF(804,717), LEAF(804,718), LEAF(804,719), + LEAF(804,720), LEAF(804,721), LEAF(804,722), LEAF(804,723), + LEAF(804,724), LEAF(804,725), LEAF(804,726), LEAF(804,727), + LEAF(804,728), LEAF(804,729), LEAF(804,730), LEAF(804,731), + LEAF(804,732), LEAF(804,733), LEAF(804,734), LEAF(804,735), + LEAF(804,736), LEAF(804,737), LEAF(804,738), LEAF(804,739), + LEAF(804,740), LEAF(804,741), }, { /* aa */ @@ -3904,6 +3922,8 @@ 0x009e, 0x009f, 0x00fa, /* co */ 0x0000, 0x0001, + /* cop */ + 0x0003, 0x002c, /* crh */ 0x0000, 0x0001, /* cs */ @@ -3956,6 +3976,8 @@ 0x0012, 0x0013, /* gn */ 0x0000, 0x0001, 0x001e, + /* got */ + 0x0103, /* gu */ 0x000a, /* gv */ @@ -4321,6 +4343,7 @@ 255, /* ckb */ 256, /* cmn */ 29, /* co */ + 280, /* cop */ 195, /* crh */ 30, /* cs */ 196, /* csb */ @@ -4355,6 +4378,7 @@ 53, /* gez */ 54, /* gl */ 55, /* gn */ + 279, /* got */ 56, /* gu */ 57, /* gv */ 58, /* ha */ @@ -4589,259 +4613,261 @@ 38, /* chm */ 39, /* chr */ 42, /* co */ - 44, /* cs */ - 46, /* cu */ - 47, /* cv */ - 48, /* cy */ - 49, /* da */ - 50, /* de */ - 54, /* dz */ - 56, /* el */ - 57, /* en */ - 58, /* eo */ - 59, /* es */ - 60, /* et */ - 61, /* eu */ - 62, /* fa */ - 65, /* fi */ - 67, /* fj */ - 68, /* fo */ - 69, /* fr */ - 64, /* ff */ - 70, /* fur */ - 71, /* fy */ - 72, /* ga */ - 73, /* gd */ - 74, /* gez */ - 75, /* gl */ - 76, /* gn */ - 77, /* gu */ - 78, /* gv */ - 79, /* ha */ - 81, /* haw */ - 82, /* he */ - 83, /* hi */ - 86, /* ho */ - 87, /* hr */ - 90, /* hu */ - 91, /* hy */ - 93, /* ia */ - 96, /* ig */ - 94, /* id */ - 95, /* ie */ - 98, /* ik */ - 99, /* io */ - 100, /* is */ - 101, /* it */ - 102, /* iu */ - 103, /* ja */ - 105, /* ka */ - 106, /* kaa */ - 108, /* ki */ - 110, /* kk */ - 111, /* kl */ - 112, /* km */ - 113, /* kn */ - 114, /* ko */ - 115, /* kok */ - 117, /* ks */ - 118, /* ku_am */ - 120, /* ku_ir */ - 122, /* kum */ - 123, /* kv */ - 124, /* kw */ - 126, /* ky */ - 127, /* la */ - 129, /* lb */ - 130, /* lez */ - 134, /* ln */ - 135, /* lo */ - 136, /* lt */ - 137, /* lv */ - 142, /* mg */ - 143, /* mh */ - 145, /* mi */ - 148, /* mk */ - 149, /* ml */ - 150, /* mn_cn */ - 154, /* mo */ - 155, /* mr */ - 157, /* mt */ - 158, /* my */ - 161, /* nb */ - 162, /* nds */ - 163, /* ne */ - 167, /* nl */ - 168, /* nn */ - 169, /* no */ - 171, /* nr */ - 172, /* nso */ - 174, /* ny */ - 175, /* oc */ - 176, /* om */ - 177, /* or */ - 178, /* os */ - 180, /* pa */ - 184, /* pl */ - 185, /* ps_af */ - 186, /* ps_pk */ - 187, /* pt */ - 192, /* rm */ - 194, /* ro */ - 195, /* ru */ - 197, /* sa */ - 198, /* sah */ - 201, /* sco */ - 203, /* se */ - 204, /* sel */ - 207, /* sh */ - 209, /* shs */ - 210, /* si */ - 212, /* sk */ - 213, /* sl */ - 214, /* sm */ - 215, /* sma */ - 216, /* smj */ - 217, /* smn */ - 218, /* sms */ - 220, /* so */ - 221, /* sq */ - 222, /* sr */ - 223, /* ss */ - 224, /* st */ - 226, /* sv */ - 227, /* sw */ - 228, /* syr */ - 230, /* ta */ - 232, /* te */ - 233, /* tg */ - 234, /* th */ - 236, /* ti_er */ - 237, /* ti_et */ - 238, /* tig */ - 239, /* tk */ - 240, /* tl */ - 241, /* tn */ - 242, /* to */ - 244, /* tr */ - 245, /* ts */ - 246, /* tt */ - 247, /* tw */ - 249, /* tyv */ - 250, /* ug */ - 251, /* uk */ - 255, /* ur */ - 256, /* uz */ - 257, /* ve */ - 258, /* vi */ - 259, /* vo */ - 260, /* vot */ - 261, /* wa */ - 264, /* wen */ - 265, /* wo */ - 266, /* xh */ - 267, /* yap */ - 268, /* yi */ - 269, /* yo */ - 273, /* zh_cn */ - 274, /* zh_hk */ - 275, /* zh_mo */ - 276, /* zh_sg */ - 277, /* zh_tw */ - 278, /* zu */ + 45, /* cs */ + 47, /* cu */ + 48, /* cv */ + 49, /* cy */ + 50, /* da */ + 51, /* de */ + 55, /* dz */ + 57, /* el */ + 58, /* en */ + 59, /* eo */ + 60, /* es */ + 61, /* et */ + 62, /* eu */ + 63, /* fa */ + 66, /* fi */ + 68, /* fj */ + 69, /* fo */ + 70, /* fr */ + 65, /* ff */ + 71, /* fur */ + 72, /* fy */ + 73, /* ga */ + 74, /* gd */ + 75, /* gez */ + 76, /* gl */ + 77, /* gn */ + 79, /* gu */ + 80, /* gv */ + 81, /* ha */ + 83, /* haw */ + 84, /* he */ + 85, /* hi */ + 88, /* ho */ + 89, /* hr */ + 92, /* hu */ + 93, /* hy */ + 95, /* ia */ + 98, /* ig */ + 96, /* id */ + 97, /* ie */ + 100, /* ik */ + 101, /* io */ + 102, /* is */ + 103, /* it */ + 104, /* iu */ + 105, /* ja */ + 107, /* ka */ + 108, /* kaa */ + 110, /* ki */ + 112, /* kk */ + 113, /* kl */ + 114, /* km */ + 115, /* kn */ + 116, /* ko */ + 117, /* kok */ + 119, /* ks */ + 120, /* ku_am */ + 122, /* ku_ir */ + 124, /* kum */ + 125, /* kv */ + 126, /* kw */ + 128, /* ky */ + 129, /* la */ + 131, /* lb */ + 132, /* lez */ + 136, /* ln */ + 137, /* lo */ + 138, /* lt */ + 139, /* lv */ + 144, /* mg */ + 145, /* mh */ + 147, /* mi */ + 150, /* mk */ + 151, /* ml */ + 152, /* mn_cn */ + 156, /* mo */ + 157, /* mr */ + 159, /* mt */ + 160, /* my */ + 163, /* nb */ + 164, /* nds */ + 165, /* ne */ + 169, /* nl */ + 170, /* nn */ + 171, /* no */ + 173, /* nr */ + 174, /* nso */ + 176, /* ny */ + 177, /* oc */ + 178, /* om */ + 179, /* or */ + 180, /* os */ + 182, /* pa */ + 186, /* pl */ + 187, /* ps_af */ + 188, /* ps_pk */ + 189, /* pt */ + 194, /* rm */ + 196, /* ro */ + 197, /* ru */ + 199, /* sa */ + 200, /* sah */ + 203, /* sco */ + 205, /* se */ + 206, /* sel */ + 209, /* sh */ + 211, /* shs */ + 212, /* si */ + 214, /* sk */ + 215, /* sl */ + 216, /* sm */ + 217, /* sma */ + 218, /* smj */ + 219, /* smn */ + 220, /* sms */ + 222, /* so */ + 223, /* sq */ + 224, /* sr */ + 225, /* ss */ + 226, /* st */ + 228, /* sv */ + 229, /* sw */ + 230, /* syr */ + 232, /* ta */ + 234, /* te */ + 235, /* tg */ + 236, /* th */ + 238, /* ti_er */ + 239, /* ti_et */ + 240, /* tig */ + 241, /* tk */ + 242, /* tl */ + 243, /* tn */ + 244, /* to */ + 246, /* tr */ + 247, /* ts */ + 248, /* tt */ + 249, /* tw */ + 251, /* tyv */ + 252, /* ug */ + 253, /* uk */ + 257, /* ur */ + 258, /* uz */ + 259, /* ve */ + 260, /* vi */ + 261, /* vo */ + 262, /* vot */ + 263, /* wa */ + 266, /* wen */ + 267, /* wo */ + 268, /* xh */ + 269, /* yap */ + 270, /* yi */ + 271, /* yo */ + 275, /* zh_cn */ + 276, /* zh_hk */ + 277, /* zh_mo */ + 278, /* zh_sg */ + 279, /* zh_tw */ + 280, /* zu */ 4, /* ak */ 6, /* an */ 19, /* ber_dz */ 20, /* ber_ma */ 34, /* byn */ - 43, /* crh */ - 45, /* csb */ - 53, /* dv */ - 55, /* ee */ - 63, /* fat */ - 66, /* fil */ - 85, /* hne */ - 88, /* hsb */ - 89, /* ht */ - 92, /* hz */ - 97, /* ii */ - 104, /* jv */ - 107, /* kab */ - 109, /* kj */ - 116, /* kr */ - 119, /* ku_iq */ - 121, /* ku_tr */ - 125, /* kwm */ - 131, /* lg */ - 132, /* li */ - 140, /* mai */ - 151, /* mn_mn */ - 156, /* ms */ - 159, /* na */ - 164, /* ng */ - 173, /* nv */ - 179, /* ota */ - 181, /* pa_pk */ - 182, /* pap_an */ - 183, /* pap_aw */ - 188, /* qu */ - 189, /* quz */ - 193, /* rn */ - 196, /* rw */ - 200, /* sc */ - 202, /* sd */ - 205, /* sg */ - 211, /* sid */ - 219, /* sn */ - 225, /* su */ - 248, /* ty */ - 263, /* wal */ - 272, /* za */ - 128, /* lah */ - 170, /* nqo */ + 44, /* crh */ + 46, /* csb */ + 54, /* dv */ + 56, /* ee */ + 64, /* fat */ + 67, /* fil */ + 87, /* hne */ + 90, /* hsb */ + 91, /* ht */ + 94, /* hz */ + 99, /* ii */ + 106, /* jv */ + 109, /* kab */ + 111, /* kj */ + 118, /* kr */ + 121, /* ku_iq */ + 123, /* ku_tr */ + 127, /* kwm */ + 133, /* lg */ + 134, /* li */ + 142, /* mai */ + 153, /* mn_mn */ + 158, /* ms */ + 161, /* na */ + 166, /* ng */ + 175, /* nv */ + 181, /* ota */ + 183, /* pa_pk */ + 184, /* pap_an */ + 185, /* pap_aw */ + 190, /* qu */ + 191, /* quz */ + 195, /* rn */ + 198, /* rw */ + 202, /* sc */ + 204, /* sd */ + 207, /* sg */ + 213, /* sid */ + 221, /* sn */ + 227, /* su */ + 250, /* ty */ + 265, /* wal */ + 274, /* za */ + 130, /* lah */ + 172, /* nqo */ 31, /* brx */ - 199, /* sat */ - 51, /* doi */ - 152, /* mni */ - 253, /* und_zsye */ - 252, /* und_zmth */ + 201, /* sat */ + 52, /* doi */ + 154, /* mni */ + 255, /* und_zsye */ + 254, /* und_zmth */ 7, /* anp */ 23, /* bhb */ - 84, /* hif */ - 139, /* mag */ - 190, /* raj */ - 235, /* the */ + 86, /* hif */ + 141, /* mag */ + 192, /* raj */ + 237, /* the */ 3, /* agr */ 13, /* ayc */ 18, /* bem */ 40, /* ckb */ 41, /* cmn */ - 52, /* dsb */ - 80, /* hak */ - 133, /* lij */ - 138, /* lzh */ - 141, /* mfe */ - 144, /* mhr */ - 146, /* miq */ - 147, /* mjw */ - 153, /* mnw */ - 160, /* nan */ - 165, /* nhn */ - 166, /* niu */ - 191, /* rif */ - 206, /* sgs */ - 208, /* shn */ - 229, /* szl */ - 231, /* tcy */ - 243, /* tpi */ - 254, /* unm */ - 262, /* wae */ - 270, /* yue */ - 271, /* yuw */ + 53, /* dsb */ + 82, /* hak */ + 135, /* lij */ + 140, /* lzh */ + 143, /* mfe */ + 146, /* mhr */ + 148, /* miq */ + 149, /* mjw */ + 155, /* mnw */ + 162, /* nan */ + 167, /* nhn */ + 168, /* niu */ + 193, /* rif */ + 208, /* sgs */ + 210, /* shn */ + 231, /* szl */ + 233, /* tcy */ + 245, /* tpi */ + 256, /* unm */ + 264, /* wae */ + 272, /* yue */ + 273, /* yuw */ + 78, /* got */ + 43, /* cop */ } }; -#define NUM_LANG_CHAR_SET 279 +#define NUM_LANG_CHAR_SET 281 #define NUM_LANG_SET_MAP 9 static const FcChar32 fcLangCountrySets[][NUM_LANG_SET_MAP] = { @@ -4863,29 +4889,29 @@ { 0, 15 }, /* a */ { 16, 34 }, /* b */ - { 35, 48 }, /* c */ - { 49, 54 }, /* d */ - { 55, 61 }, /* e */ - { 62, 71 }, /* f */ - { 72, 78 }, /* g */ - { 79, 92 }, /* h */ - { 93, 102 }, /* i */ - { 103, 104 }, /* j */ - { 105, 126 }, /* k */ - { 127, 138 }, /* l */ - { 139, 158 }, /* m */ - { 159, 174 }, /* n */ - { 175, 179 }, /* o */ - { 180, 187 }, /* p */ - { 188, 189 }, /* q */ - { 190, 196 }, /* r */ - { 197, 229 }, /* s */ - { 230, 249 }, /* t */ - { 250, 256 }, /* u */ - { 257, 260 }, /* v */ - { 261, 265 }, /* w */ - { 266, 266 }, /* x */ - { 267, 271 }, /* y */ - { 272, 278 }, /* z */ + { 35, 49 }, /* c */ + { 50, 55 }, /* d */ + { 56, 62 }, /* e */ + { 63, 72 }, /* f */ + { 73, 80 }, /* g */ + { 81, 94 }, /* h */ + { 95, 104 }, /* i */ + { 105, 106 }, /* j */ + { 107, 128 }, /* k */ + { 129, 140 }, /* l */ + { 141, 160 }, /* m */ + { 161, 176 }, /* n */ + { 177, 181 }, /* o */ + { 182, 189 }, /* p */ + { 190, 191 }, /* q */ + { 192, 198 }, /* r */ + { 199, 231 }, /* s */ + { 232, 251 }, /* t */ + { 252, 258 }, /* u */ + { 259, 262 }, /* v */ + { 263, 267 }, /* w */ + { 268, 268 }, /* x */ + { 269, 273 }, /* y */ + { 274, 280 }, /* z */ };
diff --git a/third_party/fontconfig/include/fcalias.h b/third_party/fontconfig/include/fcalias.h index 177938d..30a441e6 100644 --- a/third_party/fontconfig/include/fcalias.h +++ b/third_party/fontconfig/include/fcalias.h
@@ -64,12 +64,18 @@ #define FcConfigSetRescanInterval IA__FcConfigSetRescanInterval extern __typeof (FcConfigGetFonts) IA__FcConfigGetFonts FC_ATTRIBUTE_VISIBILITY_HIDDEN; #define FcConfigGetFonts IA__FcConfigGetFonts +extern __typeof (FcConfigAcceptFont) IA__FcConfigAcceptFont FC_ATTRIBUTE_VISIBILITY_HIDDEN; +#define FcConfigAcceptFont IA__FcConfigAcceptFont +extern __typeof (FcConfigAcceptFilter) IA__FcConfigAcceptFilter FC_ATTRIBUTE_VISIBILITY_HIDDEN; +#define FcConfigAcceptFilter IA__FcConfigAcceptFilter extern __typeof (FcConfigAppFontAddFile) IA__FcConfigAppFontAddFile FC_ATTRIBUTE_VISIBILITY_HIDDEN; #define FcConfigAppFontAddFile IA__FcConfigAppFontAddFile extern __typeof (FcConfigAppFontAddDir) IA__FcConfigAppFontAddDir FC_ATTRIBUTE_VISIBILITY_HIDDEN; #define FcConfigAppFontAddDir IA__FcConfigAppFontAddDir extern __typeof (FcConfigAppFontClear) IA__FcConfigAppFontClear FC_ATTRIBUTE_VISIBILITY_HIDDEN; #define FcConfigAppFontClear IA__FcConfigAppFontClear +extern __typeof (FcConfigPreferAppFont) IA__FcConfigPreferAppFont FC_ATTRIBUTE_VISIBILITY_HIDDEN; +#define FcConfigPreferAppFont IA__FcConfigPreferAppFont extern __typeof (FcConfigSubstituteWithPat) IA__FcConfigSubstituteWithPat FC_ATTRIBUTE_VISIBILITY_HIDDEN; #define FcConfigSubstituteWithPat IA__FcConfigSubstituteWithPat extern __typeof (FcConfigSubstitute) IA__FcConfigSubstitute FC_ATTRIBUTE_VISIBILITY_HIDDEN; @@ -78,6 +84,8 @@ #define FcConfigGetSysRoot IA__FcConfigGetSysRoot extern __typeof (FcConfigSetSysRoot) IA__FcConfigSetSysRoot FC_ATTRIBUTE_VISIBILITY_HIDDEN; #define FcConfigSetSysRoot IA__FcConfigSetSysRoot +extern __typeof (FcConfigSetFontSetFilter) IA__FcConfigSetFontSetFilter FC_ATTRIBUTE_VISIBILITY_HIDDEN; +#define FcConfigSetFontSetFilter IA__FcConfigSetFontSetFilter extern __typeof (FcConfigFileInfoIterInit) IA__FcConfigFileInfoIterInit FC_ATTRIBUTE_VISIBILITY_HIDDEN; #define FcConfigFileInfoIterInit IA__FcConfigFileInfoIterInit extern __typeof (FcConfigFileInfoIterNext) IA__FcConfigFileInfoIterNext FC_ATTRIBUTE_VISIBILITY_HIDDEN;
diff --git a/third_party/fontconfig/include/fcaliastail.h b/third_party/fontconfig/include/fcaliastail.h index ec8a507..dfaf30b 100644 --- a/third_party/fontconfig/include/fcaliastail.h +++ b/third_party/fontconfig/include/fcaliastail.h
@@ -70,12 +70,18 @@ extern __typeof (FcConfigSetRescanInterval) FcConfigSetRescanInterval __attribute((alias("IA__FcConfigSetRescanInterval"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigGetFonts extern __typeof (FcConfigGetFonts) FcConfigGetFonts __attribute((alias("IA__FcConfigGetFonts"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; +# undef FcConfigAcceptFont +extern __typeof (FcConfigAcceptFont) FcConfigAcceptFont __attribute((alias("IA__FcConfigAcceptFont"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; +# undef FcConfigAcceptFilter +extern __typeof (FcConfigAcceptFilter) FcConfigAcceptFilter __attribute((alias("IA__FcConfigAcceptFilter"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigAppFontAddFile extern __typeof (FcConfigAppFontAddFile) FcConfigAppFontAddFile __attribute((alias("IA__FcConfigAppFontAddFile"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigAppFontAddDir extern __typeof (FcConfigAppFontAddDir) FcConfigAppFontAddDir __attribute((alias("IA__FcConfigAppFontAddDir"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigAppFontClear extern __typeof (FcConfigAppFontClear) FcConfigAppFontClear __attribute((alias("IA__FcConfigAppFontClear"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; +# undef FcConfigPreferAppFont +extern __typeof (FcConfigPreferAppFont) FcConfigPreferAppFont __attribute((alias("IA__FcConfigPreferAppFont"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigSubstituteWithPat extern __typeof (FcConfigSubstituteWithPat) FcConfigSubstituteWithPat __attribute((alias("IA__FcConfigSubstituteWithPat"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigSubstitute @@ -84,6 +90,8 @@ extern __typeof (FcConfigGetSysRoot) FcConfigGetSysRoot __attribute((alias("IA__FcConfigGetSysRoot"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigSetSysRoot extern __typeof (FcConfigSetSysRoot) FcConfigSetSysRoot __attribute((alias("IA__FcConfigSetSysRoot"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; +# undef FcConfigSetFontSetFilter +extern __typeof (FcConfigSetFontSetFilter) FcConfigSetFontSetFilter __attribute((alias("IA__FcConfigSetFontSetFilter"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigFileInfoIterInit extern __typeof (FcConfigFileInfoIterInit) FcConfigFileInfoIterInit __attribute((alias("IA__FcConfigFileInfoIterInit"))) FC_ATTRIBUTE_VISIBILITY_EXPORT; # undef FcConfigFileInfoIterNext
diff --git a/third_party/fontconfig/include/meson-config.h b/third_party/fontconfig/include/meson-config.h new file mode 100644 index 0000000..4e99a6d --- /dev/null +++ b/third_party/fontconfig/include/meson-config.h
@@ -0,0 +1,163 @@ +/* + * Autogenerated by the Meson build system. + * Do not edit, your changes will be lost. + */ + +#pragma once + +#define ALIGNOF_DOUBLE 8 + +#define ALIGNOF_VOID_P 8 + +#define CONFIGDIR "/etc/fonts/conf.d" + +#define ENABLE_NLS 1 + +#define EXEEXT + +#define FC_CACHEDIR "/var/cache/fontconfig" + +#define FC_DEFAULT_FONTS "\t<dir>/usr/share/fonts</dir>\n\t<dir>/usr/local/share/fonts</dir>\n" + +#define FC_FONTPATH "" + +/* The type of gperf "len" parameter */ +#define FC_GPERF_SIZE_T size_t + +#define FC_TEMPLATEDIR "/usr/share/fontconfig/conf.avail" + +#define FLEXIBLE_ARRAY_MEMBER /**/ + +#define FONTCONFIG_PATH "/etc/fonts" + +#define FREETYPE_PCF_LONG_FAMILY_NAMES + +#define GETTEXT_PACKAGE "fontconfig" + +#define HAVE_DCGETTEXT 1 + +#define HAVE_DIRENT_H 1 + +#define HAVE_DLFCN_H 1 + +#define HAVE_FCNTL_H 1 + +#define HAVE_FSTATFS 1 + +#define HAVE_FSTATVFS 1 + +#define HAVE_FT_DONE_MM_VAR 1 + +#define HAVE_FT_GET_BDF_PROPERTY 1 + +#define HAVE_FT_GET_PS_FONT_INFO 1 + +#define HAVE_FT_GET_X11_FONT_FORMAT 1 + +#define HAVE_FT_HAS_PS_GLYPH_NAMES 1 + +#define HAVE_GETOPT 1 + +#define HAVE_GETOPT_LONG 1 + +#define HAVE_GETPAGESIZE 1 + +#define HAVE_GETPID 1 + +#define HAVE_GETTEXT 1 + +#define HAVE_INTEL_ATOMIC_PRIMITIVES 1 + +#define HAVE_INTTYPES_H 1 + +#define HAVE_LINK 1 + +#define HAVE_LOCALTIME_R 1 + +#define HAVE_LRAND48 1 + +#define HAVE_LSTAT 1 + +#define HAVE_MKDTEMP 1 + +#define HAVE_MKOSTEMP 1 + +#define HAVE_MKSTEMP 1 + +#define HAVE_MMAP 1 + +#define HAVE_PTHREAD 1 + +#define HAVE_RAND 1 + +#define HAVE_RANDOM 1 + +#define HAVE_RANDOM_R 1 + +#define HAVE_RAND_R 1 + +#define HAVE_READLINK 1 + +#define HAVE_STDATOMIC_PRIMITIVES 1 + +#define HAVE_STDINT_H 1 + +#define HAVE_STDIO_H 1 + +#define HAVE_STDLIB_H 1 + +#define HAVE_STRERROR 1 + +#define HAVE_STRERROR_R 1 + +#define HAVE_STRINGS_H 1 + +#define HAVE_STRING_H 1 + +#define HAVE_STRUCT_DIRENT_D_TYPE 1 + +#define HAVE_STRUCT_STATFS_F_FLAGS 1 + +#define HAVE_SYS_MOUNT_H 1 + +#define HAVE_SYS_PARAM_H 1 + +#define HAVE_SYS_STATFS_H 1 + +#define HAVE_SYS_STATVFS_H 1 + +#define HAVE_SYS_STAT_H 1 + +#define HAVE_SYS_TYPES_H 1 + +#define HAVE_SYS_VFS_H 1 + +#define HAVE_TIME_H 1 + +#define HAVE_UNISTD_H 1 + +#define HAVE_VPRINTF 1 + +#define HAVE_VSNPRINTF 1 + +#define HAVE_VSPRINTF 1 + +#define HAVE_WCHAR_H 1 + +#define PACKAGE_BUGREPORT "https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/new" + +#define PACKAGE_NAME "fontconfig" + +#define PACKAGE_STRING "fontconfig 2.16.2" + +#define PACKAGE_TARNAME "fontconfig" + +#define PACKAGE_URL "" + +#define PACKAGE_VERSION "2.16.2" + +#define SIZEOF_VOID_P 8 + +#define USE_ICONV 0 + +#define WORDS_BIGENDIAN 0
diff --git a/third_party/fontconfig/src b/third_party/fontconfig/src index 14d466b..24ed9b4 160000 --- a/third_party/fontconfig/src +++ b/third_party/fontconfig/src
@@ -1 +1 @@ -Subproject commit 14d466b30a8ab4a9d789977ed94f2c30e7209267 +Subproject commit 24ed9b4d73dc068ed2baeb0da583c51879d5cabc
diff --git a/third_party/jni_zero/java_refs.h b/third_party/jni_zero/java_refs.h index ebd04abd..3a7eeb4 100644 --- a/third_party/jni_zero/java_refs.h +++ b/third_party/jni_zero/java_refs.h
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// IWYU pragma: private, include "third_party/jni_zero/jni_zero.h" + #ifndef JNI_ZERO_JAVA_REFS_H_ #define JNI_ZERO_JAVA_REFS_H_
diff --git a/third_party/jni_zero/jni_export.h b/third_party/jni_zero/jni_export.h index 6552db1..0b1054b9 100644 --- a/third_party/jni_zero/jni_export.h +++ b/third_party/jni_zero/jni_export.h
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// IWYU pragma: private, include "third_party/jni_zero/jni_zero.h" + #ifndef JNI_ZERO_JNI_EXPORT_H_ #define JNI_ZERO_JNI_EXPORT_H_
diff --git a/third_party/jni_zero/jni_methods.h b/third_party/jni_zero/jni_methods.h index 1a84d2b..d7e3de3 100644 --- a/third_party/jni_zero/jni_methods.h +++ b/third_party/jni_zero/jni_methods.h
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// IWYU pragma: private, include "third_party/jni_zero/jni_zero.h" + #ifndef JNI_ZERO_JNI_METHODS_H_ #define JNI_ZERO_JNI_METHODS_H_
diff --git a/third_party/jni_zero/jni_wrappers.h b/third_party/jni_zero/jni_wrappers.h index b851005..232c8275 100644 --- a/third_party/jni_zero/jni_wrappers.h +++ b/third_party/jni_zero/jni_wrappers.h
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// IWYU pragma: private, include "third_party/jni_zero/jni_zero.h" + #ifndef JNI_ZERO_JNI_WRAPPERS_H_ #define JNI_ZERO_JNI_WRAPPERS_H_
diff --git a/third_party/jni_zero/jni_zero.h b/third_party/jni_zero/jni_zero.h index a04c654..799453d 100644 --- a/third_party/jni_zero/jni_zero.h +++ b/third_party/jni_zero/jni_zero.h
@@ -7,12 +7,14 @@ #include <jni.h> +// IWYU pragma: begin_exports #include "third_party/jni_zero/java_refs.h" #include "third_party/jni_zero/jni_export.h" #include "third_party/jni_zero/jni_methods.h" #include "third_party/jni_zero/jni_wrappers.h" #include "third_party/jni_zero/logging.h" #include "third_party/jni_zero/type_conversions.h" +// IWYU pragma: end_exports namespace jni_zero {
diff --git a/third_party/jni_zero/logging.h b/third_party/jni_zero/logging.h index 48c8276..a04f592 100644 --- a/third_party/jni_zero/logging.h +++ b/third_party/jni_zero/logging.h
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// IWYU pragma: private, include "third_party/jni_zero/jni_zero.h" + #ifndef JNI_ZERO_LOGGING_H_ #define JNI_ZERO_LOGGING_H_
diff --git a/third_party/jni_zero/type_conversions.h b/third_party/jni_zero/type_conversions.h index 9b3390b..69cd810 100644 --- a/third_party/jni_zero/type_conversions.h +++ b/third_party/jni_zero/type_conversions.h
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// IWYU pragma: private, include "third_party/jni_zero/jni_zero.h" + #ifndef JNI_ZERO_TYPE_CONVERSIONS_H_ #define JNI_ZERO_TYPE_CONVERSIONS_H_
diff --git a/third_party/libc++abi/src b/third_party/libc++abi/src index 069652e..9810fb23 160000 --- a/third_party/libc++abi/src +++ b/third_party/libc++abi/src
@@ -1 +1 @@ -Subproject commit 069652e9cbca8e3b5e2371057a206f91f2f710f6 +Subproject commit 9810fb23f6ba666f017c2b67c67de2bcac2b44bd
diff --git a/third_party/mako/mako/test/templates/.gitattributes b/third_party/mako/mako/test/templates/.gitattributes new file mode 100644 index 0000000..a5dd802 --- /dev/null +++ b/third_party/mako/mako/test/templates/.gitattributes
@@ -0,0 +1 @@ +crlf.html text eol=crlf
diff --git a/third_party/ocmock/OCMock/OCMockMacros.h b/third_party/ocmock/OCMock/OCMockMacros.h index c87577d..2253557 100644 --- a/third_party/ocmock/OCMock/OCMockMacros.h +++ b/third_party/ocmock/OCMock/OCMockMacros.h
@@ -27,12 +27,8 @@ #define OCMProtocolMock(protocol) [OCMockObject niceMockForProtocol:protocol] -#define OCMProtocolsMock(protocols) [OCMockObject niceMockForProtocols:protocols] - #define OCMStrictProtocolMock(protocol) [OCMockObject mockForProtocol:protocol] -#define OCMStrictProtocolsMock(protocols) [OCMockObject mockForProtocol:protocols] - #define OCMPartialMock(obj) [OCMockObject partialMockForObject:obj] #define OCMObserverMock() [OCMockObject observerMock]
diff --git a/third_party/ocmock/OCMock/OCMockObject.h b/third_party/ocmock/OCMock/OCMockObject.h index 33fff907..f573971 100644 --- a/third_party/ocmock/OCMock/OCMockObject.h +++ b/third_party/ocmock/OCMock/OCMockObject.h
@@ -36,12 +36,10 @@ + (id)mockForClass:(Class)aClass; + (id)mockForProtocol:(Protocol *)aProtocol; -+ (id)mockForProtocols:(NSArray<Protocol *>*)aProtocols; + (id)partialMockForObject:(NSObject *)anObject; + (id)niceMockForClass:(Class)aClass; + (id)niceMockForProtocol:(Protocol *)aProtocol; -+ (id)niceMockForProtocols:(NSArray<Protocol *> *)aProtocols; + (id)observerMock __deprecated_msg("Please use XCTNSNotificationExpectation instead.");
diff --git a/third_party/ocmock/OCMock/OCMockObject.m b/third_party/ocmock/OCMock/OCMockObject.m index b54d17a..d78cba4 100644 --- a/third_party/ocmock/OCMock/OCMockObject.m +++ b/third_party/ocmock/OCMock/OCMockObject.m
@@ -53,11 +53,6 @@ return [[[OCProtocolMockObject alloc] initWithProtocol:aProtocol] autorelease]; } -+ (id)mockForProtocols:(NSArray<Protocol *> *)aProtocol -{ - return [[[OCProtocolMockObject alloc] initWithProtocols:aProtocol] autorelease]; -} - + (id)partialMockForObject:(NSObject *)anObject { return [[[OCPartialMockObject alloc] initWithObject:anObject] autorelease]; @@ -74,11 +69,6 @@ return [self _makeNice:[self mockForProtocol:aProtocol]]; } -+ (id)niceMockForProtocols:(NSArray<Protocol *> *)aProtocols -{ - return [self _makeNice:[self mockForProtocols:aProtocols]]; -} - + (id)_makeNice:(OCMockObject *)mock {
diff --git a/third_party/ocmock/OCMock/OCProtocolMockObject.h b/third_party/ocmock/OCMock/OCProtocolMockObject.h index 4f71d9d..a6bac51 100644 --- a/third_party/ocmock/OCMock/OCProtocolMockObject.h +++ b/third_party/ocmock/OCMock/OCProtocolMockObject.h
@@ -18,10 +18,9 @@ @interface OCProtocolMockObject : OCMockObject { - NSArray<Protocol *> *mockedProtocols; + Protocol *mockedProtocol; } - (id)initWithProtocol:(Protocol *)aProtocol; -- (id)initWithProtocols:(NSArray<Protocol *> *)aProtocols; @end
diff --git a/third_party/ocmock/OCMock/OCProtocolMockObject.m b/third_party/ocmock/OCMock/OCProtocolMockObject.m index 75365b7..76f44f1 100644 --- a/third_party/ocmock/OCMock/OCProtocolMockObject.m +++ b/third_party/ocmock/OCMock/OCProtocolMockObject.m
@@ -22,44 +22,20 @@ #pragma mark Initialisers, description, accessors, etc. -- (id)initWithProtocols:(NSArray<Protocol *> *)aProtocols -{ - if(aProtocols == nil) - [NSException raise:NSInvalidArgumentException format:@"Protocols cannot be nil."]; - if([aProtocols count] == 0) - [NSException raise:NSInvalidArgumentException format:@"Protocols cannot be empty."]; - for (Protocol *protocol in aProtocols) { - if(protocol == nil) - [NSException raise:NSInvalidArgumentException format:@"Protocol cannot be nil."]; - } - - [super init]; - mockedProtocols = aProtocols; - return self; -} - - (id)initWithProtocol:(Protocol *)aProtocol { if(aProtocol == nil) [NSException raise:NSInvalidArgumentException format:@"Protocol cannot be nil."]; - return [self initWithProtocols:@[aProtocol]]; + [super init]; + mockedProtocol = aProtocol; + return self; } - (NSString *)description { - if ([mockedProtocols count] == 1) { - const char *name = protocol_getName(mockedProtocols[0]); - return [NSString stringWithFormat:@"OCProtocolMockObject(%s)", name]; - } - - NSMutableString* string = [[NSMutableString alloc] initWithString:@"OCProtoolMockObject(["]; - for (int i = 0; i < [mockedProtocols count]; i++) { - if (i > 0) [string appendString:@", "]; - [string appendFormat:@"%s", protocol_getName(mockedProtocols[i])]; - } - [string appendString:@"])"]; - return string; + const char *name = protocol_getName(mockedProtocol); + return [NSString stringWithFormat:@"OCProtocolMockObject(%s)", name]; } #pragma mark Proxy API @@ -69,32 +45,21 @@ struct { BOOL isRequired; BOOL isInstance; } opts[4] = { {YES, YES}, {NO, YES}, {YES, NO}, {NO, NO} }; for(int i = 0; i < 4; i++) { - for (Protocol *mockedProtocol in mockedProtocols) { struct objc_method_description methodDescription = protocol_getMethodDescription(mockedProtocol, aSelector, opts[i].isRequired, opts[i].isInstance); if(methodDescription.name != NULL) - return [NSMethodSignature signatureWithObjCTypes:methodDescription.types]; - } + return [NSMethodSignature signatureWithObjCTypes:methodDescription.types]; } return nil; } - (BOOL)conformsToProtocol:(Protocol *)aProtocol { - for (Protocol *mockedProtocol in mockedProtocols) { - - if(protocol_conformsToProtocol(mockedProtocol, aProtocol)) return YES; - } - return NO; + return protocol_conformsToProtocol(mockedProtocol, aProtocol); } - (BOOL)respondsToSelector:(SEL)selector { - for (Protocol *mockedProtocol in mockedProtocols) { - if ([self methodSignatureForSelector:selector] != nil) { - return YES; - } - } - return NO; + return ([self methodSignatureForSelector:selector] != nil); } @end
diff --git a/third_party/ocmock/README.chromium b/third_party/ocmock/README.chromium index f5ffdbc2..19d5b650 100644 --- a/third_party/ocmock/README.chromium +++ b/third_party/ocmock/README.chromium
@@ -24,7 +24,3 @@ PRs here: - https://github.com/erikdoe/ocmock/pull/503 - https://github.com/erikdoe/ocmock/pull/529 - -Chromium add support for an object mocking multiple protocols. -See pending PR here: -- https://github.com/erikdoe/ocmock/pull/546 \ No newline at end of file
diff --git a/third_party/perfetto b/third_party/perfetto index 99c9ef8..db28060 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit 99c9ef8102d3770e6d5ba91d9ca400b751b0af9b +Subproject commit db280603c217b4abb469b09f543f0713f906da5c
diff --git a/third_party/rust/android_system_properties/v0_1/BUILD.gn b/third_party/rust/android_system_properties/v0_1/BUILD.gn index 3e0f80b..248d053a 100644 --- a/third_party/rust/android_system_properties/v0_1/BUILD.gn +++ b/third_party/rust/android_system_properties/v0_1/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "android_system_properties" epoch = "0.1" + enabled = is_android crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/android_system_properties-v0_1/src/lib.rs" sources = [ "//third_party/rust/chromium_crates_io/vendor/android_system_properties-v0_1/src/lib.rs" ]
diff --git a/third_party/rust/chromium_crates_io/BUILD.gn.hbs b/third_party/rust/chromium_crates_io/BUILD.gn.hbs index 38a4bd4..f979a20 100644 --- a/third_party/rust/chromium_crates_io/BUILD.gn.hbs +++ b/third_party/rust/chromium_crates_io/BUILD.gn.hbs
@@ -17,6 +17,9 @@ {{#if epoch}} epoch = "{{epoch}}" {{/if}} + {{#if cond}} + enabled = {{cond}} + {{/if}} crate_type = "{{crate_type}}" crate_root = "{{crate_root}}" sources = [
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock index 9727369..7e82abc8 100644 --- a/third_party/rust/chromium_crates_io/Cargo.lock +++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -1063,7 +1063,7 @@ [[package]] name = "rustc-demangle-capi" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustc-demangle",
diff --git a/third_party/rust/chromium_crates_io/gnrt_config.toml b/third_party/rust/chromium_crates_io/gnrt_config.toml index 934d39b..ee75bd34 100644 --- a/third_party/rust/chromium_crates_io/gnrt_config.toml +++ b/third_party/rust/chromium_crates_io/gnrt_config.toml
@@ -100,10 +100,6 @@ [crate.clap_builder] extra_input_roots = ['../README.md'] -[crate.codespan-reporting] -# TODO(https://crbug.com/369075726): Remove this exception. -no_license_file_tracked_in_crbug_369075726 = true - [crate.cxx] remove_deps = ['cc', 'link-cplusplus'] # This removes the use of cc, and disables the `build_with_cargo` cfg which @@ -241,8 +237,6 @@ [crate.rustc-demangle-capi] shipped = false -# TODO(https://crbug.com/369075726): Remove this exception. -no_license_file_tracked_in_crbug_369075726 = true [crate.skrifa] extra_src_roots = ['../generated']
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 f901f69..6207e9a 100644 --- a/third_party/rust/chromium_crates_io/supply-chain/config.toml +++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -365,7 +365,7 @@ [policy."regex-syntax:0.8.5"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."rustc-demangle-capi:0.1.0"] +[policy."rustc-demangle-capi:0.1.1"] criteria = ["crypto-safe", "safe-to-run"] [policy."rustc-demangle:0.1.24"]
diff --git a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/.cargo_vcs_info.json index 8ef633d3..3fed4e4 100644 --- a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/.cargo_vcs_info.json
@@ -1,5 +1,6 @@ { "git": { - "sha1": "f540792067ab84d0f47164b29d7db5c7ba3b367d" - } -} + "sha1": "8145ea3869767f044ca63667ca17eab544f3a8ee" + }, + "path_in_vcs": "crates/capi" +} \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.lock new file mode 100644 index 0000000..4cdd93a --- /dev/null +++ b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.lock
@@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-demangle-capi" +version = "0.1.1" +dependencies = [ + "rustc-demangle", +]
diff --git a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.toml index 5828d25..60ee5ea 100644 --- a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.toml
@@ -3,23 +3,36 @@ # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies -# to registry (e.g., crates.io) dependencies +# to registry (e.g., crates.io) dependencies. # -# If you believe there's an error in this file please file an -# issue against the rust-lang/cargo repository. If you're -# editing this file be aware that the upstream Cargo.toml -# will likely look very different (and much more reasonable) +# If you are reading this file be aware that the original Cargo.toml +# will likely look very different (and much more reasonable). +# See Cargo.toml.orig for the original contents. [package] name = "rustc-demangle-capi" -version = "0.1.0" +version = "0.1.1" authors = ["Torste Aikio <zokier@gmail.com>"] -description = "C API for the `rustc-demangle` crate\n" +build = false +autolib = false +autobins = false +autoexamples = false +autotests = false +autobenches = false +description = """ +C API for the `rustc-demangle` crate +""" +readme = false license = "MIT/Apache-2.0" repository = "https://github.com/alexcrichton/rustc-demangle" [lib] name = "rustc_demangle" -crate-type = ["staticlib", "cdylib"] +crate-type = [ + "staticlib", + "cdylib", +] +path = "src/lib.rs" + [dependencies.rustc-demangle] version = "0.1.16"
diff --git a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.toml.orig index a59a768c..d6f3d9ef 100644 --- a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/Cargo.toml.orig
@@ -1,6 +1,6 @@ [package] name = "rustc-demangle-capi" -version = "0.1.0" +version = "0.1.1" authors = ["Torste Aikio <zokier@gmail.com>"] description = """ C API for the `rustc-demangle` crate
diff --git a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/LICENSE-APACHE new file mode 100644 index 0000000..16fe87b --- /dev/null +++ b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/LICENSE-APACHE
@@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.
diff --git a/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/LICENSE-MIT new file mode 100644 index 0000000..39e0ed6 --- /dev/null +++ b/third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/LICENSE-MIT
@@ -0,0 +1,25 @@ +Copyright (c) 2014 Alex Crichton + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust/core_foundation_sys/v0_8/BUILD.gn b/third_party/rust/core_foundation_sys/v0_8/BUILD.gn index eb435bd..c903aab 100644 --- a/third_party/rust/core_foundation_sys/v0_8/BUILD.gn +++ b/third_party/rust/core_foundation_sys/v0_8/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "core_foundation_sys" epoch = "0.8" + enabled = is_ios || is_mac crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/core-foundation-sys-v0_8/src/lib.rs" sources = [
diff --git a/third_party/rust/crossbeam_utils/v0_8/BUILD.gn b/third_party/rust/crossbeam_utils/v0_8/BUILD.gn index ef5f41e..bf9ac4ee 100644 --- a/third_party/rust/crossbeam_utils/v0_8/BUILD.gn +++ b/third_party/rust/crossbeam_utils/v0_8/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "crossbeam_utils" epoch = "0.8" + enabled = current_cpu == "arm" crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/crossbeam-utils-v0_8/src/lib.rs" sources = [
diff --git a/third_party/rust/rustc_demangle_capi/v0_1/BUILD.gn b/third_party/rust/rustc_demangle_capi/v0_1/BUILD.gn index 72c4654..d431751 100644 --- a/third_party/rust/rustc_demangle_capi/v0_1/BUILD.gn +++ b/third_party/rust/rustc_demangle_capi/v0_1/BUILD.gn
@@ -18,7 +18,7 @@ build_native_rust_unit_tests = false edition = "2015" - cargo_pkg_version = "0.1.0" + cargo_pkg_version = "0.1.1" cargo_pkg_authors = "Torste Aikio <zokier@gmail.com>" cargo_pkg_name = "rustc-demangle-capi" cargo_pkg_description = "C API for the `rustc-demangle` crate"
diff --git a/third_party/rust/rustc_demangle_capi/v0_1/README.chromium b/third_party/rust/rustc_demangle_capi/v0_1/README.chromium index 7d8e952f..4f2df65 100644 --- a/third_party/rust/rustc_demangle_capi/v0_1/README.chromium +++ b/third_party/rust/rustc_demangle_capi/v0_1/README.chromium
@@ -1,9 +1,9 @@ Name: rustc-demangle-capi URL: https://crates.io/crates/rustc-demangle-capi -Version: 0.1.0 -Revision: f540792067ab84d0f47164b29d7db5c7ba3b367d +Version: 0.1.1 +Revision: 8145ea3869767f044ca63667ca17eab544f3a8ee License: Apache-2.0 -License File: +License File: //third_party/rust/chromium_crates_io/vendor/rustc-demangle-capi-v0_1/LICENSE-APACHE Shipped: no Security Critical: yes
diff --git a/third_party/rust/winapi_util/v0_1/BUILD.gn b/third_party/rust/winapi_util/v0_1/BUILD.gn index 7c8067c..dbd69f4 100644 --- a/third_party/rust/winapi_util/v0_1/BUILD.gn +++ b/third_party/rust/winapi_util/v0_1/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "winapi_util" epoch = "0.1" + enabled = is_win crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/winapi-util-v0_1/src/lib.rs"
diff --git a/third_party/rust/windows_aarch64_msvc/v0_52/BUILD.gn b/third_party/rust/windows_aarch64_msvc/v0_52/BUILD.gn index b9038770..9ce95aa 100644 --- a/third_party/rust/windows_aarch64_msvc/v0_52/BUILD.gn +++ b/third_party/rust/windows_aarch64_msvc/v0_52/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_aarch64_msvc" epoch = "0.52" + enabled = is_win && current_cpu == "arm64" crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows_aarch64_msvc-v0_52/src/lib.rs" sources = [ "//third_party/rust/chromium_crates_io/vendor/windows_aarch64_msvc-v0_52/src/lib.rs" ]
diff --git a/third_party/rust/windows_core/v0_61/BUILD.gn b/third_party/rust/windows_core/v0_61/BUILD.gn index cfa16fd..29d6c78 100644 --- a/third_party/rust/windows_core/v0_61/BUILD.gn +++ b/third_party/rust/windows_core/v0_61/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_core" epoch = "0.61" + enabled = is_win crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows-core-v0_61/src/lib.rs" sources = [
diff --git a/third_party/rust/windows_i686_msvc/v0_52/BUILD.gn b/third_party/rust/windows_i686_msvc/v0_52/BUILD.gn index 0859f6e..1d6aa7e 100644 --- a/third_party/rust/windows_i686_msvc/v0_52/BUILD.gn +++ b/third_party/rust/windows_i686_msvc/v0_52/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_i686_msvc" epoch = "0.52" + enabled = is_win && current_cpu == "x86" crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows_i686_msvc-v0_52/src/lib.rs" sources = [ "//third_party/rust/chromium_crates_io/vendor/windows_i686_msvc-v0_52/src/lib.rs" ]
diff --git a/third_party/rust/windows_implement/v0_60/BUILD.gn b/third_party/rust/windows_implement/v0_60/BUILD.gn index f990232..c4accaee 100644 --- a/third_party/rust/windows_implement/v0_60/BUILD.gn +++ b/third_party/rust/windows_implement/v0_60/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_implement" epoch = "0.60" + enabled = is_win crate_type = "proc-macro" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows-implement-v0_60/src/lib.rs" sources = [
diff --git a/third_party/rust/windows_interface/v0_59/BUILD.gn b/third_party/rust/windows_interface/v0_59/BUILD.gn index 2991bdf..c87ee2c 100644 --- a/third_party/rust/windows_interface/v0_59/BUILD.gn +++ b/third_party/rust/windows_interface/v0_59/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_interface" epoch = "0.59" + enabled = is_win crate_type = "proc-macro" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows-interface-v0_59/src/lib.rs" sources = [ "//third_party/rust/chromium_crates_io/vendor/windows-interface-v0_59/src/lib.rs" ]
diff --git a/third_party/rust/windows_link/v0_1/BUILD.gn b/third_party/rust/windows_link/v0_1/BUILD.gn index 51e2cfc5..3eb5fc4 100644 --- a/third_party/rust/windows_link/v0_1/BUILD.gn +++ b/third_party/rust/windows_link/v0_1/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_link" epoch = "0.1" + enabled = is_win crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows-link-v0_1/src/lib.rs" sources = [
diff --git a/third_party/rust/windows_result/v0_3/BUILD.gn b/third_party/rust/windows_result/v0_3/BUILD.gn index 4456fe1..8112777 100644 --- a/third_party/rust/windows_result/v0_3/BUILD.gn +++ b/third_party/rust/windows_result/v0_3/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_result" epoch = "0.3" + enabled = is_win crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows-result-v0_3/src/lib.rs" sources = [
diff --git a/third_party/rust/windows_strings/v0_4/BUILD.gn b/third_party/rust/windows_strings/v0_4/BUILD.gn index 58cba9e..e48132a 100644 --- a/third_party/rust/windows_strings/v0_4/BUILD.gn +++ b/third_party/rust/windows_strings/v0_4/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_strings" epoch = "0.4" + enabled = is_win crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows-strings-v0_4/src/lib.rs" sources = [
diff --git a/third_party/rust/windows_sys/v0_52/BUILD.gn b/third_party/rust/windows_sys/v0_52/BUILD.gn index 5601e4e..00b715c 100644 --- a/third_party/rust/windows_sys/v0_52/BUILD.gn +++ b/third_party/rust/windows_sys/v0_52/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_sys" epoch = "0.52" + enabled = is_win crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows-sys-v0_52/src/lib.rs" sources = [
diff --git a/third_party/rust/windows_targets/v0_52/BUILD.gn b/third_party/rust/windows_targets/v0_52/BUILD.gn index 1d5e03e..b667d5b6 100644 --- a/third_party/rust/windows_targets/v0_52/BUILD.gn +++ b/third_party/rust/windows_targets/v0_52/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_targets" epoch = "0.52" + enabled = is_win crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows-targets-v0_52/src/lib.rs" sources = [ "//third_party/rust/chromium_crates_io/vendor/windows-targets-v0_52/src/lib.rs" ]
diff --git a/third_party/rust/windows_x86_64_msvc/v0_52/BUILD.gn b/third_party/rust/windows_x86_64_msvc/v0_52/BUILD.gn index 24bc4197..2cbc17fc 100644 --- a/third_party/rust/windows_x86_64_msvc/v0_52/BUILD.gn +++ b/third_party/rust/windows_x86_64_msvc/v0_52/BUILD.gn
@@ -11,6 +11,7 @@ cargo_crate("lib") { crate_name = "windows_x86_64_msvc" epoch = "0.52" + enabled = is_win && current_cpu == "x64" crate_type = "rlib" crate_root = "//third_party/rust/chromium_crates_io/vendor/windows_x86_64_msvc-v0_52/src/lib.rs" sources = [ "//third_party/rust/chromium_crates_io/vendor/windows_x86_64_msvc-v0_52/src/lib.rs" ]
diff --git a/third_party/skia b/third_party/skia index db706fd..365d4746 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit db706fd37874f786e82238b58a4c3799fa430f60 +Subproject commit 365d47466356c3666a5319baf262153cf393ab86
diff --git a/third_party/swiftshader b/third_party/swiftshader index 96085ee..f70c119 160000 --- a/third_party/swiftshader +++ b/third_party/swiftshader
@@ -1 +1 @@ -Subproject commit 96085ee3c6cc7bbb839880279efc85cbf122ec6b +Subproject commit f70c1194c1730893f7848cff07ca4ec196269709
diff --git a/third_party/webrtc b/third_party/webrtc index e30e216..cc46fb9 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit e30e216756cb9bdee35074b8020a78e26c981d94 +Subproject commit cc46fb91c5f8bd4cba637f6ebfaa5f278efc4458
diff --git a/tools/android/dependency_analysis/OWNERS b/tools/android/dependency_analysis/OWNERS index 4dda4265..d03aadc 100644 --- a/tools/android/dependency_analysis/OWNERS +++ b/tools/android/dependency_analysis/OWNERS
@@ -1,3 +1,2 @@ hnakashima@chromium.org -mheikal@chromium.org wnwen@chromium.org
diff --git a/tools/android/nullaway/OWNERS b/tools/android/nullaway/OWNERS index 5794fc3..a0e0826 100644 --- a/tools/android/nullaway/OWNERS +++ b/tools/android/nullaway/OWNERS
@@ -1,3 +1,2 @@ agrieve@chromium.org -mheikal@chromium.org -wnwen@chromium.org \ No newline at end of file +wnwen@chromium.org
diff --git a/tools/android/tracing/OWNERS b/tools/android/tracing/OWNERS index ff09f40..c87688f 100644 --- a/tools/android/tracing/OWNERS +++ b/tools/android/tracing/OWNERS
@@ -1,2 +1 @@ -mheikal@chromium.org yfriedman@chromium.org
diff --git a/tools/crates/gnrt/lib/condition.rs b/tools/crates/gnrt/lib/condition.rs index d5428b8..512c46f7 100644 --- a/tools/crates/gnrt/lib/condition.rs +++ b/tools/crates/gnrt/lib/condition.rs
@@ -12,7 +12,8 @@ }; /// Representation of a `Condition` associated with a conditional/optional -/// dependency. +/// dependency from a `Cargo.toml` file - see an example here: +/// https://source.chromium.org/chromium/chromium/src/+/main:third_party/rust/chromium_crates_io/vendor/windows-targets-v0_52/Cargo.toml;l=38;drc=5977f5edc277200b0674e8df80ba7495980d87bb #[derive(Clone, Debug, Eq, PartialEq)] pub struct Condition(Result<HashSet<RustTargetTriple>, String>); @@ -366,13 +367,31 @@ } } - // `key` is not set by `rustc` (i.e. it is not documented in - // https://doc.rust-lang.org/reference/conditional-compilation.html and not - // handled above). Therefore we assume that Chromium will never ask GN/ninja - // to pass `--cfg 'this_unrecognized_key="something"'` to `rustc`. And - // therefore we treat this as `AlwaysFalse`. See also + // `KNOWN_UNSUPPORTED_KEYS` is based on + // + // 1. Reading https://doc.rust-lang.org/reference/conditional-compilation.html + // 2. Looking at `rustc --print=cfg --target <some target> | grep = | grep -v + // target_` (`target_...=...` keys are handled in `build/builds.rs`). + const KNOWN_UNSUPPORTED_KEYS: [&str; 3] = ["feature", "fmt_debug", "relocation_model"]; + if KNOWN_UNSUPPORTED_KEYS.contains(&key) { + return Condition(Err(format!( + "Condition depends on an unsupported, compiler-provided key: `{key}`" + ))); + } + + // If `key` is not handled above (in particular not in the list of *known* + // `KNOWN_UNSUPPORTED_KEYS`) then we assume that it is not set *by* `rustc` nor + // `cargo`, but instead is passed via `--cfg key=value` *to* the compiler. + // + // And we also assume that Chromium will never ask GN/ninja to pass `--cfg + // 'unrecognized_key="something"'` to `rustc` (this is not done today by + // `//build/rust/*.gni` nor `BUILD.gn.hbs`). + // + // And therefore we treat this as `AlwaysFalse`. See also // https://crbug.com/404598090#comment4. - log::warn!("Treating unrecogized `#[cfg({key} = \"{value}\")]` as `AlwaysFalse"); + // + // (We used to warn about such unrecognized `key`s, but it was too noisy in + // practice.) Condition::always_false() } @@ -415,12 +434,45 @@ return Condition::always_true(); } - // `name` is not something that is documented in - // https://doc.rust-lang.org/reference/conditional-compilation.html. We assume that Chromium - // will never ask GN/ninja to pass `--cfg this_unrecognized_name` to `rustc`. + // `KNOWN_UNSUPPORTED_NAMES` is based on + // + // 1. Reading https://doc.rust-lang.org/reference/conditional-compilation.html + // 2. Looking at `rustc --print=cfg --target <some target> | grep -v =` + // (`target_...=...` keys are handled in `build/builds.rs`). + // + // TODO(https://crbug.com/402096443): Extract those in `build/build/rs`. + // (It seems that all of them are properties of the target platform.) + const KNOWN_UNSUPPORTED_NAMES: [&str; 9] = [ + "overflow_checks", + "ub_checks", + "target_has_atomic", + "target_has_atomic_load_store", + "target_has_reliable_f128", + "target_has_reliable_f128_math", + "target_has_reliable_f16", + "target_has_reliable_f16_math", + "target_thread_local", + ]; + if KNOWN_UNSUPPORTED_NAMES.contains(&name) { + return Condition(Err(format!( + "Condition depends on an unsupported, compiler-provided configuration name: `{name}`" + ))); + } + + // If `name` is not handled above (in particular not in the list of *known* + // `KNOWN_UNSUPPORTED_NAMES`) then we assume that it is not set *by* `rustc`, + // but instead is passed via `--cfg name` *to* the compiler. + // + // And we also assume that Chromium will never ask GN/ninja to pass `--cfg + // 'unrecognized_name'` to `rustc` (this is not done today by + // `//build/rust/*.gni` nor `BUILD.gn.hbs`). + // // And therefore we treat this as `AlwaysFalse`. See also // https://crbug.com/404598090#comment4. - log::warn!("Treating unrecogized `#[cfg({name})]` as `AlwaysFalse"); + // + // We used to warn about such unrecognized `name`s, but it was too noisy in + // practice. Example of such a `name` can be found here: + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/rust/chromium_crates_io/vendor/zip-v2/Cargo.toml;l=258;drc=d41c4d24cd81aef76cda21e4ea84ab2ddb2c71e6 Condition::always_false() }
diff --git a/tools/crates/gnrt/lib/readme.rs b/tools/crates/gnrt/lib/readme.rs index 1c462bc..236a9f5c 100644 --- a/tools/crates/gnrt/lib/readme.rs +++ b/tools/crates/gnrt/lib/readme.rs
@@ -122,24 +122,16 @@ }; if license_files.is_empty() { - // Exceptions for https://crbug.com/369075726 can only apply to crates that are not - // shipped. - let does_crbug_369075726_apply = !shipped - && crate_config - .as_ref() - .is_some_and(|cfg| cfg.no_license_file_tracked_in_crbug_369075726); - if !does_crbug_369075726_apply { - bail!( - "License file not found for crate {name}.\n - \n - You can specify the `license_files` in `crate.{name}]` \ - section of the `gnrt_config.toml` to manually point out \ - a license file relative to the crate's root. \ - (Alternatively you can tweak `gnrt`'s source code to improve \ - its ability to recognize license files based on their name).", - name = package.name() - ); - } + bail!( + "License file not found for crate {name}.\n + \n + You can specify the `license_files` in `crate.{name}]` \ + section of the `gnrt_config.toml` to manually point out \ + a license file relative to the crate's root. \ + (Alternatively you can tweak `gnrt`'s source code to improve \ + its ability to recognize license files based on their name).", + name = package.name() + ); } let revision = {
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 971ed08..f1a3427 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -8579,6 +8579,7 @@ <int value="-2073265579" label="EnablePreferencesAccountStorage:disabled"/> <int value="-2072877761" label="WaylandUiScale:disabled"/> <int value="-2072754800" label="HelpAppAppsList:disabled"/> + <int value="-2072546762" label="SecurePaymentConfirmationUxRefresh:disabled"/> <int value="-2072471036" label="OobeHidDetectionRevamp:disabled"/> <int value="-2071515296" label="allow-sync-xhr-in-page-dismissal"/> <int value="-2071202821" label="CopyLinkToText:enabled"/> @@ -14796,6 +14797,7 @@ label="InterestFeedV2ClickAndViewActionsConditionalUpload:disabled"/> <int value="288755982" label="AutofillEnableLocalCardMigrationForNonSyncUser:enabled"/> + <int value="288826415" label="SecurePaymentConfirmationUxRefresh:enabled"/> <int value="289408715" label="MacImeLiveConversionFix:enabled"/> <int value="289465857" label="ClipboardHistorySimpleRender:disabled"/> <int value="290559997" label="LinkCapturingUiUpdate:disabled"/> @@ -17243,6 +17245,7 @@ <int value="1220464509" label="enable-first-run-ui-transitions"/> <int value="1220655015" label="kScrollableTabStripOverflow:enabled"/> <int value="1220920757" label="FilesTrashAutoCleanup:enabled"/> + <int value="1221075979" label="NewTabPageCustomizationToolbarButton:enabled"/> <int value="1221104166" label="ThumbnailCacheRefactor:enabled"/> <int value="1221370955" label="FedCmAddAccount:enabled"/> <int value="1221394044" label="SharingUseDeviceInfo:enabled"/> @@ -18022,6 +18025,8 @@ <int value="1502820263" label="IPH_SupervisedUserProfileSignin:disabled"/> <int value="1503291145" label="ForceSigninFlowInProfilePicker:enabled"/> <int value="1504393761" label="AutofillEnableCardProductName:enabled"/> + <int value="1505028793" + label="NewTabPageCustomizationToolbarButton:disabled"/> <int value="1505194447" label="disable-transition-compositing"/> <int value="1506372577" label="NearbySharingSelfShare:disabled"/> <int value="1506384737" label="ArcExtendInputAnrTimeout:disabled"/>
diff --git a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS index 0857f255..cd58983b 100644 --- a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS +++ b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
@@ -446,6 +446,7 @@ spvw@chromium.org # storage ayui@chromium.org +leimy@chromium.org # structured_metrics jongahn@chromium.org # subresource
diff --git a/tools/metrics/histograms/metadata/accessibility/enums.xml b/tools/metrics/histograms/metadata/accessibility/enums.xml index 2541b87..f54b45f 100644 --- a/tools/metrics/histograms/metadata/accessibility/enums.xml +++ b/tools/metrics/histograms/metadata/accessibility/enums.xml
@@ -1185,7 +1185,7 @@ technologies such as screen readers. </summary> <int value="0" label="None"/> - <int value="1" label="Unknown"/> + <int value="1" label="Uninitialized"/> <int value="2" label="ChromeVox"/> <int value="3" label="JAWS"/> <int value="4" label="Narrator"/>
diff --git a/tools/metrics/histograms/metadata/ai/OWNERS b/tools/metrics/histograms/metadata/ai/OWNERS index c5dce8c..0744c0a 100644 --- a/tools/metrics/histograms/metadata/ai/OWNERS +++ b/tools/metrics/histograms/metadata/ai/OWNERS
@@ -5,3 +5,4 @@ toyoshim@chromium.org gjc@google.com ayui@chromium.org +leimy@chromium.org
diff --git a/tools/metrics/histograms/metadata/navigation/OWNERS b/tools/metrics/histograms/metadata/navigation/OWNERS index 05072e2..39784f16 100644 --- a/tools/metrics/histograms/metadata/navigation/OWNERS +++ b/tools/metrics/histograms/metadata/navigation/OWNERS
@@ -6,3 +6,4 @@ tbansal@chromium.org toyoshim@chromium.org gjc@google.com +leimy@chromium.org
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml index 947ca38c..c572268 100644 --- a/tools/metrics/histograms/metadata/net/histograms.xml +++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -2399,7 +2399,7 @@ </histogram> <histogram name="Net.DNS.UpgradeConfig.DotUpgradeSucceeded" enum="Boolean" - expires_after="2025-09-14"> + expires_after="2026-05-14"> <owner>awillia@chromium.org</owner> <owner>src/net/dns/OWNERS</owner> <summary> @@ -2409,7 +2409,7 @@ </histogram> <histogram name="Net.DNS.UpgradeConfig.HasPublicInsecureNameserver" - enum="Boolean" expires_after="2025-05-08"> + enum="Boolean" expires_after="2026-05-14"> <owner>awillia@chromium.org</owner> <owner>src/net/dns/OWNERS</owner> <summary> @@ -2423,7 +2423,7 @@ </histogram> <histogram name="Net.DNS.UpgradeConfig.Ineligible.DohSpecified" enum="Boolean" - expires_after="2025-05-08"> + expires_after="2026-05-14"> <owner>awillia@chromium.org</owner> <owner>src/net/dns/OWNERS</owner> <summary> @@ -2433,7 +2433,7 @@ </histogram> <histogram name="Net.DNS.UpgradeConfig.Ineligible.UnhandledOptions" - enum="Boolean" expires_after="2025-05-08"> + enum="Boolean" expires_after="2026-05-14"> <owner>awillia@chromium.org</owner> <owner>src/net/dns/OWNERS</owner> <summary> @@ -2444,7 +2444,7 @@ </histogram> <histogram name="Net.DNS.UpgradeConfig.InsecureUpgradeSucceeded" enum="Boolean" - expires_after="2025-05-08"> + expires_after="2026-05-14"> <owner>awillia@chromium.org</owner> <owner>src/net/dns/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 47bc847..54f7a10a 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -3216,7 +3216,7 @@ </histogram> <histogram name="ChromiumAndroidLinker.RelroSharingStatus2" - enum="RelroSharingStatus" expires_after="2025-07-06"> + enum="RelroSharingStatus" expires_after="2026-07-06"> <owner>lizeb@chromium.org</owner> <owner>pasko@chromium.org</owner> <summary> @@ -8865,7 +8865,7 @@ </histogram> <histogram name="SiteIsolatedCodeCache.JS.Behaviour" - enum="SiteIsolatedCodeCacheJSBehaviour" expires_after="2025-10-26"> + enum="SiteIsolatedCodeCacheJSBehaviour" expires_after="2026-05-14"> <owner>awillia@chromium.org</owner> <owner>loading-dev@chromium.org</owner> <summary> @@ -8958,7 +8958,7 @@ </histogram> <histogram name="SiteIsolatedCodeCache.WASM.Behaviour" - enum="SiteIsolatedCodeCacheWASMBehaviour" expires_after="2025-06-22"> + enum="SiteIsolatedCodeCacheWASMBehaviour" expires_after="2026-05-14"> <owner>awillia@chromium.org</owner> <owner>loading-dev@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml index 7ed27f3..8555d56 100644 --- a/tools/metrics/histograms/metadata/permissions/histograms.xml +++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -194,6 +194,7 @@ <!-- LINT.IfChange(PredictionModels) --> <variants name="PredictionModels"> + <variant name="Aiv3"/> <variant name="OnDevicePredictionService"/> <variant name="PredictionService"/> </variants>
diff --git a/tools/metrics/histograms/metadata/storage/OWNERS b/tools/metrics/histograms/metadata/storage/OWNERS index 2468aa52..c2fbf046 100644 --- a/tools/metrics/histograms/metadata/storage/OWNERS +++ b/tools/metrics/histograms/metadata/storage/OWNERS
@@ -5,3 +5,4 @@ # Primary ayui@chromium.org +leimy@chromium.org
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index c60f4ef..5e333897 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/v50.1/linux-arm64/trace_processor_shell" }, "win": { - "hash": "1eeed5d403b68eb498867f0c1ff665dfabda24e0", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/109a2ebe2b65215b8ba3ff0d6a3a8361220a0992/trace_processor_shell.exe" + "hash": "07be70c0d7c2d7199f63caa1890f5a90216a4cec", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/99c9ef8102d3770e6d5ba91d9ca400b751b0af9b/trace_processor_shell.exe" }, "linux_arm": { "hash": "99f971ca131f6d11c73f4b918099d434bdd8093c", @@ -22,7 +22,7 @@ }, "linux": { "hash": "5f2b117cf04bd40120108afc74c46b881d8271a8", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/99c9ef8102d3770e6d5ba91d9ca400b751b0af9b/trace_processor_shell" + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/b133f0751d82650eef34fbebfbfef0ce8ddc8259/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/ui/accessibility/platform/assistive_tech.cc b/ui/accessibility/platform/assistive_tech.cc index 2b55723..6d85e9fe 100644 --- a/ui/accessibility/platform/assistive_tech.cc +++ b/ui/accessibility/platform/assistive_tech.cc
@@ -10,7 +10,7 @@ namespace { static constexpr std::string_view kNoneString{"None"}; -static constexpr std::string_view kUnknownString{"Unknown"}; +static constexpr std::string_view kUninitializedString{"Uninitialized"}; static constexpr std::string_view kChromeVoxString{"ChromeVox"}; static constexpr std::string_view kJawsString{"Jaws"}; static constexpr std::string_view kNarratorString{"Narrator"}; @@ -32,7 +32,7 @@ // until some expensive operations are performed off-thread. // assume there is a not screen reader in this case, as this is generally // the most appropriate for most call sites. - case AssistiveTech::kUnknown: + case AssistiveTech::kUninitialized: case AssistiveTech::kNone: return false; case AssistiveTech::kChromeVox: @@ -57,8 +57,8 @@ switch (assistive_tech) { case AssistiveTech::kNone: return kNoneString; - case AssistiveTech::kUnknown: - return kUnknownString; + case AssistiveTech::kUninitialized: + return kUninitializedString; case AssistiveTech::kChromeVox: return kChromeVoxString; case AssistiveTech::kJaws:
diff --git a/ui/accessibility/platform/assistive_tech.h b/ui/accessibility/platform/assistive_tech.h index 58a0fcea..45f0dac0 100644 --- a/ui/accessibility/platform/assistive_tech.h +++ b/ui/accessibility/platform/assistive_tech.h
@@ -16,11 +16,11 @@ // // LINT.IfChange(AssistiveTech) enum class AssistiveTech { - // Use kUnknown if still waiting for the assistive tech to be computed, + // Use kUninitialized if still waiting for the assistive tech to be computed, // because some platforms need to scan modules/processes which is done // off-thread. kNone = 0, - kUnknown = 1, + kUninitialized = 1, kChromeVox = 2, kJaws = 3, kNarrator = 4,
diff --git a/ui/accessibility/platform/ax_platform.h b/ui/accessibility/platform/ax_platform.h index 957664f..329a29c 100644 --- a/ui/accessibility/platform/ax_platform.h +++ b/ui/accessibility/platform/ax_platform.h
@@ -226,7 +226,7 @@ // Keeps track of the active AssistiveTech. AssistiveTech active_assistive_tech_ GUARDED_BY_CONTEXT(thread_checker_) = - AssistiveTech::kUnknown; + AssistiveTech::kUninitialized; // Keeps track of whether caret browsing is enabled. bool caret_browsing_enabled_ GUARDED_BY_CONTEXT(thread_checker_) = false;
diff --git a/ui/chromeos/OWNERS b/ui/chromeos/OWNERS index 942391fe..dc2d195 100644 --- a/ui/chromeos/OWNERS +++ b/ui/chromeos/OWNERS
@@ -3,7 +3,6 @@ oshima@chromium.org xiyuan@chromium.org -afakhry@chromium.org #{LAST_RESORT_SUGGESTION} per-file file_manager_strings.grdp=* # For adding or removing languages.
diff --git a/ui/gfx/switches.cc b/ui/gfx/switches.cc index d3ca7f6b..f02614e6 100644 --- a/ui/gfx/switches.cc +++ b/ui/gfx/switches.cc
@@ -33,7 +33,7 @@ const char kHeadless[] = "headless"; // Headless screen info in the format: {0,0 800x600}{800,0 600x800}. -// See //components/headless/screen_info/headless_screen_info.h for details. +// See //components/headless/screen_info/README.md for more details. const char kScreenInfo[] = "screen-info"; #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
diff --git a/ui/ozone/platform/headless/headless_screen.cc b/ui/ozone/platform/headless/headless_screen.cc index e7cc4f8..20f8d99 100644 --- a/ui/ozone/platform/headless/headless_screen.cc +++ b/ui/ozone/platform/headless/headless_screen.cc
@@ -33,7 +33,7 @@ // // More complex headless screen configuration (including multiple screens) // can be specified using the --screen-info command line switch. -// See //components/headless/screen_info/headless_screen_info.h for details. +// See //components/headless/screen_info/README.md for more details. // Ozone/headless display defaults. constexpr int64_t kHeadlessDisplayIdBase = 1;
diff --git a/ui/strings/translations/ui_strings_as.xtb b/ui/strings/translations/ui_strings_as.xtb index f1dbf8a..b131f8f 100644 --- a/ui/strings/translations/ui_strings_as.xtb +++ b/ui/strings/translations/ui_strings_as.xtb
@@ -162,6 +162,7 @@ <translation id="6264365405983206840">&সকলো বাছনি কৰক</translation> <translation id="6346952829206698721">ক্লিপব’ৰ্ডৰ পৰা পে’ষ্ট কৰক</translation> <translation id="6364916375976753737">বাওঁফাললৈ স্ক্ৰ’ল কৰক</translation> +<translation id="63712816010840859">বৰ্তমানৰ ডিছপ্লে’টো টাচ্চস্ক্ৰীন নহ’লে, Esc টিপক।</translation> <translation id="6394627529324717982">ক’মা</translation> <translation id="6397363302884558537">কথন বন্ধ কৰক</translation> <translation id="6404817160109697034">{SECONDS,plural, =1{১ ছেকেণ্ড পূর্বে}one{# ছেকেণ্ড পূর্বে}other{# ছেকেণ্ড পূর্বে}}</translation> @@ -173,6 +174,7 @@ <translation id="6612467943526193239">কেলিব্ৰেশ্বন বন্ধ কৰিবলৈ Esc টিপক।</translation> <translation id="6620110761915583480">ফাইল ছেভ কৰক</translation> <translation id="6699343763173986273">মিডিয়াৰ পৰৱর্তী ট্ৰেক</translation> +<translation id="6738856801552481343">এই ডিছপ্লে’টো টাচ্চস্ক্ৰীন নহ’লে, Esc টিপক।</translation> <translation id="6807086321996342431">স্তম্ভ <ph name="COLUMN_NAME" /></translation> <translation id="6808150112686056157">মিডিয়া বন্ধ কৰক</translation> <translation id="6845383723252244143">ফ’ল্ডাৰ বাছনি কৰক</translation>
diff --git a/ui/strings/translations/ui_strings_cs.xtb b/ui/strings/translations/ui_strings_cs.xtb index 113cf1a5..4b5eb74 100644 --- a/ui/strings/translations/ui_strings_cs.xtb +++ b/ui/strings/translations/ui_strings_cs.xtb
@@ -162,6 +162,7 @@ <translation id="6264365405983206840">Vybr&at vše</translation> <translation id="6346952829206698721">Vložit ze schránky</translation> <translation id="6364916375976753737">Posuv doleva</translation> +<translation id="63712816010840859">Pokud aktuální displej nemá dotykovou obrazovku, stiskněte klávesu Esc.</translation> <translation id="6394627529324717982">Čárka</translation> <translation id="6397363302884558537">Přestat mluvit</translation> <translation id="6404817160109697034">{SECONDS,plural, =1{Před 1 s}few{Před # s}many{Před # s}other{Před # s}}</translation> @@ -173,6 +174,7 @@ <translation id="6612467943526193239">Kalibraci ukončíte stisknutím klávesy Esc.</translation> <translation id="6620110761915583480">Uložit soubor</translation> <translation id="6699343763173986273">Média – další skladba</translation> +<translation id="6738856801552481343">Pokud tento displej nemá dotykovou obrazovku, stiskněte klávesu Esc.</translation> <translation id="6807086321996342431">Sloupec <ph name="COLUMN_NAME" /></translation> <translation id="6808150112686056157">Média – zastavit</translation> <translation id="6845383723252244143">Vybrat složku</translation>
diff --git a/ui/strings/translations/ui_strings_it.xtb b/ui/strings/translations/ui_strings_it.xtb index 379b9dc..2f8fb9c 100644 --- a/ui/strings/translations/ui_strings_it.xtb +++ b/ui/strings/translations/ui_strings_it.xtb
@@ -162,6 +162,7 @@ <translation id="6264365405983206840">Seleziona &tutto</translation> <translation id="6346952829206698721">Incolla dagli appunti</translation> <translation id="6364916375976753737">Scorri a sinistra</translation> +<translation id="63712816010840859">Se il display in uso non è un touchscreen, premi Esc.</translation> <translation id="6394627529324717982">Virgola</translation> <translation id="6397363302884558537">Interrompi comandi vocali</translation> <translation id="6404817160109697034">{SECONDS,plural, =1{1 sec fa}other{# sec fa}}</translation> @@ -173,6 +174,7 @@ <translation id="6612467943526193239">Per uscire dalla calibrazione premi Esc.</translation> <translation id="6620110761915583480">Salva file</translation> <translation id="6699343763173986273">Traccia successiva contenuti multimediali</translation> +<translation id="6738856801552481343">Se il display non è un touchscreen, premi Esc.</translation> <translation id="6807086321996342431">Colonna <ph name="COLUMN_NAME" /></translation> <translation id="6808150112686056157">Interrompi contenuti multimediali</translation> <translation id="6845383723252244143">Seleziona cartella</translation>
diff --git a/ui/strings/translations/ui_strings_kk.xtb b/ui/strings/translations/ui_strings_kk.xtb index 1c4135c2..38881ee8 100644 --- a/ui/strings/translations/ui_strings_kk.xtb +++ b/ui/strings/translations/ui_strings_kk.xtb
@@ -162,6 +162,7 @@ <translation id="6264365405983206840">&Барлығын таңдау</translation> <translation id="6346952829206698721">Буферден қою</translation> <translation id="6364916375976753737">Солға айналдыру</translation> +<translation id="63712816010840859">Қазіргі дисплей сенсорлық экран болмаса, Esc пернесін басыңыз.</translation> <translation id="6394627529324717982">Үтір</translation> <translation id="6397363302884558537">Сөйлеуді тоқтату</translation> <translation id="6404817160109697034">{SECONDS,plural, =1{1 сек бұрын}other{# сек бұрын}}</translation> @@ -173,6 +174,7 @@ <translation id="6612467943526193239">Калибрлеуден шығу үшін "Esc" пернесін басыңыз.</translation> <translation id="6620110761915583480">Файлды сақтау</translation> <translation id="6699343763173986273">Келесі медиатрек</translation> +<translation id="6738856801552481343">Бұл дисплей сенсорлық экран болмаса, Esc пернесін басыңыз.</translation> <translation id="6807086321996342431"><ph name="COLUMN_NAME" /> бағаны</translation> <translation id="6808150112686056157">Медианы тоқтату</translation> <translation id="6845383723252244143">Қалта таңдау</translation>
diff --git a/ui/strings/translations/ui_strings_or.xtb b/ui/strings/translations/ui_strings_or.xtb index d2b01af0..33d58a63 100644 --- a/ui/strings/translations/ui_strings_or.xtb +++ b/ui/strings/translations/ui_strings_or.xtb
@@ -162,6 +162,7 @@ <translation id="6264365405983206840">&ସବୁ ଚୟନ କରନ୍ତୁ</translation> <translation id="6346952829206698721">କ୍ଲିପବୋର୍ଡରୁ ପେଷ୍ଟ କରନ୍ତୁ</translation> <translation id="6364916375976753737">ବାମକୁ ସ୍କ୍ରୋଲ୍ କରନ୍ତୁ</translation> +<translation id="63712816010840859">ଯଦି ବର୍ତ୍ତମାନର ଡିସପ୍ଲେ ଏକ ଟଚସ୍କ୍ରିନ ନୁହେଁ, ତେବେ Esc ଦବାନ୍ତୁ।</translation> <translation id="6394627529324717982">କମା</translation> <translation id="6397363302884558537">କଥା କହିବା ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="6404817160109697034">{SECONDS,plural, =1{1 ସେକେଣ୍ଡ ପୂର୍ବେ}other{# ସେକେଣ୍ଡ ପୂର୍ବେ}}</translation> @@ -173,6 +174,7 @@ <translation id="6612467943526193239">କାଲିବ୍ରାସେନ୍ରୁ ପ୍ରସ୍ଥାନ କରିବାକୁ ଏସ୍କେପ୍ କୀ ଦବାନ୍ତୁ।</translation> <translation id="6620110761915583480">ଫାଇଲ୍ ସେଭ୍ କରନ୍ତୁ</translation> <translation id="6699343763173986273">ମିଡିଆ ପରବର୍ତ୍ତୀ ଟ୍ରାକ୍</translation> +<translation id="6738856801552481343">ଯଦି ଏହି ଡିସପ୍ଲେ ଏକ ଟଚସ୍କ୍ରିନ ନୁହେଁ, ତେବେ Esc ଦବାନ୍ତୁ।</translation> <translation id="6807086321996342431">ସ୍ତମ୍ଭ <ph name="COLUMN_NAME" /></translation> <translation id="6808150112686056157">ମିଡିଆ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="6845383723252244143">ଫୋଲ୍ଡର୍ ଚୟନ କରନ୍ତୁ</translation>
diff --git a/ui/strings/translations/ui_strings_pt-BR.xtb b/ui/strings/translations/ui_strings_pt-BR.xtb index 241eb1b..393ae82 100644 --- a/ui/strings/translations/ui_strings_pt-BR.xtb +++ b/ui/strings/translations/ui_strings_pt-BR.xtb
@@ -162,6 +162,7 @@ <translation id="6264365405983206840">Selecionar &tudo</translation> <translation id="6346952829206698721">Colar da área de transferência</translation> <translation id="6364916375976753737">Percorrer à esquerda</translation> +<translation id="63712816010840859">Se a tela atual não for touch, pressione Esc.</translation> <translation id="6394627529324717982">Vírgula</translation> <translation id="6397363302884558537">Pare de falar</translation> <translation id="6404817160109697034">{SECONDS,plural, =1{Um segundo atrás}one{# segundos atrás}other{# segundos atrás}}</translation> @@ -173,6 +174,7 @@ <translation id="6612467943526193239">Para sair da calibração pressione Esc.</translation> <translation id="6620110761915583480">Salvar arquivo</translation> <translation id="6699343763173986273">Próxima faixa da mídia</translation> +<translation id="6738856801552481343">Se a tela não for touch, pressione Esc.</translation> <translation id="6807086321996342431">Coluna <ph name="COLUMN_NAME" /></translation> <translation id="6808150112686056157">Parar mídia</translation> <translation id="6845383723252244143">Selecionar pasta</translation>
diff --git a/ui/strings/translations/ui_strings_si.xtb b/ui/strings/translations/ui_strings_si.xtb index 93d02f1..ac0ec9f 100644 --- a/ui/strings/translations/ui_strings_si.xtb +++ b/ui/strings/translations/ui_strings_si.xtb
@@ -162,6 +162,7 @@ <translation id="6264365405983206840">සියල්ල තෝරන්න</translation> <translation id="6346952829206698721">ක්ලිප්බෝඩ් වෙතින් අලවන්න</translation> <translation id="6364916375976753737">වමට ස්ක්රෝල් කරන්න</translation> +<translation id="63712816010840859">වත්මන් සංදර්ශකය ස්පර්ශ තිරයක් නොවේ නම්, Esc ඔබන්න.</translation> <translation id="6394627529324717982">කොමාව</translation> <translation id="6397363302884558537">කථනය නවතන්න</translation> <translation id="6404817160109697034">{SECONDS,plural, =1{තත්පර 1 කට පෙර}one{තත්පර # කට පෙර}other{තත්පර # කට පෙර}}</translation> @@ -173,6 +174,7 @@ <translation id="6612467943526193239">ක්රමාංකනයෙන් පිට වීමට Esc ඔබන්න.</translation> <translation id="6620110761915583480">ගොනුව සුරකින්න</translation> <translation id="6699343763173986273">මාධ්යය ඊළඟ ඛණ්ඩය</translation> +<translation id="6738856801552481343">මෙම සංදර්ශකය ස්පර්ශ තිරයක් නොවේ නම්, Esc ඔබන්න.</translation> <translation id="6807086321996342431"><ph name="COLUMN_NAME" /> තීරුව</translation> <translation id="6808150112686056157">මාධ්ය නැවතුම</translation> <translation id="6845383723252244143">ෆෝල්ඩරය තෝරන්න</translation>
diff --git a/ui/strings/translations/ui_strings_sq.xtb b/ui/strings/translations/ui_strings_sq.xtb index ac74af6a..87eabfd 100644 --- a/ui/strings/translations/ui_strings_sq.xtb +++ b/ui/strings/translations/ui_strings_sq.xtb
@@ -162,6 +162,7 @@ <translation id="6264365405983206840">Zgjidh të &gjitha</translation> <translation id="6346952829206698721">Ngjit nga kujtesa e fragmenteve</translation> <translation id="6364916375976753737">Lëvize majtas</translation> +<translation id="63712816010840859">Nëse ekrani aktual nuk është një ekran me prekje, shtyp tastin Esc.</translation> <translation id="6394627529324717982">Presje</translation> <translation id="6397363302884558537">Ndalo së foluri</translation> <translation id="6404817160109697034">{SECONDS,plural, =1{1 sek. më parë}other{# sek. më parë}}</translation> @@ -173,6 +174,7 @@ <translation id="6612467943526193239">Për të dalë nga kalibrimi, shtyp Esc.</translation> <translation id="6620110761915583480">Ruaj skedarin</translation> <translation id="6699343763173986273">Pjesa tjetër e medias</translation> +<translation id="6738856801552481343">Nëse ky ekran nuk është një ekran me prekje, shtyp tastin Esc.</translation> <translation id="6807086321996342431">Kolona "<ph name="COLUMN_NAME" />"</translation> <translation id="6808150112686056157">Ndalimi i medias</translation> <translation id="6845383723252244143">Zgjidh dosje</translation>
diff --git a/v8 b/v8 index 7d09849..0a3957f 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit 7d09849bb20b29cc989b14e62e086f1ded0a4134 +Subproject commit 0a3957f54665939324a11b9cc932e9d9332eefc9