diff --git a/DEPS b/DEPS index 2fcd620b..a1db9858 100644 --- a/DEPS +++ b/DEPS
@@ -311,11 +311,11 @@ # 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': '364904b9e54b71984d4f45b5df1720a0e90a4d63', + 'v8_revision': 'e6852566c1c828247d1729307214cd2ad935183d', # 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': 'eaa71709c58d65d2413895617478891e51536f4e', + 'angle_revision': 'e2477b824c885cdc56ccc13d2afa896594b055d0', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -334,7 +334,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:10.20221016.1.1', + 'fuchsia_version': 'version:10.20221017.1.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -358,7 +358,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. - 'freetype_revision': '5182264a40e70ff31be0a0ec8a0d5ffb5f65582e', + 'freetype_revision': '8493877e78596cf7fe8eb008708070e3852d104a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling freetype # and whatever else without interference from each other. @@ -386,7 +386,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': '6118f2c7911a14d063e193bbd02265a557e0b5d4', + 'devtools_frontend_revision': '75e1a0a79da4b549b032160d636cb240140c64f3', # 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. @@ -422,7 +422,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': '6ee03bfc569b8d9ca5dbb2f3045fa6f1bbf107dc', + 'dawn_revision': 'df3a0462ad69db351d84ab24ce23279f566f6e78', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -466,7 +466,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': '9572e56a12c88c011d504a707ca94952be4664f9', + 'libcxxabi_revision': '685c4ad257da543bdf9e3a391c28b3e4ac1f8aac', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -818,7 +818,7 @@ 'src/clank': { 'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' + - '67954dc5e564a363e2e4fb8477413a7e128ca621', + '15d766b5331c1eb876c2e286499e3aa4ebb92957', 'condition': 'checkout_android and checkout_src_internal and not checkout_clank_via_src_internal', }, @@ -1002,7 +1002,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': '904AOJizpni7pUzLC0rW57hAs0k1gQPPnwmoCPwvQ0EC', + 'version': 'iMCJS_4q6z9bSKJVJVw5ZR9qdI_5iZilsQytJhVNWz8C', }, ], 'condition': 'checkout_android', @@ -1068,7 +1068,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_build_tools/lint', - 'version': 'DO1bMH_JFEfZXSkAknIs7AfgNh4IwLtJaeMJTdzfuJwC', + 'version': '-yqfSSiekeQe-1juzudRLkikLNk6_VZyv6tz2_GiDO4C', }, ], 'condition': 'checkout_android', @@ -1251,7 +1251,7 @@ Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '9ed006112f5d4ea453badf53e228571af6688b5d', + 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '60875f925c52de27441d0254826800e269807457', 'condition': 'checkout_src_internal', }, @@ -1666,7 +1666,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a44f85ffb667c4b69b6717f8b656c27b90d93b05', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd905018c08900932c36d228953cf1c0dc8fdf31f', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1700,7 +1700,7 @@ }, 'src/third_party/re2/src': - Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '55306e042c50b0f5b1be358ec05f45cff2db608a', + Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '0e7fc996e99d6b87b6bfb2f164f6ae759382e9e2', 'src/third_party/r8': { 'packages': [ @@ -1851,7 +1851,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '54213a2e237f1bcbccf3b16e99a6b6ff51c75d1c', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'ef434a333551629ae4b4fa958c245b8cf11fe703', + Var('webrtc_git') + '/src.git' + '@' + 'a92ba289224ed9425bffe59edc41a0cc79292fb1', # 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. @@ -1921,7 +1921,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@e5f3a1395b03878bc664d239de232613bf958971', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@aa231cdfa69a852a7fc65579f73447655409afb7', 'condition': 'checkout_src_internal', }, @@ -1973,7 +1973,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'EisCLECJ4ME6qmkDcGqdCWk1iPQMWloo17i8ckdYPwAC', + 'version': 'E-ZJEFC7ItD5Heer1t9KKdsE8Kbz3tAgnsYWspC7ApwC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn index 5382838..522275fd 100644 --- a/android_webview/BUILD.gn +++ b/android_webview/BUILD.gn
@@ -624,6 +624,7 @@ "java/src/org/chromium/android_webview/WebMessageListenerInfo.java", "java/src/org/chromium/android_webview/WebViewChromiumRunQueue.java", "java/src/org/chromium/android_webview/WebviewErrorCode.java", + "java/src/org/chromium/android_webview/autofill/AndroidAutofillSafeModeAction.java", "java/src/org/chromium/android_webview/gfx/AwDrawFnImpl.java", "java/src/org/chromium/android_webview/gfx/AwFunctor.java", "java/src/org/chromium/android_webview/gfx/AwGLFunctor.java",
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 7e8820c..1cc561de6 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -48,6 +48,7 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import org.chromium.android_webview.autofill.AndroidAutofillSafeModeAction; import org.chromium.android_webview.common.AwFeatures; import org.chromium.android_webview.common.AwSwitches; import org.chromium.android_webview.gfx.AwDrawFnImpl; @@ -1160,6 +1161,11 @@ private void initializeAutofillProviderIfNecessary() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return; + if (AndroidAutofillSafeModeAction.isAndroidAutofillDisabled()) { + Log.i(TAG, "Android autofill is disabled by SafeMode"); + return; + } + if (mAutofillProvider == null) { mAutofillProvider = new AutofillProvider(mContext, mContainerView, mWebContents, "Android WebView");
diff --git a/android_webview/java/src/org/chromium/android_webview/BrowserSafeModeActionList.java b/android_webview/java/src/org/chromium/android_webview/BrowserSafeModeActionList.java index 871674e..6632e2b 100644 --- a/android_webview/java/src/org/chromium/android_webview/BrowserSafeModeActionList.java +++ b/android_webview/java/src/org/chromium/android_webview/BrowserSafeModeActionList.java
@@ -4,22 +4,22 @@ package org.chromium.android_webview; +import org.chromium.android_webview.autofill.AndroidAutofillSafeModeAction; import org.chromium.android_webview.common.SafeModeAction; import org.chromium.android_webview.variations.VariationsSeedSafeModeAction; -/** - * Exposes the SafeModeActions supported by the browser process. - */ +/** Exposes the SafeModeActions supported by the browser process. */ public final class BrowserSafeModeActionList { // Do not instantiate this class. private BrowserSafeModeActionList() {} /** - * A list of SafeModeActions supported in the browser process. The set of actions to be - * executed will be specified by the nonembedded SafeModeService, however each action (if - * specified by the service) will be executed in the order listed below. + * A list of SafeModeActions supported in the browser process. The set of actions to be executed + * will be specified by the nonembedded SafeModeService, however each action (if specified by + * the service) will be executed in the order listed below. */ public static final SafeModeAction[] sList = { new VariationsSeedSafeModeAction(), + new AndroidAutofillSafeModeAction(), }; }
diff --git a/android_webview/java/src/org/chromium/android_webview/autofill/AndroidAutofillSafeModeAction.java b/android_webview/java/src/org/chromium/android_webview/autofill/AndroidAutofillSafeModeAction.java new file mode 100644 index 0000000..1e3673fb --- /dev/null +++ b/android_webview/java/src/org/chromium/android_webview/autofill/AndroidAutofillSafeModeAction.java
@@ -0,0 +1,38 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview.autofill; + +import androidx.annotation.NonNull; + +import org.chromium.android_webview.common.SafeModeAction; + +/** + * A {@link SafeModeAction} to disable autofill provided by Android framework. + * + * This action does not itself do any work. AwContents checks if this action + * is enabled, to decide whether to initialize android autofill or not. + */ +public class AndroidAutofillSafeModeAction implements SafeModeAction { + // This ID should not be changed or reused. + public static final String ID = "disable_android_autofill"; + + private static boolean sIsAndroidAutofillDisabled; + + @Override + @NonNull + public String getId() { + return ID; + } + + @Override + public boolean execute() { + sIsAndroidAutofillDisabled = true; + return true; + } + + public static boolean isAndroidAutofillDisabled() { + return sIsAndroidAutofillDisabled; + } +}
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index ee2bff2..8c65f86 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -177,9 +177,6 @@ Flag.baseFeature(AutofillFeatures.AUTOFILL_PARSE_MERCHANT_PROMO_CODE_FIELDS, "When enabled, Autofill will attempt to find merchant promo/coupon/gift code " + "fields when parsing forms."), - Flag.baseFeature(AutofillFeatures.AUTOFILL_RATIONALIZE_STREET_ADDRESS_AND_ADDRESS_LINE, - "Rationalizes (street address, address line 2) field sequences to " - + "(address line1, address line 2)."), Flag.baseFeature(AutofillFeatures.AUTOFILL_FILL_CREDIT_CARD_AS_PER_FORMAT_STRING, "When enabled, Autofill tries to infer the credit card expiry date format " + "from the label and placeholder."),
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AndroidAutofillSafeModeTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidAutofillSafeModeTest.java new file mode 100644 index 0000000..60580a9 --- /dev/null +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AndroidAutofillSafeModeTest.java
@@ -0,0 +1,78 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.android_webview.test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import android.os.Build; + +import androidx.annotation.RequiresApi; +import androidx.test.filters.SmallTest; + +import org.junit.After; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.android_webview.autofill.AndroidAutofillSafeModeAction; +import org.chromium.android_webview.common.SafeModeAction; +import org.chromium.android_webview.common.SafeModeController; +import org.chromium.android_webview.test.AwActivityTestRule.TestDependencyFactory; +import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.MinAndroidSdkLevel; + +import java.util.Set; + +/** + * Tests for WebView AndroidAutofillSafeMode. + */ +@RunWith(AwJUnit4ClassRunner.class) +@MinAndroidSdkLevel(Build.VERSION_CODES.O) +@RequiresApi(Build.VERSION_CODES.O) +public class AndroidAutofillSafeModeTest { + public static final String TAG = "AndroidAutofillTest"; + + @Rule + public AwActivityTestRule mRule = new AwActivityTestRule(); + + @After + public void tearDown() { + SafeModeController.getInstance().unregisterActionsForTesting(); + } + + @Test + @SmallTest + @Feature({"AndroidWebView"}) + public void testAutofillProviderNotInitialised() throws Throwable { + // Given + SafeModeController safeModeController = SafeModeController.getInstance(); + safeModeController.registerActions( + new SafeModeAction[] {new AndroidAutofillSafeModeAction()}); + safeModeController.executeActions(Set.of(AndroidAutofillSafeModeAction.ID)); + + // When + AwTestContainerView mTestContainerView = mRule.createAwTestContainerViewOnMainSync( + new TestAwContentsClient(), false, new TestDependencyFactory()); + + // Then + assertNull(mTestContainerView.getAwContents().getAutofillProviderForTesting()); + } + + @Test + @SmallTest + @Feature({"AndroidWebView"}) + public void testSafeModeActionSavesState() throws Throwable { + // Given + assertFalse(AndroidAutofillSafeModeAction.isAndroidAutofillDisabled()); + + // When + new AndroidAutofillSafeModeAction().execute(); + + // Then + assertTrue(AndroidAutofillSafeModeAction.isAndroidAutofillDisabled()); + } +}
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn index d7f20d1..fd7bb78 100644 --- a/android_webview/test/BUILD.gn +++ b/android_webview/test/BUILD.gn
@@ -307,6 +307,7 @@ ] sources = [ "../javatests/src/org/chromium/android_webview/test/AcceptLanguageTest.java", + "../javatests/src/org/chromium/android_webview/test/AndroidAutofillSafeModeTest.java", "../javatests/src/org/chromium/android_webview/test/AndroidProtocolHandlerTest.java", "../javatests/src/org/chromium/android_webview/test/AndroidScrollIntegrationTest.java", "../javatests/src/org/chromium/android_webview/test/AndroidViewIntegrationTest.java",
diff --git a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc index 03094277..104b611 100644 --- a/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc +++ b/ash/public/cpp/external_arc/message_center/arc_notification_content_view.cc
@@ -335,7 +335,7 @@ notification.should_show_snooze_button()); UpdateControlButtonsVisibility(); - accessible_name_ = notification.accessible_name(); + accessible_name_ = message_view_->CreateAccessibleName(notification); UpdateSnapshot(); }
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 53fe0d72..17050c64 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -91,6 +91,7 @@ <translation id="1407069428457324124">Donkertema</translation> <translation id="1410568680128842168"><ph name="DATE_CELL_TOOL_TIP" />. Gebruik pylsleutels om tussen datums te navigeer.</translation> <translation id="1414271762428216854"><ph name="APP_NAME" />, geïnstalleerde program</translation> +<translation id="1415846719612499304">Wys netwerklys. <ph name="STATE_TEXT" />.</translation> <translation id="1419738280318246476">Ontsluit toestel om die kennisgewinghandeling uit te voer</translation> <translation id="1420408895951708260">Wissel Aandbeligting. <ph name="STATE_TEXT" /></translation> <translation id="1420732223884894666">Bekyk jou foon se onlangse foto's en media op jou <ph name="DEVICE_TYPE" /></translation> @@ -305,6 +306,7 @@ <translation id="2678852583403169292">Hardoplees-kieslys</translation> <translation id="2689613560355655046">Lessenaar 8</translation> <translation id="2695305337569143674">web</translation> +<translation id="2697697418792422688">Wys sleutelbordinstellings. <ph name="KEYBOARD_NAME" /> is gekies.</translation> <translation id="2700493154570097719">Stel jou sleutelbord</translation> <translation id="2704781753052663061">Sluit aan by ander Wi-Fi-netwerke</translation> <translation id="2705001408393684014">Wissel mikrofoon. <ph name="STATE_TEXT" /></translation> @@ -772,6 +774,7 @@ <translation id="5327248766486351172">Naam</translation> <translation id="5329548388331921293">Koppel tans …</translation> <translation id="5331975486040154427">USB C-toestel (agterste poort aan linkerkant)</translation> +<translation id="533282197239610265">Wys uitsaaitoestelle</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (regs)</translation> <translation id="5352250171825660495">Donkertema is aan</translation> <translation id="5356963482258194581">Wissel tussen donker- en ligtema. Regsklik op die werkskerm en kies Muurpapier en Styl.</translation> @@ -803,10 +806,12 @@ <translation id="553675580533261935">Gaan tans uit sessie</translation> <translation id="5537725057119320332">Saai uit</translation> <translation id="554893713779400387">Wissel diktering</translation> +<translation id="5558091555391176027">Wissel hoë sigbaarheid van Nabydeling</translation> <translation id="5560420195677022218">Bekyk jou foon se programme op jou <ph name="DEVICE_TYPE" /></translation> <translation id="556042886152191864">Knoppie</translation> <translation id="5571066253365925590">Bluetooth geaktiveer</translation> <translation id="557563299383177668">Volgende paragraaf</translation> +<translation id="5577082622442191756">Wissel Bluetooth. <ph name="STATE_TEXT" />.</translation> <translation id="5577281275355252094">Maak seker dat Bluetooth op jou foon geaktiveer is as jy Foonsentrum wil gebruik</translation> <translation id="5580000943347215299">Biblioteek</translation> <translation id="558849140439112033">Sleep om 'n area te kies om vas te vang</translation> @@ -875,6 +880,7 @@ <translation id="595202126637698455">Prestasie-nasporing geaktiveer</translation> <translation id="5955304353782037793">program</translation> <translation id="5958529069007801266">Gebruiker onder toesig</translation> +<translation id="5965524703725988602">Wissel Donkertema. <ph name="STATE_TEXT" />.</translation> <translation id="5976112937189445008">Druk Enter om venster op te neem</translation> <translation id="5977415296283489383">Oorfone</translation> <translation id="5978382165065462689">Deel tans beheer oor jou skerm deur afstandbystand.</translation> @@ -1117,6 +1123,7 @@ <translation id="7378889811480108604">Batterybespaardermodus is af</translation> <translation id="7382680553121047388">Aan</translation> <translation id="7384028040782072252">Regsklik op enige plek om jou programme te herrangskik</translation> +<translation id="7386767620098596324">Wissel netwerkverbinding. <ph name="STATE_TEXT" />.</translation> <translation id="7392563512730092880">Jy kan altyd later in Instellings opstel.</translation> <translation id="7405710164030118432">Voer jou Family Link-ouertoegangskode in om die toestel te ontsluit</translation> <translation id="7406608787870898861">Stel jou mobiele netwerk klaar op</translation> @@ -1256,6 +1263,7 @@ <translation id="8142441511840089262">Dubbelklik</translation> <translation id="8142699993796781067">Privaat netwerk</translation> <translation id="8144760705599030999">Stoor jou <ph name="NAME" /> in <ph name="EMAIL" /> om vinniger met jou ander toestelle saamgebind te word</translation> +<translation id="8149413265954228307">Wys Bluetooth-instellings. <ph name="STATE_TEXT" />.</translation> <translation id="8152092012181020186">Druk Ctrl + W om toe te maak.</translation> <translation id="8152264887680882389"><ph name="TEXT" />, outovoltooi</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Jou administrateur bestuur hierdie instelling.</translation> @@ -1316,6 +1324,7 @@ <translation id="8473301994082929012"><ph name="ORGANIZATION_NAME" /> het <ph name="FEATURE_STATE" /> <ph name="FEATURE_NAME" />.</translation> <translation id="8477270416194247200">Druk Alt+Search of Shift om te kanselleer.</translation> <translation id="8492573885090281069"><ph name="DISPLAY_NAME" /> werk nie met <ph name="SPECIFIED_RESOLUTION" /> nie. Die resolusie is verander na <ph name="FALLBACK_RESOLUTION" />. Klik Bevestig om veranderinge te hou. Die vorige instellings sal oor <ph name="TIMEOUT_SECONDS" /> teruggestel word.</translation> +<translation id="8496402167048257517">Wys Nabydeling-instellings</translation> <translation id="85123341071060231">Jou Chromebook se Bluetooth is af. Voer wagwoord in om jou Chromebook te ontsluit.</translation> <translation id="8513108775083588393">Outodraai</translation> <translation id="851458219935658693">Wys vensters van die huidige lessenaar af; radioknoppie is gekies</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index 07b663b..f45e99a 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -171,7 +171,7 @@ <translation id="1838895407229022812">Начная падсветка выключана.</translation> <translation id="1862380676329487333">Абнавіць і выйсці</translation> <translation id="1864454756846565995">Прылада USB-C (порт ззаду)</translation> -<translation id="1869497990620230175">Абраныя файлы</translation> +<translation id="1869497990620230175">Хуткія файлы</translation> <translation id="1879018240766558464">Вокны ў рэжыме інкогніта зараз не падтрымліваюцца. Іншыя праграмы будуць захаваны.</translation> <translation id="1882814835921407042">Мабільная сетка адсутнічае</translation> <translation id="1882897271359938046">Выконваецца адлюстраванне на дысплэй <ph name="DISPLAY_NAME" /></translation> @@ -598,7 +598,7 @@ <translation id="4379531060876907730">Гэта інструменты стыла</translation> <translation id="4389184120735010762">Вы націснулі спалучэнне клавіш для прыстыкаванай лупы. Уключыць яе?</translation> <translation id="439598569299422042">Прыпынена, <ph name="SIZE_INFO" /></translation> -<translation id="440113666232554208">Не ўдалося захаваць трансляцыю экрана</translation> +<translation id="440113666232554208">Не ўдалося захаваць скрынкаст</translation> <translation id="4405151984121254935">Падключаная перыферыйная прылада гэтага тыпу не падтрымліваецца</translation> <translation id="4406883609789734330">Імгненныя субцітры</translation> <translation id="4412944820643904175"><ph name="FEATURE_NAME" />: выключана.</translation> @@ -728,7 +728,7 @@ <translation id="5083553833479578423">Адкрыйце больш функцый Памочніка.</translation> <translation id="509790653408515442">Тут будуць з'яўляцца праграмы з вашага тэлефона, якія вы адкрываеце без спампоўвання</translation> <translation id="5098537242461068432">Працоўны стол і вокны зноў адкрыты</translation> -<translation id="5104236669533825617">Не ўдалося запусціць трансляцыю экрана</translation> +<translation id="5104236669533825617">Не ўдалося запусціць скрынкаст</translation> <translation id="5107522548814527560">Інтэрнэт</translation> <translation id="5117590920725113268">Паказаць наступны месяц</translation> <translation id="5136175204352732067">Падключана іншая клавіятура</translation> @@ -929,7 +929,7 @@ <translation id="6254629735336163724">Зафіксаваны гарызантальны фармат</translation> <translation id="6259254695169772643">Для выбару выкарыстайце стыло</translation> <translation id="6267036997247669271"><ph name="NAME" />: ідзе актывацыя...</translation> -<translation id="6274202259872570803">Трансляцыя экрана</translation> +<translation id="6274202259872570803">Скрынкаст</translation> <translation id="6283712521836204486">Рэжым "Не турбаваць" выключаны.</translation> <translation id="6284232397434400372">Раздзяляльнасць зменена</translation> <translation id="6288235558961782912"><ph name="USER_EMAIL_ADDRESS" /> можна дадаць пазней з дазволу бацькоў.</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 896519c..be8e0127 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -91,6 +91,7 @@ <translation id="1407069428457324124">Tamna tema</translation> <translation id="1410568680128842168"><ph name="DATE_CELL_TOOL_TIP" />. Pomoću tipki sa strelicama navigirajte datumima.</translation> <translation id="1414271762428216854"><ph name="APP_NAME" />, instalirana aplikacija</translation> +<translation id="1415846719612499304">Prikažite popis mreža. <ph name="STATE_TEXT" />.</translation> <translation id="1419738280318246476">Otključajte uređaj da izvršite radnju obavještenja</translation> <translation id="1420408895951708260">Uključite ili isključite Noćno svjetlo. <ph name="STATE_TEXT" /></translation> <translation id="1420732223884894666">Pregledajte nedavne fotografije i medije s telefona na uređaju <ph name="DEVICE_TYPE" /></translation> @@ -305,6 +306,7 @@ <translation id="2678852583403169292">Meni Odaberite za govor</translation> <translation id="2689613560355655046">Radna površina 8</translation> <translation id="2695305337569143674">web</translation> +<translation id="2697697418792422688">Prikažite postavke tipkovnice. Odabrana je <ph name="KEYBOARD_NAME" />.</translation> <translation id="2700493154570097719">Postavite tastaturu</translation> <translation id="2704781753052663061">Pridružite se drugim WiFi mrežama</translation> <translation id="2705001408393684014">Uključite/isključite mikrofon. <ph name="STATE_TEXT" /></translation> @@ -771,6 +773,7 @@ <translation id="5327248766486351172">Ime</translation> <translation id="5329548388331921293">Povezivanje…</translation> <translation id="5331975486040154427">USB-C uređaj (lijevi priključak na zadnjem dijelu)</translation> +<translation id="533282197239610265">Prikažite uređaje za emitiranje</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (desno)</translation> <translation id="5352250171825660495">Tamna tema je uključena</translation> <translation id="5356963482258194581">Prebacite se između tamne i svijetle teme. Kliknite desnim klikom na radnoj površini i odaberite pozadinsku sliku i stil.</translation> @@ -802,10 +805,12 @@ <translation id="553675580533261935">Izlazak iz sesije</translation> <translation id="5537725057119320332">Emitiraj</translation> <translation id="554893713779400387">Uključi/isključi diktiranje</translation> +<translation id="5558091555391176027">Prebacite visoku vidljivost dijeljenja u blizini</translation> <translation id="5560420195677022218">Pogledajte aplikacije telefona na uređaju <ph name="DEVICE_TYPE" /></translation> <translation id="556042886152191864">Dugme</translation> <translation id="5571066253365925590">Bluetooth je omogućen</translation> <translation id="557563299383177668">Sljedeći pasus</translation> +<translation id="5577082622442191756">Prebacite Bluetooth. <ph name="STATE_TEXT" />.</translation> <translation id="5577281275355252094">Bluetooth na telefonu mora biti uključen da biste koristili Phone Hub</translation> <translation id="5580000943347215299">Biblioteka</translation> <translation id="558849140439112033">Prevucite da odaberete oblast za snimanje</translation> @@ -874,6 +879,7 @@ <translation id="595202126637698455">Praćenje performansi je omogućeno</translation> <translation id="5955304353782037793">apl</translation> <translation id="5958529069007801266">Korisnik pod nadzorom</translation> +<translation id="5965524703725988602">Prebacite tamnu temu. <ph name="STATE_TEXT" />.</translation> <translation id="5976112937189445008">Pritisnite Enter da snimite prozor</translation> <translation id="5977415296283489383">Slušalica</translation> <translation id="5978382165065462689">Dijeljenje kontrole nad vašim ekranom putem pomoći na daljinu.</translation> @@ -1116,6 +1122,7 @@ <translation id="7378889811480108604">Način rada uštede baterije je isključen</translation> <translation id="7382680553121047388">Uključeno</translation> <translation id="7384028040782072252">Kliknite desnim klikom bilo gdje da promijenite redoslijed aplikacija</translation> +<translation id="7386767620098596324">Prebacite mrežnu vezu. <ph name="STATE_TEXT" />.</translation> <translation id="7392563512730092880">Uvijek ga možete postaviti kasnije u Postavkama.</translation> <translation id="7405710164030118432">Da otključate uređaj, unesite kôd za pristup roditelja za Family Link</translation> <translation id="7406608787870898861">Završite postavljanje mobilne mreže</translation> @@ -1255,6 +1262,7 @@ <translation id="8142441511840089262">Dvostruki klik</translation> <translation id="8142699993796781067">Privatna mreža</translation> <translation id="8144760705599030999">Sačuvajte uređaj <ph name="NAME" /> na račun <ph name="EMAIL" /> za brže uparivanje s drugim uređajima</translation> +<translation id="8149413265954228307">Prikažite postavke Bluetootha. <ph name="STATE_TEXT" />.</translation> <translation id="8152092012181020186">Pritisnite Ctrl + W da zatvorite.</translation> <translation id="8152264887680882389"><ph name="TEXT" />, automatsko dovršavanje</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Ovom postavkom upravlja vaš administrator.</translation> @@ -1315,6 +1323,7 @@ <translation id="8473301994082929012"><ph name="ORGANIZATION_NAME" /> je funkciju <ph name="FEATURE_NAME" /> stavila u status <ph name="FEATURE_STATE" />.</translation> <translation id="8477270416194247200">Za otkazivanje pritisnite Alt + tipku za pretraživanje ili Shift.</translation> <translation id="8492573885090281069"><ph name="DISPLAY_NAME" /> ne podržava <ph name="SPECIFIED_RESOLUTION" />. Rezolucija je promijenjena na <ph name="FALLBACK_RESOLUTION" />. Kliknite Potvrdi da zadržite promjene. Prethodne postavke će se vratiti za <ph name="TIMEOUT_SECONDS" />.</translation> +<translation id="8496402167048257517">Prikažite postavke dijeljenja u blizini</translation> <translation id="85123341071060231">Bluetooth na vašem Chromebooku je isključen. Da otključate Chromebook, unesite lozinku.</translation> <translation id="8513108775083588393">Aut. rotiranje</translation> <translation id="851458219935658693">Prikazivanje prozora s trenutne radne površine, odabrano je dugme za izbor</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index 8c233b50..7eccca4 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -91,6 +91,7 @@ <translation id="1407069428457324124">Tamna tema</translation> <translation id="1410568680128842168"><ph name="DATE_CELL_TOOL_TIP" />. Za kretanje od jednog do drugog datuma koristite tipke sa strelicama.</translation> <translation id="1414271762428216854"><ph name="APP_NAME" />, instalirana aplikacija</translation> +<translation id="1415846719612499304">Prikažite popis mreža. <ph name="STATE_TEXT" />.</translation> <translation id="1419738280318246476">Otključajte uređaj za izvršenje radnje obavijesti</translation> <translation id="1420408895951708260">Uključite ili isključite Noćno svjetlo. <ph name="STATE_TEXT" /></translation> <translation id="1420732223884894666">Pregledajte nedavne fotografije i medije telefona na uređaju <ph name="DEVICE_TYPE" />.</translation> @@ -305,6 +306,7 @@ <translation id="2678852583403169292">Izbornik Odabir za govor</translation> <translation id="2689613560355655046">Radna površina 8</translation> <translation id="2695305337569143674">web</translation> +<translation id="2697697418792422688">Prikažite postavke tipkovnice. Odabrana je <ph name="KEYBOARD_NAME" />.</translation> <translation id="2700493154570097719">Postavite tipkovnicu</translation> <translation id="2704781753052663061">Pridružite se drugim Wi-Fi mrežama</translation> <translation id="2705001408393684014">Pomaknite klizač mikrofona udesno. <ph name="STATE_TEXT" /></translation> @@ -770,6 +772,7 @@ <translation id="5327248766486351172">Naziv</translation> <translation id="5329548388331921293">Povezivanje...</translation> <translation id="5331975486040154427">USB-C uređaj (stražnji lijevi priključak)</translation> +<translation id="533282197239610265">Prikažite uređaje za emitiranje</translation> <translation id="5344128444027639014"><ph name="BATTERY_PERCENTAGE" />% (desna)</translation> <translation id="5352250171825660495">Tamna tema je uključena</translation> <translation id="5356963482258194581">Prebacite se na tamnu ili svijetlu temu. Desnim klikom kliknite radnu površinu i odaberite stavku Pozadine i stilovi.</translation> @@ -801,10 +804,12 @@ <translation id="553675580533261935">Napuštanje sesije</translation> <translation id="5537725057119320332">Emitiraj</translation> <translation id="554893713779400387">Uključivanje/isključivanje diktata</translation> +<translation id="5558091555391176027">Prebacite visoku vidljivost dijeljenja u blizini</translation> <translation id="5560420195677022218">Pogledajte obavijesti s telefona na uređaju <ph name="DEVICE_TYPE" /></translation> <translation id="556042886152191864">Gumb</translation> <translation id="5571066253365925590">Bluetooth omogućen</translation> <translation id="557563299383177668">Sljedeći odlomak</translation> +<translation id="5577082622442191756">Prebacite Bluetooth. <ph name="STATE_TEXT" />.</translation> <translation id="5577281275355252094">Da biste mogli koristiti Phone hub, provjerite je li na telefonu omogućen Bluetooth</translation> <translation id="5580000943347215299">Zbirka</translation> <translation id="558849140439112033">Povucite da biste odabrali područje za fotografiranje</translation> @@ -873,6 +878,7 @@ <translation id="595202126637698455">Omogućeno je praćenje izvedbe</translation> <translation id="5955304353782037793">apl</translation> <translation id="5958529069007801266">Nadzirani korisnik</translation> +<translation id="5965524703725988602">Prebacite tamnu temu. <ph name="STATE_TEXT" />.</translation> <translation id="5976112937189445008">Pritisnite Enter za snimanje prozora</translation> <translation id="5977415296283489383">Slušalice</translation> <translation id="5978382165065462689">Dijelite kontrolu nad zaslonom putem Daljinske pomoći.</translation> @@ -1115,6 +1121,7 @@ <translation id="7378889811480108604">Način štednje baterije je isključen</translation> <translation id="7382680553121047388">Uključi</translation> <translation id="7384028040782072252">Kliknite desnom tipkom bilo gdje da biste promijenili redoslijed svojih aplikacija</translation> +<translation id="7386767620098596324">Prebacite mrežnu vezu. <ph name="STATE_TEXT" />.</translation> <translation id="7392563512730092880">Tu značajku možete postaviti i kasnije u Postavkama.</translation> <translation id="7405710164030118432">Da biste otključali uređaj, unesite kôd za roditeljski pristup Family Linka</translation> <translation id="7406608787870898861">Dovršite postavljanje mobilne mreže</translation> @@ -1254,6 +1261,7 @@ <translation id="8142441511840089262">Dvostruki klik</translation> <translation id="8142699993796781067">Privatna mreža</translation> <translation id="8144760705599030999">Spremite uređaj <ph name="NAME" /> na račun <ph name="EMAIL" /> radi bržeg uparivanja s ostalim uređajima</translation> +<translation id="8149413265954228307">Prikažite postavke Bluetootha. <ph name="STATE_TEXT" />.</translation> <translation id="8152092012181020186">Pritisnite Ctrl + W da biste zatvorili.</translation> <translation id="8152264887680882389"><ph name="TEXT" />, samodovrši</translation> <translation id="8155007568264258537"><ph name="FEATURE_NAME" /> Tom postavkom upravlja vaš administrator.</translation> @@ -1314,6 +1322,7 @@ <translation id="8473301994082929012"><ph name="ORGANIZATION_NAME" /> ima <ph name="FEATURE_STATE" /> <ph name="FEATURE_NAME" />.</translation> <translation id="8477270416194247200">Pritisnite Alt + Pretraživanje ili Shift da biste otkazali.</translation> <translation id="8492573885090281069"><ph name="DISPLAY_NAME" /> ne podržava razlučivost <ph name="SPECIFIED_RESOLUTION" />. Razlučivost je promijenjena u <ph name="FALLBACK_RESOLUTION" />. Kliknite Potvrdi da biste zadržali promjene. Prethodne postavke vratit će se za <ph name="TIMEOUT_SECONDS" />.</translation> +<translation id="8496402167048257517">Prikažite postavke dijeljenja u blizini</translation> <translation id="85123341071060231">Bluetooth na Chromebooku je isključen. Da biste otključali Chromebook, unesite zaporku.</translation> <translation id="8513108775083588393">Autom. zakret.</translation> <translation id="851458219935658693">Prikaži prozore s trenutačne radne površine, odabran je izborni gumb</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 649558d0..b759bac 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -429,6 +429,7 @@ <translation id="3413817803639110246">ჯერჯერობით სანახავი არაფერია</translation> <translation id="3428447136709161042"><ph name="NETWORK_NAME" />-თან კავშირის გაწყვეტა</translation> <translation id="3430396595145920809">უკან დასაბრუნებლად გადაფურცლეთ მარჯვნიდან</translation> +<translation id="3431517721463707585">სამუშაო მაგიდა 14</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="343571671045587506">შეხსენების რედაქტირება</translation> <translation id="3435967511775410570">თითის ანაბეჭდი ამოცნობილია</translation> @@ -669,6 +670,7 @@ <translation id="4731797938093519117">მშობლის წვდომა</translation> <translation id="4733161265940833579"><ph name="BATTERY_PERCENTAGE" />% (მარცხენა)</translation> <translation id="4734965478015604180">ჰორიზონტალური</translation> +<translation id="4735944890391795473">სამუშაო მაგიდა 12</translation> <translation id="473775607612524610">განახლება</translation> <translation id="4740516757091333363">გსურთ, წაშალოთ შენახული სამუშაო მაგიდა?</translation> <translation id="4752784485658729358">დაშვებულია მხოლოდ 6 შენახული სამუშაო მაგიდა. ახლის შესანახად წაშალეთ ერთ-ერთი არსებული.</translation> @@ -689,6 +691,7 @@ <translation id="4860284199500934869">შეამოწმეთ კავშირი ქსელთან, <ph name="FILENAME" /> რომ ჩამოტვირთოთ</translation> <translation id="486056901304535126">ჩამოტვირთვას მოგვიანებით შევეცდებით. ჩამოტვირთვის დასრულებამდე მეტყველება გაეგზავნება Google-ს დასამუშავებლად.</translation> <translation id="4864369630010738180">მიმდინარეობს შესვლა…</translation> +<translation id="4864648187878336334">სამუშაო მაგიდა 15</translation> <translation id="4868492592575313542">გააქტიურებულია</translation> <translation id="4872237917498892622">Alt+ძიება ან Shift</translation> <translation id="4881695831933465202">გახსნა</translation> @@ -715,6 +718,7 @@ <ph name="NOTIFICATION_1" />, <ph name="NOTIFICATION_2" />, <ph name="NUM_OTHER_NOTIFICATION" /></translation> +<translation id="4987738733603015246">სამუშაო მაგიდა 16</translation> <translation id="5003993274120026347">შემდეგი წინადადება</translation> <translation id="5016558321564993266">მარკერის გადართვა. <ph name="STATE_TEXT" /></translation> <translation id="5030687792513154421">დრო ამოიწურა</translation> @@ -730,6 +734,7 @@ <translation id="5098537242461068432">სამუშაო მაგიდა და ფანჯრები ხელახლა გაიხსნა</translation> <translation id="5104236669533825617">სკრინკასტის შექმნა ვერ მოხერხდა</translation> <translation id="5107522548814527560">ვები</translation> +<translation id="5111318697104479778"><ph name="DESC" />, <ph name="STRENGTH" /></translation> <translation id="5117590920725113268">შემდეგი თვის ჩვენება</translation> <translation id="5136175204352732067">დაკავშირებულია განსხვავებული კლავიატურა</translation> <translation id="5147567197700016471">განბლოკილია</translation> @@ -817,6 +822,7 @@ <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">მიკროფონის ჯეკი</translation> <translation id="5652575806481723716"><ph name="FOCUSED_APP_NAME" /> საჭიროებს ყურადღების მიქცევას.</translation> +<translation id="5662075790140998213">სამუშაო მაგიდა 10</translation> <translation id="5662709761327382534">მიკროფონის ჩაწერაა <ph name="CURRENT_STATE" />, დააჭირეთ კლავიშს enter, თუ გსურთ, მიკროფონის ჩაწერა <ph name="NEW_STATE" /> იყოს</translation> <translation id="5669267381087807207">გააქტიურება</translation> <translation id="5673434351075758678">„<ph name="FROM_LOCALE" />“ გახდა „<ph name="TO_LOCALE" />“ თქვენი პარამეტრების სინქრონიზაციის შემდეგ.</translation> @@ -1016,6 +1022,8 @@ <translation id="6753390234084146956">ჩანართები</translation> <translation id="6757237461819837179">მედიაკონტენტი არ უკრავს</translation> <translation id="6777216307882431711">ელკვება მიეწოდება დაკავშირებულ USB-C მოწყობილობებს</translation> +<translation id="6781002679438061620">სამუშაო მაგიდა 9</translation> +<translation id="6782182743534150858">სამუშაო მაგიდა 13</translation> <translation id="6786750046913594791">საქაღალდის დახურვა</translation> <translation id="6787595647772650851">ბოლო სესიის აღდგენა</translation> <translation id="6790428901817661496">დაკვრა</translation> @@ -1077,6 +1085,7 @@ <translation id="7098053464892629930">ყველა ხელმისაწვდომი ფუნქციის სანახავად ჩამოტვირთეთ აპი <ph name="NAME" />-ისთვის Google Play-დან</translation> <translation id="7098389117866926363">USB-C მოწყობილობა (უკან მდებარე მარცხენა პორტი)</translation> <translation id="7106330611027933926">სამუშაო მაგიდების ზოლის ჩვენება</translation> +<translation id="7116969082764510092">სამუშაო მაგიდა 11</translation> <translation id="7118268675952955085">ეკრანის ანაბეჭდი</translation> <translation id="7126996685418858413">კვირის განმავლობაში გახსნილი</translation> <translation id="7130207228079676353">ყველაზე სავარაუდო</translation> @@ -1174,6 +1183,7 @@ <translation id="7662283695561029522">შეეხეთ პარამეტრების კონფიგურაციისთვის</translation> <translation id="7670953955701272011">ამ თარიღის Google Calendar-ში გახსნა</translation> <translation id="7671610481353807627">აპები დალაგებულია ფერის მიხედვით</translation> +<translation id="7672095158465655885">დაკავშირებულია <ph name="NAME" />-თან, <ph name="SUBTEXT" /></translation> <translation id="7684531502177797067">კამერის შემავალ სიგნალად დაყენებულია <ph name="CAMERA_NAME" />.</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">ახალი ფიჭური ქსელის დამატება</translation> @@ -1455,5 +1465,6 @@ <translation id="974545358917229949">ნაჩვენებია <ph name="RESULT_COUNT" /> შედეგი მოთხოვნაზე: <ph name="QUERY" /></translation> <translation id="98515147261107953">პეიზაჟი</translation> <translation id="990277280839877440">ფანჯარა „<ph name="WINDOW_TITILE" />“ დაიხურა.</translation> +<translation id="994354411665877646"><ph name="NETWORK_NAME" />, <ph name="SUBTEXT" /></translation> <translation id="996204416024568215">ისარგებლეთ უახლესი ფუნქციებითა და უსაფრთხოების გაუმჯობესებებით. განახლება ხორციელდება ფონურ რეჟიმში.</translation> </translationbundle> \ No newline at end of file
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 2395fc9c..73cc239 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -429,6 +429,7 @@ <translation id="3413817803639110246">Сѐ уште нема што да се види</translation> <translation id="3428447136709161042">Прекини ја врската со <ph name="NETWORK_NAME" /></translation> <translation id="3430396595145920809">Повлечете оддесно за да се вратите назад</translation> +<translation id="3431517721463707585">Работна површина 14</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="343571671045587506">Изменете го потсетникот</translation> <translation id="3435967511775410570">Отпечатокот е препознаен</translation> @@ -670,6 +671,7 @@ <translation id="4731797938093519117">Пристап за родители</translation> <translation id="4733161265940833579"><ph name="BATTERY_PERCENTAGE" /> % (лева)</translation> <translation id="4734965478015604180">Хоризонтално</translation> +<translation id="4735944890391795473">Работна површина 12</translation> <translation id="473775607612524610">Ажурирај</translation> <translation id="4740516757091333363">Да се избрише зачуваната работна површина?</translation> <translation id="4752784485658729358">Дозволени се само 6 зачувани работни површини. Отстранете работна површина за да зачувате нова.</translation> @@ -690,6 +692,7 @@ <translation id="4860284199500934869">Проверете ја мрежната врска за да се преземе <ph name="FILENAME" /></translation> <translation id="486056901304535126">Подоцна ќе се изврши обид за преземање. Говорот ќе се испрати во Google за обработка додека да заврши преземањето.</translation> <translation id="4864369630010738180">Се најавува…</translation> +<translation id="4864648187878336334">Работна површина 15</translation> <translation id="4868492592575313542">активиранo</translation> <translation id="4872237917498892622">Alt+Search или Shift</translation> <translation id="4881695831933465202">Отвори</translation> @@ -716,6 +719,7 @@ <ph name="NOTIFICATION_1" />, <ph name="NOTIFICATION_2" />, <ph name="NUM_OTHER_NOTIFICATION" /></translation> +<translation id="4987738733603015246">Работна површина 16</translation> <translation id="5003993274120026347">Следна реченица</translation> <translation id="5016558321564993266">Вклучете/исклучете го означувачот. <ph name="STATE_TEXT" /></translation> <translation id="5030687792513154421">Времето истече</translation> @@ -731,6 +735,7 @@ <translation id="5098537242461068432">Работната површина и прозорците се отворени повторно</translation> <translation id="5104236669533825617">Не може да се создаде снимка на екран</translation> <translation id="5107522548814527560">Интернет</translation> +<translation id="5111318697104479778"><ph name="DESC" />, <ph name="STRENGTH" /></translation> <translation id="5117590920725113268">Прикажи го следниот месец</translation> <translation id="5136175204352732067">Поврзана е друга тастатура</translation> <translation id="5147567197700016471">Отклучено</translation> @@ -818,6 +823,7 @@ <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">Приклучок за микрофон</translation> <translation id="5652575806481723716"><ph name="FOCUSED_APP_NAME" /> го бара вашето внимание.</translation> +<translation id="5662075790140998213">Работна површина 10</translation> <translation id="5662709761327382534">Микрофон за снимање: <ph name="CURRENT_STATE" />. Притиснете Enter за да биде <ph name="NEW_STATE" /> снимањето со микрофонот</translation> <translation id="5669267381087807207">Се активира</translation> <translation id="5673434351075758678">Од „<ph name="FROM_LOCALE" />“ на „<ph name="TO_LOCALE" />“ по синхронизацијата на поставките.</translation> @@ -1017,6 +1023,8 @@ <translation id="6753390234084146956">картички</translation> <translation id="6757237461819837179">Нема пуштени аудиовизуелни содржини</translation> <translation id="6777216307882431711">Се напојуваат поврзани USB-C уреди</translation> +<translation id="6781002679438061620">Работна површина 9</translation> +<translation id="6782182743534150858">Работна површина 13</translation> <translation id="6786750046913594791">Затвори папка</translation> <translation id="6787595647772650851">Обнови ја последната сесија</translation> <translation id="6790428901817661496">Репродуцирај</translation> @@ -1078,6 +1086,7 @@ <translation id="7098053464892629930">Преземете ја апликацијата за <ph name="NAME" /> на Google Play за да ги видите сите достапни функции</translation> <translation id="7098389117866926363">USB-Ц уред (лева порта на задната страна)</translation> <translation id="7106330611027933926">Прикажи ја лентата на работната површина</translation> +<translation id="7116969082764510092">Работна површина 11</translation> <translation id="7118268675952955085">слика од екранот</translation> <translation id="7126996685418858413">Отворено во изминатата седмица</translation> <translation id="7130207228079676353">ВЕРОЈАТНО ЌЕ ГИ КЛИКНЕТЕ</translation> @@ -1175,6 +1184,7 @@ <translation id="7662283695561029522">Допрете за конфигурирање</translation> <translation id="7670953955701272011">Отворете го датумов во „Календарот на Google“</translation> <translation id="7671610481353807627">Апликациите се подредени по боја</translation> +<translation id="7672095158465655885">Поврзано со <ph name="NAME" />, <ph name="SUBTEXT" /></translation> <translation id="7684531502177797067">Влезот на камерата е поставен на <ph name="CAMERA_NAME" />.</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">Додајте нова мобилна мрежа</translation> @@ -1456,5 +1466,6 @@ <translation id="974545358917229949">Се прикажуваат <ph name="RESULT_COUNT" /> резултати за <ph name="QUERY" /></translation> <translation id="98515147261107953">Пејзаж</translation> <translation id="990277280839877440">Прозорецот <ph name="WINDOW_TITILE" /> е затворен.</translation> +<translation id="994354411665877646"><ph name="NETWORK_NAME" />, <ph name="SUBTEXT" /></translation> <translation id="996204416024568215">Преземете ги најновите функции и подобрувања на безбедноста. Ажурирањата се извршуваат во заднина.</translation> </translationbundle> \ No newline at end of file
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index f071fc8..efd4ad51 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -429,6 +429,7 @@ <translation id="3413817803639110246">තවම දැකීමට කිසිවක් නැත</translation> <translation id="3428447136709161042"><ph name="NETWORK_NAME" /> වෙතින් විසන්ධි කරන්න</translation> <translation id="3430396595145920809">ආපසු යාමට දකුණින් ස්වයිප් කරන්න</translation> +<translation id="3431517721463707585">14 වෙනි මේසය</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> <translation id="343571671045587506">සිහිකැඳවීම සංස්කරණ කරන්න</translation> <translation id="3435967511775410570">ඇඟිලි සලකුණු හඳුනා ගෙන ඇත</translation> @@ -669,6 +670,7 @@ <translation id="4731797938093519117">මාපිය ප්රවේශය</translation> <translation id="4733161265940833579"><ph name="BATTERY_PERCENTAGE" />% (වම)</translation> <translation id="4734965478015604180">තිරස්</translation> +<translation id="4735944890391795473">12 වෙනි මේසය</translation> <translation id="473775607612524610">යාවත්කාලීනය</translation> <translation id="4740516757091333363">සුරැකි මේසය මකන්නද?</translation> <translation id="4752784485658729358">සුරැකි මේස 6කට පමණක් ඉඩ දේ. අලුත් එකක් සුරැකීමට මේසයක් ඉවත් කරන්න.</translation> @@ -689,6 +691,7 @@ <translation id="4860284199500934869"><ph name="FILENAME" /> බාගැනීමට ඔබගේ ජාල සබැඳුම පරීක්ෂා කරන්න</translation> <translation id="486056901304535126">බාගැනීම පසුව උත්සාහ කරනු ඇත. බාගැනීම සම්පූර්ණ වනතෙක් සැකසීම සඳහා කථනය Google වෙත යවනු ඇත.</translation> <translation id="4864369630010738180">පුරමින්...</translation> +<translation id="4864648187878336334">15 වෙනි මේසය</translation> <translation id="4868492592575313542">ක්රියාත්මක කළා</translation> <translation id="4872237917498892622">Alt+Search හෝ Shift</translation> <translation id="4881695831933465202">විවෘත කරන්න</translation> @@ -715,6 +718,7 @@ <ph name="NOTIFICATION_1" />, <ph name="NOTIFICATION_2" />, <ph name="NUM_OTHER_NOTIFICATION" /></translation> +<translation id="4987738733603015246">16 වෙනි මේසය</translation> <translation id="5003993274120026347">ඊළඟ වාක්යය</translation> <translation id="5016558321564993266">ලකුණුකරය ටොගල කරන්න. <ph name="STATE_TEXT" /></translation> <translation id="5030687792513154421">වේලාව අවසන්</translation> @@ -730,6 +734,7 @@ <translation id="5098537242461068432">මේසය සහ කවුළු නැවත විවෘත කරන ලදි</translation> <translation id="5104236669533825617">තිරසටහන තැනීමට නොහැක</translation> <translation id="5107522548814527560">වෙබය</translation> +<translation id="5111318697104479778"><ph name="DESC" />, <ph name="STRENGTH" /></translation> <translation id="5117590920725113268">ඊළඟ මාසය පෙන්වන්න</translation> <translation id="5136175204352732067">වෙනස් යතුරු පුවරුවක් සම්බන්ධ කර ඇත</translation> <translation id="5147567197700016471">අගුලු හැර ඇත</translation> @@ -817,6 +822,7 @@ <translation id="5625955975703555628">LTE+</translation> <translation id="5648021990716966815">මයික් ජැක්කුව</translation> <translation id="5652575806481723716"><ph name="FOCUSED_APP_NAME" /> ඔබගේ අවධානය ඉල්ලයි.</translation> +<translation id="5662075790140998213">10 වෙනි මේසය</translation> <translation id="5662709761327382534">පටිගත කිරීම් මයික්රෆෝනය <ph name="CURRENT_STATE" />, මයික්රෆෝන පටිගත කිරීම ක්රියාත්මක කිරීමට <ph name="NEW_STATE" /> Enter ඔබන්න</translation> <translation id="5669267381087807207">සක්රීය වෙමින්...</translation> <translation id="5673434351075758678">ඔබේ සැකසීම් සමමුහුර්ත කිරීමෙන් පසු "<ph name="FROM_LOCALE" />" සිට "<ph name="TO_LOCALE" />" දක්වා.</translation> @@ -1016,6 +1022,8 @@ <translation id="6753390234084146956">ටැබ</translation> <translation id="6757237461819837179">මාධ්ය වාදනය නොවේ</translation> <translation id="6777216307882431711">සම්බන්ධිත USB-C උපාංග බල ගැන්වේ</translation> +<translation id="6781002679438061620">9 වෙනි මේසය</translation> +<translation id="6782182743534150858">13 වෙනි මේසය</translation> <translation id="6786750046913594791">ෆෝල්ඩරය වසන්න</translation> <translation id="6787595647772650851">පසුගිය සැසිය ප්රතිසාධනය කරන්න</translation> <translation id="6790428901817661496">වාදනය කරන්න</translation> @@ -1077,6 +1085,7 @@ <translation id="7098053464892629930">සියලු ලබා ගත හැකි විශේෂාංග බැලීමට Google Play හි <ph name="NAME" /> සඳහා යෙදුම බාගන්න</translation> <translation id="7098389117866926363">USB-C උපාංගය (පිටුපස වම් තොට)</translation> <translation id="7106330611027933926">ඩෙස්ක් තීරුව පෙන්වන්න</translation> +<translation id="7116969082764510092">11 වෙනි මේසය</translation> <translation id="7118268675952955085">තිර රුව</translation> <translation id="7126996685418858413">පසුගිය සතියේ විවෘත කරන ලදි</translation> <translation id="7130207228079676353">වැඩියෙන්ම ඉඩ ඇති</translation> @@ -1174,6 +1183,7 @@ <translation id="7662283695561029522">වින්යාස කිරීමට තට්ටු කරන්න</translation> <translation id="7670953955701272011">Google දින දර්ශනය තුළ මෙම දිනය විවෘත කරන්න</translation> <translation id="7671610481353807627">වර්ණය අනුව යෙදුම් අනුපිළිවෙළට සකසා ඇත</translation> +<translation id="7672095158465655885"><ph name="NAME" /> වෙත සම්බන්ධිතයි, <ph name="SUBTEXT" /></translation> <translation id="7684531502177797067">කැමරා ආදානය <ph name="CAMERA_NAME" />ට සකසා ඇත.</translation> <translation id="7705524343798198388">VPN</translation> <translation id="7714767791242455379">නව සෙලියුලර් ජාලයක් එක් කරන්න</translation> @@ -1455,5 +1465,6 @@ <translation id="974545358917229949"><ph name="QUERY" /> සඳහා ප්රතිඵල <ph name="RESULT_COUNT" />ක් දක්වමින්</translation> <translation id="98515147261107953">තිරස්</translation> <translation id="990277280839877440"><ph name="WINDOW_TITILE" /> කවුළුව වසා ඇත.</translation> +<translation id="994354411665877646"><ph name="NETWORK_NAME" />, <ph name="SUBTEXT" /></translation> <translation id="996204416024568215">නවතම විශේෂාංග සහ ආරක්ෂක වැඩි දියුණු කිරීම් ලබා ගන්න. යාවත්කාලීන කිරීම් පසුබිමේ සිදු වේ.</translation> </translationbundle> \ No newline at end of file
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index e3c6314..04400fc 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -346,7 +346,7 @@ <translation id="2942516765047364088">Položaj police</translation> <translation id="2946119680249604491">Dodaj vezu</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">Nešto nije u redu. Probajte ponovo za par sekundi.</translation> +<translation id="2961963223658824723">Došlo je do greške. Probajte ponovo za par sekundi.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="296762781903199866">Preuzimanje fajlova sa govorom na jeziku <ph name="LANGUAGE" /> nije uspelo</translation> <translation id="2970920913501714344">Instalirajte aplikacije, dodatke i teme</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index a059594..fb4af2f 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -346,7 +346,7 @@ <translation id="2942516765047364088">Положај полице</translation> <translation id="2946119680249604491">Додај везу</translation> <translation id="2960314608273155470">Режим снимања, подразумевана вредност је <ph name="SOURCE" /> <ph name="TYPE" />. Притисните Tab за кретање помоћу тастатуре.</translation> -<translation id="2961963223658824723">Нешто није у реду. Пробајте поново за пар секунди.</translation> +<translation id="2961963223658824723">Дошло је до грешке. Пробајте поново за пар секунди.</translation> <translation id="2963773877003373896">mod3</translation> <translation id="296762781903199866">Преузимање фајлова са говором на језику <ph name="LANGUAGE" /> није успело</translation> <translation id="2970920913501714344">Инсталирајте апликације, додатке и теме</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb index ebc2ddb..fa5da6f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ar.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ar"> +<translation id="1076394037877376434">حذف الصفحة <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">وضع الكاميرا</translation> <translation id="1153190633558910465">إيقاف الشبكة</translation> <translation id="1175958423215084756">تم رصد رابط. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">تم حذف الصفحة <ph name="PAGE_NUMBER" />.</translation> <translation id="1258009455399840361">تدوير بمقدار 90 درجة في اتجاه عقارب الساعة</translation> <translation id="1276998909102132017">صور المعرض</translation> <translation id="1300209025925956156">مسح المستند ضوئيًا</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb index f4cd061..788f29c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bn.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="bn"> +<translation id="1076394037877376434"><ph name="PAGE_NUMBER" />টি পৃষ্ঠা মুছুন</translation> <translation id="1113173431709655881">ক্যামেরা মোড</translation> <translation id="1153190633558910465">গ্রিড বন্ধ আছে</translation> <translation id="1175958423215084756">লিঙ্ক শনাক্ত হয়েছে। <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" />টি পৃষ্ঠা মুছে ফেলা হয়েছে</translation> <translation id="1258009455399840361">ঘড়ির কাঁটার দিকে ৯০ ডিগ্রি ঘোরান</translation> <translation id="1276998909102132017">গ্যালারির ছবি</translation> <translation id="1300209025925956156">আপনার ডকুমেন্ট স্ক্যান করুন</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb index 7fffabc..75998e1c6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ca.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ca"> +<translation id="1057925581724305206">Full HD (1080p)</translation> <translation id="1076394037877376434">Suprimeix la pàgina <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Mode de càmera</translation> <translation id="1153190633558910465">Quadrícula desactivada</translation> @@ -21,6 +22,7 @@ <translation id="1588438908519853928">Normal</translation> <translation id="1620510694547887537">Càmera</translation> <translation id="1627744224761163218">4 x 4</translation> +<translation id="1644345013557678440">HD (720p)</translation> <translation id="1664224225747386870">No s'ha gravat res</translation> <translation id="1838104802459806957">Inclina cap amunt</translation> <translation id="1843105061469674856">Escaneja una pàgina més</translation> @@ -95,6 +97,7 @@ <translation id="4705093842003735294">Resolució completa</translation> <translation id="4890010094662541459">3 x 3</translation> <translation id="491895758387112773">Grava vídeos de diversos canals</translation> +<translation id="4984613436295737187">HD quàdruple (1440p)</translation> <translation id="5034763830503483128">Relació d'aspecte de la foto</translation> <translation id="5057360777601936059">La càmera no està disponible en aquest moment. Comprova que estigui ben connectada.</translation> @@ -103,6 +106,7 @@ <translation id="5266635337630551423">Extrem superior esquerre del document</translation> <translation id="5317780077021120954">Desa</translation> <translation id="5320594929574852403">S'està movent cap a l'esquerra</translation> +<translation id="5374917190292010970">4K (2160p)</translation> <translation id="5444515100983837161">Col·loca totes les vores del document dins del marc. L'escaneig funciona millor si el document i el fons tenen colors diferents.</translation> <translation id="5662366948659129155">S'està escanejant la pàgina <ph name="COUNT" /></translation> <translation id="5671277269877808209">Quadrat</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb index 9524be5..88679cb 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cs.xtb
@@ -1,9 +1,12 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="cs"> +<translation id="1057925581724305206">Full HD (1080p)</translation> +<translation id="1076394037877376434">Smazat stránku <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Režim fotoaparátu</translation> <translation id="1153190633558910465">Mřížka vypnuta</translation> <translation id="1175958423215084756">Byl zjištěn odkaz. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">Stránka <ph name="PAGE_NUMBER" /> byla smazána</translation> <translation id="1258009455399840361">Otočit o 90 stupňů ve směru hodinových ručiček</translation> <translation id="1276998909102132017">Obrázky v galerii</translation> <translation id="1300209025925956156">Naskenujte dokument</translation> @@ -19,6 +22,7 @@ <translation id="1588438908519853928">Normální</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4 × 4</translation> +<translation id="1644345013557678440">HD (720p)</translation> <translation id="1664224225747386870">Nic nebylo zaznamenáno</translation> <translation id="1838104802459806957">Naklonit nahoru</translation> <translation id="1843105061469674856">Naskenovat další stránku</translation> @@ -93,6 +97,7 @@ <translation id="4705093842003735294">Plné rozlišení</translation> <translation id="4890010094662541459">3 × 3</translation> <translation id="491895758387112773">Nahrávání videa z více streamů</translation> +<translation id="4984613436295737187">Quad HD (1440p)</translation> <translation id="5034763830503483128">Poměr stran fotografie</translation> <translation id="5057360777601936059">Fotoaparát momentálně není dostupný. Zkontrolujte, zda je fotoaparát správně připojen.</translation> @@ -101,6 +106,7 @@ <translation id="5266635337630551423">Levý horní roh dokumentu</translation> <translation id="5317780077021120954">Uložit</translation> <translation id="5320594929574852403">Pohyb doleva</translation> +<translation id="5374917190292010970">4K (2160p)</translation> <translation id="5444515100983837161">Umístěte všechny okraje dokumentu do rámečku. Skenování funguje nejlépe, když se barva dokumentu liší od barvy pozadí.</translation> <translation id="5662366948659129155">Skenování stránky <ph name="COUNT" /></translation> <translation id="5671277269877808209">Čtverec</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb index a514638..1627343 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_cy.xtb
@@ -1,9 +1,12 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="cy"> +<translation id="1057925581724305206">HD Llawn (1080p)</translation> +<translation id="1076394037877376434">Dileu tudalen <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Modd camera</translation> <translation id="1153190633558910465">Grid wedi'i ddiffodd</translation> <translation id="1175958423215084756">Mae dolen wedi'i chanfod. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">Tudalen <ph name="PAGE_NUMBER" /> wedi'i dileu</translation> <translation id="1258009455399840361">Cylchdroi 90 gradd yn glocwedd</translation> <translation id="1276998909102132017">Lluniau'r oriel</translation> <translation id="1300209025925956156">Sganio eich dogfen</translation> @@ -19,6 +22,7 @@ <translation id="1588438908519853928">Normal</translation> <translation id="1620510694547887537">Camera</translation> <translation id="1627744224761163218">4 x 4</translation> +<translation id="1644345013557678440">HD (720p)</translation> <translation id="1664224225747386870">Dim byd wedi'i recordio</translation> <translation id="1838104802459806957">Gogwyddo i fyny</translation> <translation id="1843105061469674856">Sganio tudalen ychwanegol</translation> @@ -93,6 +97,7 @@ <translation id="4705093842003735294">Cydraniad llawn</translation> <translation id="4890010094662541459">3 x 3</translation> <translation id="491895758387112773">Recordiad fideo aml-ffrwd</translation> +<translation id="4984613436295737187">Quad HD (1440p)</translation> <translation id="5034763830503483128">Cymhareb agwedd llun</translation> <translation id="5057360777601936059">Nid yw'ch camera ar gael ar hyn o bryd. Gwiriwch a yw'r camera wedi'i gysylltu'n iawn.</translation> @@ -101,6 +106,7 @@ <translation id="5266635337630551423">Cornel chwith uchaf y ddogfen</translation> <translation id="5317780077021120954">Cadw</translation> <translation id="5320594929574852403">Yn symud i'r cyfeiriad chwith</translation> +<translation id="5374917190292010970">4K (2160p)</translation> <translation id="5444515100983837161">Rhowch yr holl ymylon o'r ddogfen o fewn y ffrâm. Mae sganio'n gweithio orau os oes gan y ddogfen a'r cefndir liwiau gwahanol.</translation> <translation id="5662366948659129155">Wrthi'n sganio tudalen <ph name="COUNT" /></translation> <translation id="5671277269877808209">Sgwâr</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb index 4d204946..c0f3a842 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_da.xtb
@@ -2,9 +2,11 @@ <!DOCTYPE translationbundle> <translationbundle lang="da"> <translation id="1057925581724305206">Fuld HD (1080p)</translation> +<translation id="1076394037877376434">Slet side <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Kameratilstand</translation> <translation id="1153190633558910465">Ingen gitterlinjer</translation> <translation id="1175958423215084756">Link registreret. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">Side <ph name="PAGE_NUMBER" /> blev slettet</translation> <translation id="1258009455399840361">Roter 90 grader med uret</translation> <translation id="1276998909102132017">Galleribilleder</translation> <translation id="1300209025925956156">Scan dit dokument</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb index 766b94f..8796558 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="de"> +<translation id="1076394037877376434">Seite <ph name="PAGE_NUMBER" /> löschen</translation> <translation id="1113173431709655881">Kameramodus</translation> <translation id="1153190633558910465">Raster deaktivieren</translation> <translation id="1175958423215084756">Link erkannt. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">Seite <ph name="PAGE_NUMBER" /> gelöscht</translation> <translation id="1258009455399840361">Um 90 Grad im Uhrzeigersinn drehen</translation> <translation id="1276998909102132017">Galeriebilder</translation> <translation id="1300209025925956156">Dokument scannen</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb index 487436c..570f9a8 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_et.xtb
@@ -2,9 +2,11 @@ <!DOCTYPE translationbundle> <translationbundle lang="et"> <translation id="1057925581724305206">Full HD (1080p)</translation> +<translation id="1076394037877376434">Kustuta <ph name="PAGE_NUMBER" />. leht</translation> <translation id="1113173431709655881">Kaamerarežiim</translation> <translation id="1153190633558910465">Ruudustik on välja lülitatud</translation> <translation id="1175958423215084756">Tuvastati link. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" />. leht on kustutatud</translation> <translation id="1258009455399840361">Pööra 90 kraadi päripäeva</translation> <translation id="1276998909102132017">Galerii pildid</translation> <translation id="1300209025925956156">Dokumendi skannimine</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb index ebe9a02d..039e352 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_fi.xtb
@@ -2,9 +2,11 @@ <!DOCTYPE translationbundle> <translationbundle lang="fi"> <translation id="1057925581724305206">Full HD (1080p)</translation> +<translation id="1076394037877376434">Poista sivu <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Kameratila</translation> <translation id="1153190633558910465">Ruudukko pois</translation> <translation id="1175958423215084756">Linkki havaittu. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">Sivu <ph name="PAGE_NUMBER" /> poistettu</translation> <translation id="1258009455399840361">Kierrä 90 astetta myötäpäivään</translation> <translation id="1276998909102132017">Gallerian kuvat</translation> <translation id="1300209025925956156">Skannaa dokumenttisi</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb index d2b301e..dcfec0c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_id.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="id"> +<translation id="1076394037877376434">Hapus halaman <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Mode kamera</translation> <translation id="1153190633558910465">Petak nonaktif</translation> <translation id="1175958423215084756">Link terdeteksi. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">Halaman <ph name="PAGE_NUMBER" /> dihapus</translation> <translation id="1258009455399840361">Putar 90 derajat searah jarum jam</translation> <translation id="1276998909102132017">Foto galeri</translation> <translation id="1300209025925956156">Pindai dokumen Anda</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb index a4d3c583..f8c95fc0 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_is.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="is"> +<translation id="1057925581724305206">Full háskerpa (1080p)</translation> <translation id="1113173431709655881">Myndavélarstilling</translation> <translation id="1153190633558910465">Slökkt á línum</translation> <translation id="1175958423215084756">Tengill greindist. <ph name="HOSTNAME" /></translation> @@ -19,6 +20,7 @@ <translation id="1588438908519853928">Venjuleg</translation> <translation id="1620510694547887537">Myndavél</translation> <translation id="1627744224761163218">4 x 4</translation> +<translation id="1644345013557678440">HD (720p)</translation> <translation id="1664224225747386870">Ekkert var tekið upp</translation> <translation id="1838104802459806957">Halla upp</translation> <translation id="1843105061469674856">Skanna viðbótarsíðu</translation> @@ -93,6 +95,7 @@ <translation id="4705093842003735294">Full upplausn</translation> <translation id="4890010094662541459">3 x 3</translation> <translation id="491895758387112773">Myndupptaka af mörgum straumum í einu</translation> +<translation id="4984613436295737187">Quad HD (1440p)</translation> <translation id="5034763830503483128">Myndhlutfall myndar</translation> <translation id="5057360777601936059">Ekki er hægt að nota myndavélina eins og er. Athugaðu hvort myndavélin er rétt tengd.</translation> @@ -101,6 +104,7 @@ <translation id="5266635337630551423">Efra, vinstra horn skjals</translation> <translation id="5317780077021120954">Vista</translation> <translation id="5320594929574852403">Færist til vinstri</translation> +<translation id="5374917190292010970">4K (2160p)</translation> <translation id="5444515100983837161">Settu öll horn skjalsins í rammann. Skönnun virkar betur ef skjalið og bakgrunnurinn eru í mismunandi litum.</translation> <translation id="5662366948659129155">Skannar síðu <ph name="COUNT" /></translation> <translation id="5671277269877808209">Ferningur</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb index 67a82ba..7c6fbe45f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ja.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ja"> +<translation id="1076394037877376434"><ph name="PAGE_NUMBER" /> ページを削除</translation> <translation id="1113173431709655881">カメラモード</translation> <translation id="1153190633558910465">グリッド線をオフにする</translation> <translation id="1175958423215084756">リンクが検出されました。<ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" /> ページを削除しました</translation> <translation id="1258009455399840361">時計回りに 90 度回転</translation> <translation id="1276998909102132017">ギャラリー画像</translation> <translation id="1300209025925956156">ドキュメントをスキャンします</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb index b659f20e..9bccde2d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ko.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ko"> +<translation id="1076394037877376434"><ph name="PAGE_NUMBER" />페이지 삭제</translation> <translation id="1113173431709655881">카메라 모드</translation> <translation id="1153190633558910465">그리드 사용 안함</translation> <translation id="1175958423215084756">링크가 감지되었습니다. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" />페이지 삭제됨</translation> <translation id="1258009455399840361">시계 방향으로 90도 회전</translation> <translation id="1276998909102132017">갤러리 이미지</translation> <translation id="1300209025925956156">문서 스캔</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb index 448f0ed7b..a264670 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ky.xtb
@@ -2,9 +2,11 @@ <!DOCTYPE translationbundle> <translationbundle lang="ky"> <translation id="1057925581724305206">Full HD (1080p)</translation> +<translation id="1076394037877376434"><ph name="PAGE_NUMBER" /> баракты өчүрүү</translation> <translation id="1113173431709655881">Камера режими</translation> <translation id="1153190633558910465">Торчо өчүк</translation> <translation id="1175958423215084756">Шилтеме аныкталды. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" /> барак жок кылынды</translation> <translation id="1258009455399840361">Сааттын жебеси боюнча 90 градуска буруу</translation> <translation id="1276998909102132017">Галерея сүрөттөрү</translation> <translation id="1300209025925956156">Документиңизди скандоо</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb index cc906eb..7d19ce94 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lo.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lo"> +<translation id="1057925581724305206">Full HD (1080p)</translation> <translation id="1113173431709655881">ໂໝດກ້ອງຖ່າຍຮູບ</translation> <translation id="1153190633558910465">ປິດເສັ້ນຕາຕະລາງແລ້ວ</translation> <translation id="1175958423215084756">ກວດພົບລິ້ງ. <ph name="HOSTNAME" /></translation> @@ -19,6 +20,7 @@ <translation id="1588438908519853928">ປົກກະຕິ</translation> <translation id="1620510694547887537">ກ້ອງຖ່າຍຮູບ</translation> <translation id="1627744224761163218">4 x 4</translation> +<translation id="1644345013557678440">HD (720p)</translation> <translation id="1664224225747386870">ບໍ່ໄດ້ບັນທຶກຫຍັງໄວ້</translation> <translation id="1838104802459806957">ອຽງຂຶ້ນ</translation> <translation id="1843105061469674856">ສະແກນໜ້າເພີ່ມເຕີມ</translation> @@ -93,6 +95,7 @@ <translation id="4705093842003735294">ຄວາມລະອຽດເຕັມ</translation> <translation id="4890010094662541459">3 x 3</translation> <translation id="491895758387112773">ການບັນທຶກວິດີໂອແບບຫຼາຍສະຕຣີມ</translation> +<translation id="4984613436295737187">Quad HD (1440p)</translation> <translation id="5034763830503483128">ອັດຕາສ່ວນຮູບພາບ</translation> <translation id="5057360777601936059">ກ້ອງຖ່າຍຮູບຂອງທ່ານບໍ່ສາມາດໃຊ້ໄດ້ໃນຂະນະນີ້. ກະລຸນາກວດເບິ່ງວ່າໄດ້ເຊື່ອມຕໍ່ກ້ອງຖ່າຍຮູບຢ່າງຖືກຕ້ອງຫຼືບໍ່.</translation> @@ -101,6 +104,7 @@ <translation id="5266635337630551423">ມຸມຊ້າຍເທິງຂອງເອກະສານ</translation> <translation id="5317780077021120954">ບັນທຶກ</translation> <translation id="5320594929574852403">ກຳລັງຍ້າຍໄປທາງຊ້າຍ</translation> +<translation id="5374917190292010970">4K (2160p)</translation> <translation id="5444515100983837161">ວາງຂອບທັງໝົດຂອງເອກະສານໄວ້ພາຍໃນເຟຣມ. ການສະແກນເຮັດວຽກໄດ້ດີທີ່ສຸດຫາກເອກະສານ ແລະ ພື້ນຫຼັງເປັນຄົນລະສີກັນ.</translation> <translation id="5662366948659129155">ກຳລັງສະແກນໜ້າ <ph name="COUNT" /></translation> <translation id="5671277269877808209">ສີ່ຫຼ່ຽມ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb index fe46074..f691db8c 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_lt.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="lt"> +<translation id="1076394037877376434">Ištrinti <ph name="PAGE_NUMBER" /> puslapį</translation> <translation id="1113173431709655881">Kameros režimas</translation> <translation id="1153190633558910465">Tinklelis išjungtas</translation> <translation id="1175958423215084756">Aptikta nuoroda. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" /> puslapis ištrintas</translation> <translation id="1258009455399840361">Pasukti 90 laipsnių pagal laikrodžio rodyklę</translation> <translation id="1276998909102132017">Galerijos vaizdai</translation> <translation id="1300209025925956156">Nuskaitykite dokumentą</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb index 10fcaab..9a561b9 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="my"> +<translation id="1057925581724305206">HD အပြည့် (1080p)</translation> <translation id="1076394037877376434">စာမျက်နှာ <ph name="PAGE_NUMBER" /> ကို ဖျက်ရန်</translation> <translation id="1113173431709655881">ကင်မရာမုဒ်</translation> <translation id="1153190633558910465">အကွက်ပိတ်ရန်</translation> @@ -21,6 +22,7 @@ <translation id="1588438908519853928">ပုံမှန်</translation> <translation id="1620510694547887537">ကင်မရာ</translation> <translation id="1627744224761163218">၄ x ၄</translation> +<translation id="1644345013557678440">HD (720p)</translation> <translation id="1664224225747386870">မည်သည့်အရာမျှ ရိုက်ကူးမထားပါ</translation> <translation id="1838104802459806957">အပေါ်သို့ စောင်းရန်</translation> <translation id="1843105061469674856">နောက်ထပ်စာမျက်နှာ စကင်ဖတ်ရန်</translation> @@ -95,6 +97,7 @@ <translation id="4705093842003735294">ပုံရိပ်ပြတ်သားကိန်း အပြည့်</translation> <translation id="4890010094662541459">၃ x ၃</translation> <translation id="491895758387112773">ဗီဒီယိုရိုက်ကူးမှုကို စနစ်အမျိုးမျိုးတွင် ထုတ်လွှင့်ခြင်း</translation> +<translation id="4984613436295737187">Quad HD (1440p)</translation> <translation id="5034763830503483128">ဓာတ်ပုံ အချိုးအစား</translation> <translation id="5057360777601936059">သင့်ကင်မရာကို လောလောဆယ်မရနိုင်ပါ။ ကင်မရာကို စနစ်တကျ ချိတ်ဆက်ထားခြင်းရှိမရှိ စစ်ပါ။</translation> @@ -103,6 +106,7 @@ <translation id="5266635337630551423">မှတ်တမ်း၏ ဘယ်ဘက်ထောင့်ထိပ်</translation> <translation id="5317780077021120954">သိမ်းရန်</translation> <translation id="5320594929574852403">ဘယ်ဘက် ဦးတည်ချက်အတိုင်း ရွေ့နေသည်</translation> +<translation id="5374917190292010970">4K (2160p)</translation> <translation id="5444515100983837161">မှတ်တမ်းဖိုင်၏ အစွန်းအားလုံးကို ဘောင်အတွင်းထားပါ။ မှတ်တမ်းဖိုင်နှင့် နောက်ခံတို့သည် အရောင်မတူလျှင် စကင် အကောင်းဆုံး ဖတ်နိုင်သည်။</translation> <translation id="5662366948659129155">စာမျက်နှာ <ph name="COUNT" /> ကို စကင်ဖတ်နေသည်</translation> <translation id="5671277269877808209">စတုရန်း</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb index 8d9ac64..40b3c02 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pa.xtb
@@ -2,9 +2,11 @@ <!DOCTYPE translationbundle> <translationbundle lang="pa"> <translation id="1057925581724305206">ਪੂਰਾ HD (1080p)</translation> +<translation id="1076394037877376434"><ph name="PAGE_NUMBER" /> ਪੰਨਾ ਮਿਟਾਓ</translation> <translation id="1113173431709655881">ਕੈਮਰਾ ਮੋਡ</translation> <translation id="1153190633558910465">ਗਰਿੱਡ ਬੰਦ ਹੈ</translation> <translation id="1175958423215084756">ਲਿੰਕ ਦਾ ਪਤਾ ਲੱਗਾ। <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" /> ਪੰਨਾ ਮਿਟਾਇਆ ਗਿਆ</translation> <translation id="1258009455399840361">ਘੜੀ ਦੀ ਦਿਸ਼ਾ ਵਿੱਚ 90 ਡਿਗਰੀ ਘੁਮਾਓ</translation> <translation id="1276998909102132017">ਗੈਲਰੀ ਚਿੱਤਰ</translation> <translation id="1300209025925956156">ਆਪਣਾ ਦਸਤਾਵੇਜ਼ ਸਕੈਨ ਕਰੋ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb index 1cfaea2..d16ad03 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -2,9 +2,11 @@ <!DOCTYPE translationbundle> <translationbundle lang="pl"> <translation id="1057925581724305206">Full HD (1080p)</translation> +<translation id="1076394037877376434">Usuń stronę <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Tryb kamery</translation> <translation id="1153190633558910465">Siatka wyłączona</translation> <translation id="1175958423215084756">Wykryto link. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">Usunięto stronę <ph name="PAGE_NUMBER" /></translation> <translation id="1258009455399840361">Obróć o 90 stopni w prawo</translation> <translation id="1276998909102132017">Zdjęcia z galerii</translation> <translation id="1300209025925956156">Skanowanie dokumentu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb index ed42a93..0b5b957f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="ru"> +<translation id="1076394037877376434">Удалить страницу <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Режим камеры</translation> <translation id="1153190633558910465">Без сетки</translation> <translation id="1175958423215084756">Обнаружена ссылка <ph name="HOSTNAME" />.</translation> +<translation id="1197694886744716213">Страница <ph name="PAGE_NUMBER" /> удалена</translation> <translation id="1258009455399840361">Повернуть на 90 градусов по часовой стрелке</translation> <translation id="1276998909102132017">Изображения в галерее</translation> <translation id="1300209025925956156">Сканирование документа</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb index e93eff2..8fe2f1b 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -1,6 +1,7 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sk"> +<translation id="1057925581724305206">Full HD (1080p)</translation> <translation id="1076394037877376434">Odstrániť <ph name="PAGE_NUMBER" />. stranu</translation> <translation id="1113173431709655881">Režim kamery</translation> <translation id="1153190633558910465">Vypnúť mriežku</translation> @@ -21,6 +22,7 @@ <translation id="1588438908519853928">Normálny</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4 × 4</translation> +<translation id="1644345013557678440">HD (720p)</translation> <translation id="1664224225747386870">Nič sa nezaznamenalo</translation> <translation id="1838104802459806957">Naklonenie nahor</translation> <translation id="1843105061469674856">Skenovať ďalšiu stránku</translation> @@ -95,6 +97,7 @@ <translation id="4705093842003735294">Plné rozlíšenie</translation> <translation id="4890010094662541459">3 × 3</translation> <translation id="491895758387112773">Streamovať záznam videa vo viacerých platformách</translation> +<translation id="4984613436295737187">Quad HD (1440p)</translation> <translation id="5034763830503483128">Pomer strán fotky</translation> <translation id="5057360777601936059">Fotoaparát je momentálne nedostupný. Skontrolujte, či je správne pripojený.</translation> @@ -103,6 +106,7 @@ <translation id="5266635337630551423">Ľavý horný roh dokumentu</translation> <translation id="5317780077021120954">Uložiť</translation> <translation id="5320594929574852403">Presúvate doľava</translation> +<translation id="5374917190292010970">4K (2160p)</translation> <translation id="5444515100983837161">Umiestnite všetky rohy dokumentu do rámu. Skenovanie funguje najlepšie vtedy, keď má dokument inú farbu ako pozadie.</translation> <translation id="5662366948659129155">Skenuje sa <ph name="COUNT" />. strana</translation> <translation id="5671277269877808209">Štvorec</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb index f43a8802..c8744579 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -1,9 +1,12 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sr-Latn"> +<translation id="1057925581724305206">Full HD (1080 piksela)</translation> +<translation id="1076394037877376434">Izbriši <ph name="PAGE_NUMBER" />. stranicu</translation> <translation id="1113173431709655881">Režim kamere</translation> <translation id="1153190633558910465">Koordinatna mreža je isključena</translation> <translation id="1175958423215084756">Link je otkriven. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" />. stranica je izbrisana</translation> <translation id="1258009455399840361">Rotiraj za 90 stepeni udesno</translation> <translation id="1276998909102132017">Slike u galeriji</translation> <translation id="1300209025925956156">Skenirajte dokument</translation> @@ -19,6 +22,7 @@ <translation id="1588438908519853928">Normalan</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="1627744224761163218">4×4</translation> +<translation id="1644345013557678440">HD (720 piksela)</translation> <translation id="1664224225747386870">Ništa nije snimljeno</translation> <translation id="1838104802459806957">Naginjanje nagore</translation> <translation id="1843105061469674856">Skeniraj dodatnu stranicu</translation> @@ -93,6 +97,7 @@ <translation id="4705093842003735294">Puna rezolucija</translation> <translation id="4890010094662541459">3×3</translation> <translation id="491895758387112773">Snimanje videa sa više strimova</translation> +<translation id="4984613436295737187">Quad HD (1440 piksela)</translation> <translation id="5034763830503483128">Razmera slika</translation> <translation id="5057360777601936059">Kamera trenutno nije dostupna. Proverite da li je kamera ispravno povezana.</translation> @@ -101,6 +106,7 @@ <translation id="5266635337630551423">Gornji levi ugao dokumenta</translation> <translation id="5317780077021120954">Sačuvaj</translation> <translation id="5320594929574852403">Kreće se ulevo</translation> +<translation id="5374917190292010970">4K (2160 piksela)</translation> <translation id="5444515100983837161">Postavite sve ivice dokumenta u okvir. Skeniranje je najuspešnije ako su dokument i pozadina različite boje.</translation> <translation id="5662366948659129155">Skenira se <ph name="COUNT" />. stranica</translation> <translation id="5671277269877808209">Kvadrat</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb index 2adaae1..804998a 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -1,9 +1,12 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="sr"> +<translation id="1057925581724305206">Full HD (1080 пиксела)</translation> +<translation id="1076394037877376434">Избриши <ph name="PAGE_NUMBER" />. страницу</translation> <translation id="1113173431709655881">Режим камере</translation> <translation id="1153190633558910465">Координатна мрежа је искључена</translation> <translation id="1175958423215084756">Линк је откривен. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" />. страница је избрисана</translation> <translation id="1258009455399840361">Ротирај за 90 степени удесно</translation> <translation id="1276998909102132017">Слике у галерији</translation> <translation id="1300209025925956156">Скенирајте документ</translation> @@ -19,6 +22,7 @@ <translation id="1588438908519853928">Нормалан</translation> <translation id="1620510694547887537">Камера</translation> <translation id="1627744224761163218">4×4</translation> +<translation id="1644345013557678440">HD (720 пиксела)</translation> <translation id="1664224225747386870">Ништа није снимљено</translation> <translation id="1838104802459806957">Нагињање нагоре</translation> <translation id="1843105061469674856">Скенирај додатну страницу</translation> @@ -93,6 +97,7 @@ <translation id="4705093842003735294">Пуна резолуција</translation> <translation id="4890010094662541459">3×3</translation> <translation id="491895758387112773">Снимање видеа са више стримова</translation> +<translation id="4984613436295737187">Quad HD (1440 пиксела)</translation> <translation id="5034763830503483128">Размера слика</translation> <translation id="5057360777601936059">Камера тренутно није доступна. Проверите да ли је камера исправно повезана.</translation> @@ -101,6 +106,7 @@ <translation id="5266635337630551423">Горњи леви угао документа</translation> <translation id="5317780077021120954">Сачувај</translation> <translation id="5320594929574852403">Креће се улево</translation> +<translation id="5374917190292010970">4K (2160 пиксела)</translation> <translation id="5444515100983837161">Поставите све ивице документа у оквир. Скенирање је најуспешније ако су документ и позадина различите боје.</translation> <translation id="5662366948659129155">Скенира се <ph name="COUNT" />. страница</translation> <translation id="5671277269877808209">Квадрат</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb index 7d93f54..28a9e0d3 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sw.xtb
@@ -2,9 +2,11 @@ <!DOCTYPE translationbundle> <translationbundle lang="sw"> <translation id="1057925581724305206">HD Kamili (1080p)</translation> +<translation id="1076394037877376434">Futa ukurasa wa <ph name="PAGE_NUMBER" /></translation> <translation id="1113173431709655881">Hali ya kamera</translation> <translation id="1153190633558910465">Zima gridi</translation> <translation id="1175958423215084756">Kiungo kimetambuliwa. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">Ukurasa wa <ph name="PAGE_NUMBER" /> umefutwa</translation> <translation id="1258009455399840361">Zungusha kwa digrii 90 katika mzunguko wa saa</translation> <translation id="1276998909102132017">Picha za matunzio</translation> <translation id="1300209025925956156">Changanua hati yako</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb index bf55741..acfa5d2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_tr.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="tr"> +<translation id="1076394037877376434"><ph name="PAGE_NUMBER" />. sayfayı sil</translation> <translation id="1113173431709655881">Kamera modu</translation> <translation id="1153190633558910465">Izgara kapalı</translation> <translation id="1175958423215084756">Bağlantı algılandı. <ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213"><ph name="PAGE_NUMBER" />. sayfa silindi</translation> <translation id="1258009455399840361">Saat yönünde 90 derece döndür</translation> <translation id="1276998909102132017">Galeri resimleri</translation> <translation id="1300209025925956156">Dokümanınızı tarayın</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb index faacd75..9460885 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-CN.xtb
@@ -1,9 +1,11 @@ <?xml version="1.0" ?> <!DOCTYPE translationbundle> <translationbundle lang="zh-CN"> +<translation id="1076394037877376434">删除第 <ph name="PAGE_NUMBER" /> 页</translation> <translation id="1113173431709655881">相机模式</translation> <translation id="1153190633558910465">网格已关闭</translation> <translation id="1175958423215084756">检测到链接。<ph name="HOSTNAME" /></translation> +<translation id="1197694886744716213">已删除第 <ph name="PAGE_NUMBER" /> 页</translation> <translation id="1258009455399840361">顺时针旋转 90 度</translation> <translation id="1276998909102132017">图库图片</translation> <translation id="1300209025925956156">扫描您的文件</translation>
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h index e15f87a..58157e1 100644 --- a/base/threading/thread_restrictions.h +++ b/base/threading/thread_restrictions.h
@@ -124,7 +124,6 @@ } // namespace android_webview namespace ash { class MojoUtils; -class BrowserDataMigrator; bool CameraAppUIShouldEnableLocalOverride(const std::string&); } // namespace ash namespace audio { @@ -454,7 +453,6 @@ friend class ::StartupTabProviderImpl; friend class android_webview::ScopedAllowInitGLBindings; friend class ash::MojoUtils; // http://crbug.com/1055467 - friend class ash::BrowserDataMigrator; friend class base::AdjustOOMScoreHelper; friend class base::StackSamplingProfiler; friend class blink::DiskDataAllocator;
diff --git a/build/toolchain/ios/BUILD.gn b/build/toolchain/ios/BUILD.gn index b4dc051..cfcbdc66 100644 --- a/build/toolchain/ios/BUILD.gn +++ b/build/toolchain/ios/BUILD.gn
@@ -34,10 +34,10 @@ } } -ios_toolchain("ios_clang_arm64_13_0") { +ios_toolchain("ios_clang_arm64_13_4") { toolchain_args = { current_cpu = "arm64" - ios_deployment_target = "13.0" + ios_deployment_target = "13.4" } } @@ -69,19 +69,19 @@ } } -ios_toolchain("ios_clang_x64_13_0") { +ios_toolchain("ios_clang_x64_13_4") { toolchain_args = { current_cpu = "x64" - ios_deployment_target = "13.0" + ios_deployment_target = "13.4" } } -ios_toolchain("ios_clang_x64_13_0_fat_arm64") { +ios_toolchain("ios_clang_x64_13_4_fat_arm64") { toolchain_args = { current_cpu = "arm64" is_fat_secondary_toolchain = true - primary_fat_toolchain_name = "//build/toolchain/ios:ios_clang_x64_13_0" - ios_deployment_target = "13.0" + primary_fat_toolchain_name = "//build/toolchain/ios:ios_clang_x64_13_4" + ios_deployment_target = "13.4" } }
diff --git a/chrome/VERSION b/chrome/VERSION index 753fd82f..a3ed6ce 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=109 MINOR=0 -BUILD=5365 +BUILD=5366 PATCH=0
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni index 819b987..b62282b 100644 --- a/chrome/android/chrome_test_java_sources.gni +++ b/chrome/android/chrome_test_java_sources.gni
@@ -437,11 +437,11 @@ "javatests/src/org/chromium/chrome/browser/share/ShareUrlTest.java", "javatests/src/org/chromium/chrome/browser/share/crow/CrowButtonDelegateImplTest.java", "javatests/src/org/chromium/chrome/browser/signin/AccountsReloadingTest.java", - "javatests/src/org/chromium/chrome/browser/signin/IdentityManagerIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java", "javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentRenderTest.java", "javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentTest.java", "javatests/src/org/chromium/chrome/browser/signin/SigninHeaderTest.java", + "javatests/src/org/chromium/chrome/browser/signin/SigninManagerIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/signin/SigninSignoutIntegrationTest.java", "javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java", "javatests/src/org/chromium/chrome/browser/site_settings/ChromeSiteSettingsDelegateTest.java",
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 2d64104d..f0c83dd 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ትር}one{<ph name="TABS_COUNT_MANY" /> ትሮች}other{<ph name="TABS_COUNT_MANY" /> ትሮች}}</translation> <translation id="2118649612461486615">የመደብር መረጃ</translation> <translation id="2162620598375156287">አሁን <ph name="CURRENT_PRICE" /> <ph name="SOURCE_WEBSITE" /> ላይ</translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{ትርን ነጥል}one{ትርን ነጥል}other{ትሮችን ነጥል}}</translation> <translation id="2277224997687551299">የቡድን ስም ያርትዑ</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{ከቡድን <ph name="TABS_COUNT_ONE" /> የተመረጠ ትርን ያስወግዱ።}one{ከቡድን <ph name="TABS_COUNT_MANY" /> የተመረጡ ትሮችን ያስወግዱ።}other{ከቡድን <ph name="TABS_COUNT_MANY" /> የተመረጡ ትሮችን ያስወግዱ።}}</translation> <translation id="2479148705183875116">ወደ ቅንብሮች ሂድ</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ትርን ሰብስብ።}one{የ<ph name="TITLE_OF_GROUP" /> ትር ቡድንን ከ<ph name="TABS_COUNT_MANY" /> ትሮች ጋር ሰብስብ።}other{የ<ph name="TITLE_OF_GROUP" /> ትር ቡድንን ከ<ph name="TABS_COUNT_MANY" /> ትሮች ጋር ሰብስብ።}}</translation> <translation id="3882834874697329510">በክፍት ትር ውስጥ ዝቅተኛ ዋጋ ሲኖር ማንቂያ ለማግኘት በቅንብሮች ውስጥ ማሳወቂያዎችን ያብሩ።</translation> <translation id="3940195383040445971">በትሮች ላይ ዋጋዎችን ይከታተሉ</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{ትርን ቦድን}one{ትርን ቦድን}other{ትሮችን ቦድን}}</translation> <translation id="3996880007329611795">ማሳወቂያ ይድረሰዎት</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> ትሮች የሚዛመዱ ይመስላሉ ይቦደኑ?</translation> <translation id="4212246570487010370">ማሰሱን ይቀጥሉ</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> ግምገማ)}one{(<ph name="REVIEWS_COUNT_MANY" /> ግምገማዎች)}other{(<ph name="REVIEWS_COUNT_MANY" /> ግምገማዎች)}}</translation> <translation id="4850886885716139402">አሳይ</translation> <translation id="4870911314065352661">ሁሉም ትሮች ይዘጉ?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{ትርን ዝጋ}one{ትርን ዝጋ}other{ትሮችን ዝጋ}}</translation> <translation id="492284538114688557">የዋጋ ቅነሳ ታይቷል</translation> <translation id="5007392906805964215">ገምግም</translation> <translation id="5073204694187207510">የሙሉ ማያ ፍርግርግን ደብቅ</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">አሳየኝ</translation> <translation id="6840760312327750441">ትሮችን ለመቦደን፣ ትርን ነካ አድርገው ይያዙ። በመቀጠል፣ ወደ ሌላ ትር ይጎትቱት።</translation> <translation id="6856809498882026482">ባለብዙ ምርጫ ሁነታን ደብቅ</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{ትርን አጋራ}one{ትርን አጋራ}other{ትሮችን አጋራ}}</translation> <translation id="7129458170538955174">ስለዚህ መደብር መረጃ በግማሽ ቁመት ተከፍቷል</translation> <translation id="7151209024774799310">ትሮችን ከቡድን ያስወግዱ</translation> <translation id="7204204600596740190">ባለብዙ ምርጫ ሁነታ</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 216f6a4..8d48d611 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" />টা টেব}one{<ph name="TABS_COUNT_MANY" />টা টেব}other{<ph name="TABS_COUNT_MANY" />টা টেব}}</translation> <translation id="2118649612461486615">ষ্ট’ৰৰ তথ্য</translation> <translation id="2162620598375156287">এতিয়া <ph name="SOURCE_WEBSITE" />ত <ph name="CURRENT_PRICE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{টেবৰ গোট ভংগ কৰক}one{টেবৰ গোট ভংগ কৰক}other{টেবৰ গোট ভংগ কৰক}}</translation> <translation id="2277224997687551299">গোটৰ নাম সম্পাদনা কৰক</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{গোটৰ পৰা <ph name="TABS_COUNT_ONE" /> টা বাছনি কৰা টেব আঁতৰাওক।}one{গোটৰ পৰা <ph name="TABS_COUNT_MANY" /> টা বাছনি কৰা টেব আঁতৰাওক।}other{গোটৰ পৰা <ph name="TABS_COUNT_MANY" /> টা বাছনি কৰা টেব আঁতৰাওক।}}</translation> <translation id="2479148705183875116">ছেটিংসমূহলৈ যাওক</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> টা টেব সংকোচন কৰক।}one{<ph name="TABS_COUNT_MANY" /> টা টেবযুক্ত <ph name="TITLE_OF_GROUP" /> টেবৰ গোটটো সংকোচন কৰক।}other{<ph name="TABS_COUNT_MANY" /> টা টেবযুক্ত <ph name="TITLE_OF_GROUP" /> টেবৰ গোটটো সংকোচন কৰক।}}</translation> <translation id="3882834874697329510">খোলা থকা কোনো টেবত কম মূল্যৰ তথ্য উপলব্ধ হ’লে সতৰ্কবাৰ্তা লাভ কৰিবলৈ ছেটিঙলৈ গৈ জাননী অন কৰক।</translation> <translation id="3940195383040445971">টেবত মূল্য ট্ৰেক কৰক</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{টেবৰ গোট বনাওক}one{টেবৰ গোট বনাওক}other{টেবৰ গোট বনাওক}}</translation> <translation id="3996880007329611795">জাননী পাওক</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> টা টেব জড়িত যেন লাগিছে। সেইকেইটা একগোট কৰিবনে?</translation> <translation id="4212246570487010370">ব্ৰাউজ কৰা অব্যাহত ৰাখক</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> টা পৰ্যালোচনা)}one{(<ph name="REVIEWS_COUNT_MANY" /> টা পৰ্যালোচনা)}other{(<ph name="REVIEWS_COUNT_MANY" /> টা পৰ্যালোচনা)}}</translation> <translation id="4850886885716139402">চাওক</translation> <translation id="4870911314065352661">আটাইবোৰ টেব বন্ধ কৰিবনে?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{টেব বন্ধ কৰক}one{টেব বন্ধ কৰক}other{টেব বন্ধ কৰক}}</translation> <translation id="492284538114688557">মূল্য কমা বুলি ধৰা পৰিছে</translation> <translation id="5007392906805964215">পৰ্যালোচনা কৰক</translation> <translation id="5073204694187207510">সম্পূৰ্ণ স্ক্রীণৰ গ্ৰিড লুকুৱাওক</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">মোক দেখুৱাওক</translation> <translation id="6840760312327750441">টেববোৰ একগোট কৰিবলৈ, এটা টেবত স্পৰ্শ কৰি ধৰি ৰাখক। তাৰপাছত, এইটো অন্য এটা টেবলৈ টানি আনি এৰক।</translation> <translation id="6856809498882026482">একাধিক বাছনি কৰিব পৰা ম’ডটো লুকুৱাওক</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{টেব শ্বেয়াৰ কৰক}one{টেব শ্বেয়াৰ কৰক}other{টেব শ্বেয়াৰ কৰক}}</translation> <translation id="7129458170538955174">এই দোকানৰ বিষয়ে তথ্য আধা স্ক্ৰীনত দেখুওৱা হৈছে</translation> <translation id="7151209024774799310">গোটটোৰ পৰা টেবসমূহ আঁতৰাওক</translation> <translation id="7204204600596740190">একাধিক বাছনি কৰা ম’ড</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 352a3f3..7f4a7b26 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tab}other{<ph name="TABS_COUNT_MANY" /> tab}}</translation> <translation id="2118649612461486615">Mağaza məlumatları</translation> <translation id="2162620598375156287">İndi <ph name="SOURCE_WEBSITE" /> saytında <ph name="CURRENT_PRICE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Tabı ayırın}other{Tabları ayırın}}</translation> <translation id="2277224997687551299">Qrup adına düzəliş edin</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> seçilmiş tabı qrupdan silin.}other{<ph name="TABS_COUNT_MANY" /> seçilmiş tabı qrupdan silin.}}</translation> <translation id="2479148705183875116">Ayarlara keçin</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tabını yığcamlaşdırın.}other{<ph name="TABS_COUNT_MANY" /> tab olan <ph name="TITLE_OF_GROUP" /> tab qrupunu yığcamlaşdırın.}}</translation> <translation id="3882834874697329510">Qiymət endirildikdə açıq tabda bildiriş almaq üçün Ayarlarda bildirişləri aktiv edin.</translation> <translation id="3940195383040445971">Tablarda qiymətləri izləyin</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Tabı qruplaşdırın}other{Tabları qruplaşdırın}}</translation> <translation id="3996880007329611795">Bildiriş alın</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> tab əlaqəli görünür. Onlar qruplaşdırılsın?</translation> <translation id="4212246570487010370">Axtarmağa davam edin</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> rəy)}other{(<ph name="REVIEWS_COUNT_MANY" /> rəy)}}</translation> <translation id="4850886885716139402">Görünüş</translation> <translation id="4870911314065352661">Bütün tablar bağlansın?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Tabı bağlayın}other{Tabları bağlayın}}</translation> <translation id="492284538114688557">Qiymət endirimi aşkarlandı</translation> <translation id="5007392906805964215">Nəzərdən keçirin</translation> <translation id="5073204694187207510">Tam ekran cədvəlini gizlədin</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Mənə göstərin</translation> <translation id="6840760312327750441">Panelləri qruplaşdırmaq üçün panelə toxunub saxlayın. Daha sonra digər panelin üzərinə çəkin.</translation> <translation id="6856809498882026482">Çoxsaylı seçim rejimini gizlədin</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Tabı paylaşın}other{Tabları paylaşın}}</translation> <translation id="7129458170538955174">Bu mağaza haqqında məlumatlar yarım hündürlükdə açılıb</translation> <translation id="7151209024774799310">Tabları qrupdan silin</translation> <translation id="7204204600596740190">Çoxsaylı seçim rejimi</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 8420b0e..09f5a8a 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
@@ -80,6 +80,7 @@ <translation id="753732157349120914">Selector de pestanyes</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{<ph name="REVIEWS_COUNT_ONE" /> ressenya de Google}other{<ph name="REVIEWS_COUNT_MANY" /> ressenyes de Google}}</translation> <translation id="7559245342362162951">Mostra les pestanyes del grup en una quadrícula en pantalla completa</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{Comparteix <ph name="TABS_COUNT_ONE" /> pestanya seleccionada}other{Comparteix <ph name="TABS_COUNT_MANY" /> pestanyes seleccionades}}</translation> <translation id="7792771145871471484">Revisa els suggeriments.</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{Agrupa <ph name="TABS_COUNT_ONE" /> pestanya seleccionada}other{Agrupa les <ph name="TABS_COUNT_MANY" /> pestanyes seleccionades}}</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>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb index 1a0dadf..ea5ab09 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb
@@ -84,6 +84,7 @@ <translation id="753732157349120914">Přepínač karet</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{<ph name="REVIEWS_COUNT_ONE" /> recenze od Googlu}few{<ph name="REVIEWS_COUNT_MANY" /> recenze od Googlu}many{<ph name="REVIEWS_COUNT_MANY" /> recenze od Googlu}other{<ph name="REVIEWS_COUNT_MANY" /> recenzí od Googlu}}</translation> <translation id="7559245342362162951">Zobrazit karty skupiny v mřížce na celou obrazovku</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{Sdílet <ph name="TABS_COUNT_ONE" /> vybranou kartu}few{Sdílet <ph name="TABS_COUNT_MANY" /> vybrané karty}many{Sdílet <ph name="TABS_COUNT_MANY" /> vybrané karty}other{Sdílet <ph name="TABS_COUNT_MANY" /> vybraných karet}}</translation> <translation id="7792771145871471484">Zkontrolovat návrhy.</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{Seskupit <ph name="TABS_COUNT_ONE" /> vybranou kartu}few{Seskupit <ph name="TABS_COUNT_MANY" /> vybrané karty}many{Seskupit <ph name="TABS_COUNT_MANY" /> vybrané karty}other{Seskupit <ph name="TABS_COUNT_MANY" /> vybraných karet}}</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Hodnocení <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> recenze}few{Hodnocení <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenze}many{Hodnocení <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenze}other{Hodnocení <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzí}}</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 46de6e0..a3d2580 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
@@ -84,6 +84,7 @@ <translation id="753732157349120914">Newidiwr Tabiau</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{<ph name="REVIEWS_COUNT_ONE" /> adolygiad gan Google}zero{<ph name="REVIEWS_COUNT_MANY" /> adolygiad gan Google}two{<ph name="REVIEWS_COUNT_MANY" /> adolygiad gan Google}few{<ph name="REVIEWS_COUNT_MANY" /> adolygiad gan Google}many{<ph name="REVIEWS_COUNT_MANY" /> adolygiad gan Google}other{<ph name="REVIEWS_COUNT_MANY" /> adolygiad gan Google}}</translation> <translation id="7559245342362162951">Dangos tabiau'r grŵp mewn grid sgrîn lawn</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{Rhannu <ph name="TABS_COUNT_ONE" /> tab a ddewiswyd}zero{Rhannu <ph name="TABS_COUNT_MANY" /> tab a ddewiswyd}two{Rhannu <ph name="TABS_COUNT_MANY" /> dab a ddewiswyd}few{Rhannu <ph name="TABS_COUNT_MANY" /> tab a ddewiswyd}many{Rhannu <ph name="TABS_COUNT_MANY" /> tab a ddewiswyd}other{Rhannu <ph name="TABS_COUNT_MANY" /> tab a ddewiswyd}}</translation> <translation id="7792771145871471484">Gweld yr awgrymiadau.</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{Grwpio <ph name="TABS_COUNT_ONE" /> tab a ddewisir}zero{Grwpio <ph name="TABS_COUNT_MANY" /> tab a ddewisir}two{Grwpio <ph name="TABS_COUNT_MANY" /> dab a ddewisir}few{Grwpio <ph name="TABS_COUNT_MANY" /> thab a ddewisir}many{Grwpio <ph name="TABS_COUNT_MANY" /> thab a ddewisir}other{Grwpio <ph name="TABS_COUNT_MANY" /> tab a ddewisir}}</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>
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 62325da..b88f6079 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> fane}one{<ph name="TABS_COUNT_MANY" /> fane}other{<ph name="TABS_COUNT_MANY" /> faner}}</translation> <translation id="2118649612461486615">Butiksinfo</translation> <translation id="2162620598375156287">Fås nu til <ph name="CURRENT_PRICE" /> på <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Ophæv gruppering af fane}one{Ophæv gruppering af fane}other{Ophæv gruppering af faner}}</translation> <translation id="2277224997687551299">Rediger gruppenavn</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Fjern <ph name="TABS_COUNT_ONE" /> valgt fane fra gruppen.}one{Fjern <ph name="TABS_COUNT_MANY" /> valgt fane fra gruppen.}other{Fjern <ph name="TABS_COUNT_MANY" /> valgte faner fra gruppen.}}</translation> <translation id="2479148705183875116">Gå til Indstillinger</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Skjul <ph name="TABS_COUNT_ONE" /> fane.}one{Skjul fanegruppen <ph name="TITLE_OF_GROUP" /> med <ph name="TABS_COUNT_MANY" /> fane.}other{Skjul fanegruppen <ph name="TITLE_OF_GROUP" /> med <ph name="TABS_COUNT_MANY" /> faner.}}</translation> <translation id="3882834874697329510">Slå notifikationer til i indstillingerne for at få en underretning, når der er en lavere pris på en åben fane.</translation> <translation id="3940195383040445971">Følg prisudvikling på faner</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Gruppér fane}one{Gruppér fane}other{Gruppér faner}}</translation> <translation id="3996880007329611795">Få besked</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> faner ser ud til at være relateret. Vil du gruppere dem?</translation> <translation id="4212246570487010370">Fortsæt med at gennemse</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> anmeldelse)}one{(<ph name="REVIEWS_COUNT_MANY" /> anmeldelse)}other{(<ph name="REVIEWS_COUNT_MANY" /> anmeldelser)}}</translation> <translation id="4850886885716139402">Vis</translation> <translation id="4870911314065352661">Vil du lukke alle faner?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Luk fane}one{Luk fane}other{Luk faner}}</translation> <translation id="492284538114688557">Der er registreret prisfald</translation> <translation id="5007392906805964215">Gennemgå</translation> <translation id="5073204694187207510">Skjul fuldskærmsgitter</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Lad mig se</translation> <translation id="6840760312327750441">Du kan gruppere faner ved at holde en fane nede. Træk den derefter oven på en anden fane.</translation> <translation id="6856809498882026482">Skjul tilstanden Valg af flere</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Del fane}one{Del fane}other{Del faner}}</translation> <translation id="7129458170538955174">Oplysningerne om denne butik er åbnet i halv højde</translation> <translation id="7151209024774799310">Fjern faner fra gruppe</translation> <translation id="7204204600596740190">Tilstanden Valg af flere</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 5b49dcdf..9115e018 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> Tab}other{<ph name="TABS_COUNT_MANY" /> Tabs}}</translation> <translation id="2118649612461486615">Händlerinfo</translation> <translation id="2162620598375156287">Jetzt <ph name="CURRENT_PRICE" /> auf <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Tab-Gruppierung aufheben}other{Tab-Gruppierung aufheben}}</translation> <translation id="2277224997687551299">Gruppenname bearbeiten</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ausgewählten Tab aus der Gruppe entfernen}other{<ph name="TABS_COUNT_MANY" /> ausgewählte Tabs aus der Gruppe entfernen}}</translation> <translation id="2479148705183875116">Zu den Einstellungen</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> Tab minimieren}other{Tabgruppe "<ph name="TITLE_OF_GROUP" />" mit <ph name="TABS_COUNT_MANY" /> Tabs minimieren}}</translation> <translation id="3882834874697329510">Falls du benachrichtigt werden möchtest, wenn auf einem offenen Tab ein günstigerer Preis verfügbar ist, aktiviere Benachrichtigungen in den Einstellungen.</translation> <translation id="3940195383040445971">Preise auf Tabs beobachten</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Tab gruppieren}other{Tabs gruppieren}}</translation> <translation id="3996880007329611795">Benachrichtigungen erhalten</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> Tabs scheinen zusammenzugehören. Sollen sie gruppiert werden?</translation> <translation id="4212246570487010370">Weitersurfen</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> Rezension)}other{(<ph name="REVIEWS_COUNT_MANY" /> Rezensionen)}}</translation> <translation id="4850886885716139402">Anzeigen</translation> <translation id="4870911314065352661">Alle Tabs schließen?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Tab schließen}other{Tabs schließen}}</translation> <translation id="492284538114688557">Preisnachlass entdeckt</translation> <translation id="5007392906805964215">Ansehen</translation> <translation id="5073204694187207510">Vollbildraster ausblenden</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Zeigen</translation> <translation id="6840760312327750441">Wenn du Tabs gruppieren möchtest, berühre und halte einen Tab. Ziehe ihn dann auf einen anderen Tab.</translation> <translation id="6856809498882026482">Modus für die Mehrfachauswahl ausblenden</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Tab teilen}other{Tabs teilen}}</translation> <translation id="7129458170538955174">Informationen zu diesem Händler sind halb geöffnet</translation> <translation id="7151209024774799310">Tabs aus der Gruppe verschieben</translation> <translation id="7204204600596740190">Mehrfachauswahl</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb index d0f856a8..bcafbca 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> καρτέλα}other{<ph name="TABS_COUNT_MANY" /> καρτέλες}}</translation> <translation id="2118649612461486615">Πληροφορίες καταστήματος</translation> <translation id="2162620598375156287">Τώρα <ph name="CURRENT_PRICE" /> στο <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Κατάργηση ομαδοπ. καρτέλας}other{Κατάργηση ομαδοπ. καρτελών}}</translation> <translation id="2277224997687551299">Επεξεργασία ονόματος ομάδας</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Αφαιρέστε <ph name="TABS_COUNT_ONE" /> επιλεγμένη καρτέλα από την ομάδα.}other{Αφαιρέστε <ph name="TABS_COUNT_MANY" /> επιλεγμένες καρτέλες από την ομάδα.}}</translation> <translation id="2479148705183875116">Μετάβαση στις Ρυθμίσεις</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Συμπτύξτε <ph name="TABS_COUNT_ONE" /> καρτέλα.}other{Συμπτύξτε την ομάδα καρτελών <ph name="TITLE_OF_GROUP" /> με τις <ph name="TABS_COUNT_MANY" /> καρτέλες.}}</translation> <translation id="3882834874697329510">Για να λαμβάνετε μια ειδοποίηση όταν υπάρχει χαμηλότερη τιμή σε μια ανοικτή καρτέλα, ενεργοποιήστε τις ειδοποιήσεις στις Ρυθμίσεις.</translation> <translation id="3940195383040445971">Παρακολούθηση τιμών σε καρτέλες</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Ομαδοποίηση καρτέλας}other{Ομαδοποίηση καρτελών}}</translation> <translation id="3996880007329611795">Λήψη ειδοποιήσεων</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> καρτέλες φαίνονται σχετικές. Να γίνει ομαδοποίηση;</translation> <translation id="4212246570487010370">Συνέχεια περιήγησης</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> κριτική)}other{(<ph name="REVIEWS_COUNT_MANY" /> κριτικές)}}</translation> <translation id="4850886885716139402">Προβολή</translation> <translation id="4870911314065352661">Θέλετε να κλείσετε όλες τις καρτέλες;</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Κλείσιμο καρτέλας}other{Κλείσιμο καρτελών}}</translation> <translation id="492284538114688557">Εντοπίστηκε πτώση τιμής</translation> <translation id="5007392906805964215">Έλεγχος</translation> <translation id="5073204694187207510">Απόκρυψη πλέγματος πλήρους οθόνης</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Εμφάνιση</translation> <translation id="6840760312327750441">Για την ομαδοποίηση καρτελών, αγγίξτε παρατεταμένα μια καρτέλα. Έπειτα, σύρετέ τη πάνω σε μια άλλη καρτέλα.</translation> <translation id="6856809498882026482">Απόκρυψη λειτουργίας πολλαπλής επιλογής</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Κοινοποίηση καρτέλας}other{Κοινοποίηση καρτελών}}</translation> <translation id="7129458170538955174">Άνοιγμα στο μισό ύψος των πληροφοριών σχετικά με αυτό το κατάστημα</translation> <translation id="7151209024774799310">Κατάργηση καρτελών από την ομάδα</translation> <translation id="7204204600596740190">Λειτουργία πολλαπλής επιλογής</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 e8afefa..0253d4b 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> pestaña}other{<ph name="TABS_COUNT_MANY" /> pestañas}}</translation> <translation id="2118649612461486615">Información de la tienda</translation> <translation id="2162620598375156287">Ahora, por <ph name="CURRENT_PRICE" /> en <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Desagrupar pestaña}other{Desagrupar pestañas}}</translation> <translation id="2277224997687551299">Editar nombre de grupo</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Quitar <ph name="TABS_COUNT_ONE" /> pestaña seleccionada del grupo.}other{Quitar <ph name="TABS_COUNT_MANY" /> pestañas seleccionadas del grupo.}}</translation> <translation id="2479148705183875116">Ve a Ajustes</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Ocultar <ph name="TABS_COUNT_ONE" /> pestaña}other{Ocultar grupo de pestañas <ph name="TITLE_OF_GROUP" /> con <ph name="TABS_COUNT_MANY" /> pestañas.}}</translation> <translation id="3882834874697329510">Para recibir una alerta cuando haya un precio más bajo en una pestaña abierta, activa las notificaciones en Ajustes.</translation> <translation id="3940195383040445971">Seguir precios en pestañas</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Agrupar pestaña}other{Agrupar pestañas}}</translation> <translation id="3996880007329611795">Recibir notificaciones</translation> <translation id="4133493477912226187">Hay <ph name="NUMBER_OF_TABS" /> pestañas que parecen relacionadas. ¿Quieres agruparlas?</translation> <translation id="4212246570487010370">Continuar navegando</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> reseña)}other{(<ph name="REVIEWS_COUNT_MANY" /> reseñas)}}</translation> <translation id="4850886885716139402">Ver</translation> <translation id="4870911314065352661">¿Cerrar todas las pestañas?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Cerrar pestaña}other{Cerrar pestañas}}</translation> <translation id="492284538114688557">Bajada de precio detectada</translation> <translation id="5007392906805964215">Ver</translation> <translation id="5073204694187207510">Ocultar la cuadrícula en pantalla completa</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Ver</translation> <translation id="6840760312327750441">Para agrupar pestañas, mantén pulsada una pestaña. A continuación, arrástrala sobre otra pestaña.</translation> <translation id="6856809498882026482">Ocultar el modo de selección múltiple</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Compartir pestaña}other{Compartir pestañas}}</translation> <translation id="7129458170538955174">Información sobre esta tienda abierta a media altura</translation> <translation id="7151209024774799310">Quitar pestañas del grupo</translation> <translation id="7204204600596740190">Modo de selección múltiple</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 174202a..7e3e2ab 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> vaheleht}other{<ph name="TABS_COUNT_MANY" /> vahelehte}}</translation> <translation id="2118649612461486615">Poe teave</translation> <translation id="2162620598375156287">Nüüd <ph name="CURRENT_PRICE" /> veebisaidil <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Tühista vahelehe grupeerimine}other{Tühista vahelehtede grupeerimine}}</translation> <translation id="2277224997687551299">Grupi nime muutmine</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Eemalda grupist <ph name="TABS_COUNT_ONE" /> valitud vaheleht.}other{Eemalda grupist <ph name="TABS_COUNT_MANY" /> valitud vahelehte.}}</translation> <translation id="2479148705183875116">Ava seaded</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Ahenda <ph name="TABS_COUNT_ONE" /> vaheleht.}other{Ahenda <ph name="TABS_COUNT_MANY" /> vahelehega vahelehegrupp <ph name="TITLE_OF_GROUP" />.}}</translation> <translation id="3882834874697329510">Kui soovite avatud vahelehel oleva soodsama hinna kohta märguannet saada, lülitage märguanded seadetes sisse.</translation> <translation id="3940195383040445971">Jälgige vahelehtedel hindu</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Grupeeri vaheleht}other{Grupeeri vahelehed}}</translation> <translation id="3996880007329611795">Hankige märguandeid</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> vahelehte näivad olevat seotud. Kas soovite need grupeerida?</translation> <translation id="4212246570487010370">Jätka sirvimist</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> arvustus)}other{(<ph name="REVIEWS_COUNT_MANY" /> arvustust)}}</translation> <translation id="4850886885716139402">Kuva</translation> <translation id="4870911314065352661">Kas sulgeda kõik vahelehed?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Sule vaheleht}other{Sule vahelehed}}</translation> <translation id="492284538114688557">Märgati hinnalangust</translation> <translation id="5007392906805964215">Vaata üle</translation> <translation id="5073204694187207510">Peida täisekraani ruudustik</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Kuva mulle</translation> <translation id="6840760312327750441">Vahelehtede rühmitamiseks puudutage vahelehte pikalt. Seejärel lohistage see teise vahelehe peale.</translation> <translation id="6856809498882026482">Peida mitmikvalimise režiim</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Jaga vahelehte}other{Jaga vahelehti}}</translation> <translation id="7129458170538955174">Selle poe teave on avatud poolel kõrgusel</translation> <translation id="7151209024774799310">Eemalda vahelehti grupist</translation> <translation id="7204204600596740190">Mitmikvalimise režiim</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb index e07262d..80a460e 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> برگه}one{<ph name="TABS_COUNT_MANY" /> برگه}other{<ph name="TABS_COUNT_MANY" /> برگه}}</translation> <translation id="2118649612461486615">اطلاعات فروشگاه</translation> <translation id="2162620598375156287">اکنون با قیمت <ph name="CURRENT_PRICE" /> در <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{لغو گروهبندی برگه}one{لغو گروهبندی برگه}other{لغو گروهبندی برگهها}}</translation> <translation id="2277224997687551299">ویرایش نام گروه</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{برداشتن <ph name="TABS_COUNT_ONE" /> برگه انتخابشده از گروه.}one{برداشتن <ph name="TABS_COUNT_MANY" /> برگه انتخابشده از گروه.}other{برداشتن <ph name="TABS_COUNT_MANY" /> برگه انتخابشده از گروه.}}</translation> <translation id="2479148705183875116">رفتن به تنظیمات</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{جمع کردن <ph name="TABS_COUNT_ONE" /> برگه.}one{جمع کردن گروه برگه <ph name="TITLE_OF_GROUP" /> با <ph name="TABS_COUNT_MANY" /> برگه.}other{جمع کردن گروه برگه <ph name="TITLE_OF_GROUP" /> با <ph name="TABS_COUNT_MANY" /> برگه.}}</translation> <translation id="3882834874697329510">اعلانها را در «تنظیمات» روشن کنید تا اگر قیمت کمتری در برگهای باز وجود داشت هشدار دریافت کنید.</translation> <translation id="3940195383040445971">پیگیری قیمت در برگهها</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{گروهبندی برگه}one{گروهبندی برگه}other{گروهبندی برگهها}}</translation> <translation id="3996880007329611795">دریافت اعلان</translation> <translation id="4133493477912226187">به نظر میرسد <ph name="NUMBER_OF_TABS" /> برگه مرتبط باشند. گروهبندی شوند؟</translation> <translation id="4212246570487010370">ادامه مرور</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> مرور)}one{(<ph name="REVIEWS_COUNT_MANY" /> مرور)}other{(<ph name="REVIEWS_COUNT_MANY" /> مرور)}}</translation> <translation id="4850886885716139402">نما</translation> <translation id="4870911314065352661">همه برگهها بسته شود؟</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{بستن برگه}one{بستن برگه}other{بستن برگهها}}</translation> <translation id="492284538114688557">کاهش قیمت شناسایی شد</translation> <translation id="5007392906805964215">مرور</translation> <translation id="5073204694187207510">پنهان کردن شبکه تمامصفحه</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">نشانم داده شود</translation> <translation id="6840760312327750441">برای ایجاد برگههای گروهی، برگهای را لمس کنید و نگهدارید. سپس آن را به برگهای دیگر بکشید.</translation> <translation id="6856809498882026482">پنهان کردن حالت چندانتخابی</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{همرسانی برگه}one{همرسانی برگه}other{همرسانی برگهها}}</translation> <translation id="7129458170538955174">اطلاعات مربوط به این فروشگاه بهصورت نیمه باز شده است</translation> <translation id="7151209024774799310">برداشتن برگهها از گروه</translation> <translation id="7204204600596740190">حالت چندانتخابی</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb index af50d6f..23628cbe 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tab}one{<ph name="TABS_COUNT_MANY" /> tab}other{<ph name="TABS_COUNT_MANY" /> na tab}}</translation> <translation id="2118649612461486615">Impormasyon ng store</translation> <translation id="2162620598375156287"><ph name="CURRENT_PRICE" /> ngayon sa <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{I-ungroup ang tab}one{I-ungroup ang mga tab}other{I-ungroup ang mga tab}}</translation> <translation id="2277224997687551299">I-edit ang pangalan ng grupo</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Alisin ang <ph name="TABS_COUNT_ONE" /> piniling tab sa grupo.}one{Alisin ang <ph name="TABS_COUNT_MANY" /> piniling tab sa grupo.}other{Alisin ang <ph name="TABS_COUNT_MANY" /> na piniling tab sa grupo.}}</translation> <translation id="2479148705183875116">Pumunta sa Mga Setting</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{I-collapse ang <ph name="TABS_COUNT_ONE" /> tab.}one{I-collapse ang grupo ng tab na <ph name="TITLE_OF_GROUP" /> na may <ph name="TABS_COUNT_MANY" /> tab.}other{I-collapse ang grupo ng tab na <ph name="TITLE_OF_GROUP" /> na may <ph name="TABS_COUNT_MANY" /> na tab.}}</translation> <translation id="3882834874697329510">Para makakuha ng alerto sa isang bukas na tab kapag may mas mababang presyo, i-on ang mga notification sa Mga Setting.</translation> <translation id="3940195383040445971">Subaybayan ang mga presyo sa mga tab</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Igrupo ang tab}one{Igrupo ang mga tab}other{Igrupo ang mga tab}}</translation> <translation id="3996880007329611795">Ma-notify</translation> <translation id="4133493477912226187">Mukhang magkaugnay ang <ph name="NUMBER_OF_TABS" /> (na) tab. Igrupo ang mga ito?</translation> <translation id="4212246570487010370">Magpatuloy sa pag-browse</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> review)}one{(<ph name="REVIEWS_COUNT_MANY" /> review)}other{(<ph name="REVIEWS_COUNT_MANY" /> na review)}}</translation> <translation id="4850886885716139402">View</translation> <translation id="4870911314065352661">Isara ang lahat ng tab?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Isara ang tab}one{Isara ang mga tab}other{Isara ang mga tab}}</translation> <translation id="492284538114688557">May nakitang pagbaba ng presyo</translation> <translation id="5007392906805964215">Suriin</translation> <translation id="5073204694187207510">Itago ang fullscreen grid</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Ipakita sa akin</translation> <translation id="6840760312327750441">Sa mga tab ng grupo, pindutin nang matagal ang isang tab. Pagkatapos, i-drag ito sa isa pang tab.</translation> <translation id="6856809498882026482">Itago ang multi-select mode</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{I-share ang tab}one{I-share ang mga tab}other{I-share ang mga tab}}</translation> <translation id="7129458170538955174">Binuksan ang impormasyon tungkol sa store na to nang kalahati ang taas</translation> <translation id="7151209024774799310">Mag-alis ng mga tab sa grupo</translation> <translation id="7204204600596740190">Multi-select mode</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 e8c991df..4866c81 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tab}other{<ph name="TABS_COUNT_MANY" /> tab}}</translation> <translation id="2118649612461486615">Info toko</translation> <translation id="2162620598375156287">Sekarang <ph name="CURRENT_PRICE" /> di <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Pisahkan tab}other{Pisahkan tab}}</translation> <translation id="2277224997687551299">Edit nama grup</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Hapus <ph name="TABS_COUNT_ONE" /> tab yang dipilih dari grup.}other{Hapus <ph name="TABS_COUNT_MANY" /> tab yang dipilih dari grup.}}</translation> <translation id="2479148705183875116">Buka Setelan</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Ciutkan <ph name="TABS_COUNT_ONE" /> tab.}other{Ciutkan grup tab <ph name="TITLE_OF_GROUP" /> yang berisi <ph name="TABS_COUNT_MANY" /> tab.}}</translation> <translation id="3882834874697329510">Untuk mendapatkan notifikasi saat terdapat harga lebih rendah di tab yang terbuka, aktifkan notifikasi di Setelan.</translation> <translation id="3940195383040445971">Pantau harga di tab</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Kelompokkan tab}other{Kelompokkan tab}}</translation> <translation id="3996880007329611795">Dapatkan notifikasi</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> tab sepertinya berkaitan. Masukkan ke grup?</translation> <translation id="4212246570487010370">Lanjutkan menjelajah</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> ulasan)}other{(<ph name="REVIEWS_COUNT_MANY" /> ulasan)}}</translation> <translation id="4850886885716139402">Lihat</translation> <translation id="4870911314065352661">Tutup semua tab?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Tutup tab}other{Tutup tab}}</translation> <translation id="492284538114688557">Diskon ditemukan</translation> <translation id="5007392906805964215">Tinjau</translation> <translation id="5073204694187207510">Sembunyikan petak layar penuh</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Tunjukkan</translation> <translation id="6840760312327750441">Untuk mengelompokkan tab, sentuh lama sebuah tab. Lalu, tarik ke tab lainnya.</translation> <translation id="6856809498882026482">Sembunyikan mode multi-pilihan</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Bagikan tab}other{Bagikan tab}}</translation> <translation id="7129458170538955174">Informasi tentang toko ini terbuka setengah</translation> <translation id="7151209024774799310">Keluarkan tab dari grup</translation> <translation id="7204204600596740190">Mode multi-pilihan</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_is.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_is.xtb index e9bfc13..bf10f10 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_is.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_is.xtb
@@ -80,6 +80,7 @@ <translation id="753732157349120914">Flipaval</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{<ph name="REVIEWS_COUNT_ONE" /> umsögn frá Google}one{<ph name="REVIEWS_COUNT_MANY" /> umsögn frá Google}other{<ph name="REVIEWS_COUNT_MANY" /> umsagnir frá Google}}</translation> <translation id="7559245342362162951">Sýna flipa hóps á öllum skjánum</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{Deila <ph name="TABS_COUNT_ONE" /> völdum flipa}one{Deila <ph name="TABS_COUNT_MANY" /> völdum flipa}other{Deila <ph name="TABS_COUNT_MANY" /> völdum flipum}}</translation> <translation id="7792771145871471484">Skoða tillögurnar.</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{Setja <ph name="TABS_COUNT_ONE" /> valinn flipa í hóp}one{Setja <ph name="TABS_COUNT_MANY" /> valinn flipa í hóp}other{Setja <ph name="TABS_COUNT_MANY" /> valda flipa í hóp}}</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> einkunn, <ph name="REVIEWS_COUNT_ONE" /> umsögn}one{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> einkunn, <ph name="REVIEWS_COUNT_MANY" /> umsögn}other{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> einkunnir, <ph name="REVIEWS_COUNT_MANY" /> umsagnir}}</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 a92eab5..b8affb84 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ჩანართი}other{<ph name="TABS_COUNT_MANY" /> ჩანართი}}</translation> <translation id="2118649612461486615">მაღაზიის ინფორმაცია</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" />-ზე ახლა <ph name="CURRENT_PRICE" /> ღირს</translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{ჩანართის დაჯგუფების გაუქმება}other{ჩანართების დაჯგუფების გაუქმება}}</translation> <translation id="2277224997687551299">ჯგუფის სახელის რედაქტირება</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> არჩეული ჩანართის ამოშლა ჯგუფიდან.}other{<ph name="TABS_COUNT_MANY" /> არჩეული ჩანართის ამოშლა ჯგუფიდან.}}</translation> <translation id="2479148705183875116">პარამეტრებზე გადასვლა</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ჩანართის ჩაკეცვა.}other{<ph name="TABS_COUNT_MANY" />-ჩანართიანი ჯგუფის „<ph name="TITLE_OF_GROUP" />“ ჩაკეცვა.}}</translation> <translation id="3882834874697329510">იმისთვის, რომ მიიღოთ გაფრთხილება, როცა გახსნილ ჩანართში უფრო დაბალი ფასი იქნება, ჩართეთ შეტყობინების ფუნქცია პარამეტრებიდან.</translation> <translation id="3940195383040445971">ფასებისთვის თვალის მიდევნება ჩანართებზე</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{ჩანართის დაჯგუფება}other{ჩანართების დაჯგუფება}}</translation> <translation id="3996880007329611795">შეტყობინებების მიღება</translation> <translation id="4133493477912226187">როგორც ჩანს, <ph name="NUMBER_OF_TABS" /> ჩანართი დაკავშირებულია. გსურთ მათი დაჯგუფება?</translation> <translation id="4212246570487010370">დათვალიერების გაგრძელება</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> მიმოხილვა)}other{(<ph name="REVIEWS_COUNT_MANY" /> მიმოხილვა)}}</translation> <translation id="4850886885716139402">გადახედვა</translation> <translation id="4870911314065352661">გსურთ, ყველა ჩანართი დაიხუროს?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{ჩანართის დახურვა}other{ჩანართების დახურვა}}</translation> <translation id="492284538114688557">აღმოჩენილია ფასის დაწევა</translation> <translation id="5007392906805964215">გადახედვა</translation> <translation id="5073204694187207510">სრულეკრანიანი ბადის დამალვა</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">მაჩვენე</translation> <translation id="6840760312327750441">ჩანართების დასაჯგუფებლად ხანგრძლივად შეეხეთ ჩანართს. შემდეგ კი ჩავლებით გადაიტანეს ის სხვა ჩანართზე.</translation> <translation id="6856809498882026482">რამდენიმეარჩევანიანი რეჟიმის დამალვა</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{ჩანართის გაზიარება}other{ჩანართების გაზიარება}}</translation> <translation id="7129458170538955174">ამ მაღაზიის შესახებ ინფორმაცია გახსნილია ნახევარ სიმაღლეზე</translation> <translation id="7151209024774799310">ჩანართების წაშლა ჯგუფიდან</translation> <translation id="7204204600596740190">რამდენიმეარჩევანიანი რეჟიმი</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 b7303cf..7c0cec7 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{탭 <ph name="TABS_COUNT_ONE" />개}other{탭 <ph name="TABS_COUNT_MANY" />개}}</translation> <translation id="2118649612461486615">매장 정보</translation> <translation id="2162620598375156287">이제 <ph name="SOURCE_WEBSITE" />에서 <ph name="CURRENT_PRICE" />에 판매됨</translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{탭 그룹 해제}other{탭 그룹 해제}}</translation> <translation id="2277224997687551299">그룹 이름 수정</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{선택한 탭 <ph name="TABS_COUNT_ONE" />개를 그룹에서 삭제합니다.}other{선택한 탭 <ph name="TABS_COUNT_MANY" />개를 그룹에서 삭제합니다.}}</translation> <translation id="2479148705183875116">설정으로 이동</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{탭 <ph name="TABS_COUNT_ONE" />개를 접습니다.}other{탭 <ph name="TABS_COUNT_MANY" />개가 포함된 <ph name="TITLE_OF_GROUP" /> 탭 그룹을 접습니다.}}</translation> <translation id="3882834874697329510">열린 탭에서 더 낮은 가격이 발견되었을 때 알림을 받으려면 설정에서 알림을 사용 설정하세요.</translation> <translation id="3940195383040445971">탭에서 가격 추적</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{탭 그룹화}other{탭 그룹화}}</translation> <translation id="3996880007329611795">알림 받기</translation> <translation id="4133493477912226187">탭 <ph name="NUMBER_OF_TABS" />개가 서로 관련된 것으로 보입니다. 그룹화할까요?</translation> <translation id="4212246570487010370">계속 탐색</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(리뷰 <ph name="REVIEWS_COUNT_ONE" />개)}other{(리뷰 <ph name="REVIEWS_COUNT_MANY" />개)}}</translation> <translation id="4850886885716139402">보기</translation> <translation id="4870911314065352661">모든 탭을 닫을까요?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{탭 닫기}other{탭 닫기}}</translation> <translation id="492284538114688557">가격 인하 항목 발견</translation> <translation id="5007392906805964215">검토</translation> <translation id="5073204694187207510">전체화면 그리드 숨기기</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">보기</translation> <translation id="6840760312327750441">탭을 그룹화하려면 탭을 길게 터치한 다음 다른 탭으로 드래그하세요.</translation> <translation id="6856809498882026482">다중 선택 모드 숨기기</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{탭 공유}other{탭 공유}}</translation> <translation id="7129458170538955174">매장에 관한 정보가 절반 높이로 열림</translation> <translation id="7151209024774799310">그룹에서 탭 삭제</translation> <translation id="7204204600596740190">다중 선택 모드</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 5de9e17..475c270 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
@@ -80,6 +80,7 @@ <translation id="753732157349120914">ຕົວປ່ຽນແຖບ</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{<ph name="REVIEWS_COUNT_ONE" /> ຄຳຕິຊົມຈາກ Google}other{<ph name="REVIEWS_COUNT_MANY" /> ຄຳຕິຊົມຈາກ Google}}</translation> <translation id="7559245342362162951">ສະແດງແຖບຂອງກຸ່ມໃນຕາໜ່າງແບບເຕັມຈໍ</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{ແບ່ງປັນ <ph name="TABS_COUNT_ONE" /> ແຖບທີ່ເລືອກ}other{ແບ່ງປັນ <ph name="TABS_COUNT_MANY" /> ແຖບທີ່ເລືອກ}}</translation> <translation id="7792771145871471484">ກວດເບິ່ງການແນະນຳ.</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{ຈັດກຸ່ມແຖບທີ່ເລືອກ <ph name="TABS_COUNT_ONE" /> ແຖບ}other{ຈັດກຸ່ມແຖບທີ່ເລືອກ <ph name="TABS_COUNT_MANY" /> ແຖບ}}</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>
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 fd40be3..4a18639 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> таб}other{<ph name="TABS_COUNT_MANY" /> таб}}</translation> <translation id="2118649612461486615">Дэлгүүрийн мэдээлэл</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> дээр одоо <ph name="CURRENT_PRICE" /> байна</translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Табыг бүлэглэхээ болих}other{Табуудыг бүлэглэхээ болих}}</translation> <translation id="2277224997687551299">Бүлгийн нэрийг засах</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Сонгосон <ph name="TABS_COUNT_ONE" /> табыг бүлгээс хасах.}other{Сонгосон <ph name="TABS_COUNT_MANY" /> табыг бүлгээс хасах.}}</translation> <translation id="2479148705183875116">Тохиргоо руу очих</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> табыг хураах.}other{<ph name="TABS_COUNT_MANY" /> таб бүхий <ph name="TITLE_OF_GROUP" /> бүлэг табыг хураах.}}</translation> <translation id="3882834874697329510">Та нээлттэй табд илүү хямд үнэ байгаа тохиолдолд сэрэмжлүүлэг авахын тулд Тохиргоо хэсэгт мэдэгдлийг асаана уу.</translation> <translation id="3940195383040445971">Табууд дээрх үнийг хянах</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Табыг бүлэглэх}other{Табуудыг бүлэглэх}}</translation> <translation id="3996880007329611795">Мэдэгдэл авах</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> таб холбоотой бололтой. Эдгээрийг бүлэглэх үү?</translation> <translation id="4212246570487010370">Тасралтгүй үзэх</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> шүүмж)}other{(<ph name="REVIEWS_COUNT_MANY" /> шүүмж)}}</translation> <translation id="4850886885716139402">Харах</translation> <translation id="4870911314065352661">Бүх табыг хаах уу?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Табыг хаах}other{Табуудыг хаах}}</translation> <translation id="492284538114688557">Үнийн уналт илрүүллээ</translation> <translation id="5007392906805964215">Шалгах</translation> <translation id="5073204694187207510">Бүтэн дэлгэцийн торыг нуух</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Надад үзүүлнэ үү</translation> <translation id="6840760312327750441">Табуудыг бүлэглэхийн тулд таб дээр хүрээд, удаан дарна уу. Тэгээд уг табыг нөгөө рүү нь чирж зөөнө үү.</translation> <translation id="6856809498882026482">Олон сонголттой горимыг нуух</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Табыг хуваалцах}other{Табуудыг хуваалцах}}</translation> <translation id="7129458170538955174">Энэ дэлгүүрийн талаарх мэдээллийг тал өндөртэйгээр нээсэн</translation> <translation id="7151209024774799310">Бүлгээс табыг хасах</translation> <translation id="7204204600596740190">Олон сонголттой горим</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 7425817..6f7ca37 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> टॅब}other{<ph name="TABS_COUNT_MANY" /> टॅब}}</translation> <translation id="2118649612461486615">स्टोअरची माहिती</translation> <translation id="2162620598375156287">आता <ph name="SOURCE_WEBSITE" /> वर <ph name="CURRENT_PRICE" /> मध्ये आहे</translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{टॅब गटामधून काढून टाका}other{टॅब गटामधून काढून टाका}}</translation> <translation id="2277224997687551299">गटाचे नाव संपादित करा</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{गटामधून निवडलेला <ph name="TABS_COUNT_ONE" /> टॅब काढून टाका.}other{गटामधून निवडलेले <ph name="TABS_COUNT_MANY" /> टॅब काढून टाका.}}</translation> <translation id="2479148705183875116">सेटिंग्ज वर जा</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> टॅब कोलॅप्स करा.}other{<ph name="TABS_COUNT_MANY" /> टॅबचा गट असलेले <ph name="TITLE_OF_GROUP" /> टॅब कोलॅप्स करा.}}</translation> <translation id="3882834874697329510">कमी किंमत उपलब्ध असताना उघड्या टॅबमध्ये सूचना मिळवण्यासाठी, सेंटिंग्ज मध्ये सूचना सुरू करा.</translation> <translation id="3940195383040445971">टॅबवर किमती ट्रॅक करा</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{गट टॅब}other{गट टॅब}}</translation> <translation id="3996880007329611795">सूचना मिळवा</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> टॅब संबंधित वाटतात. त्यांचा गट बनवायचा का?</translation> <translation id="4212246570487010370">ब्राउझ करणे सुरू ठेवा</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> परीक्षण)}other{(<ph name="REVIEWS_COUNT_MANY" /> परीक्षणे)}}</translation> <translation id="4850886885716139402">पहा</translation> <translation id="4870911314065352661">सर्व टॅब बंद करायचे आहेत का?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{टॅब बंद करा}other{टॅब बंद करा}}</translation> <translation id="492284538114688557">किमतीतील घट आढळली</translation> <translation id="5007392906805964215">पुनरावलोकन करा</translation> <translation id="5073204694187207510">फुलस्क्रीन ग्रिड लपवा</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">मला दर्शवा</translation> <translation id="6840760312327750441">टॅबचा गट करण्यासाठी, टॅबला स्पर्श करा आणि धरून ठेवा. नंतर, तो दुसऱ्या टॅबवर ड्रॅग करा.</translation> <translation id="6856809498882026482">एकाहून अधिक निवड मोड लपवा</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{टॅब शेअर करा}other{टॅब शेअर करा}}</translation> <translation id="7129458170538955174">या स्टोअरविषयी माहिती अर्ध्या उंचीवर उघडली आहे</translation> <translation id="7151209024774799310">गटामधून टॅब काढून टाका</translation> <translation id="7204204600596740190">एकाहून अधिक निवड मोड</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb index f70b4ef7..efb0505e 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{တဘ် <ph name="TABS_COUNT_ONE" /> ခု}other{တဘ် <ph name="TABS_COUNT_MANY" /> ခု}}</translation> <translation id="2118649612461486615">ဆိုင်အချက်အလက်</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> တွင်ယခု <ph name="CURRENT_PRICE" /> ဖြစ်သည်</translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{တဘ် အုပ်စုဖြုတ်ရန်}other{တဘ်များ အုပ်စုဖြုတ်ရန်}}</translation> <translation id="2277224997687551299">အဖွဲ့အမည်ကို တည်းဖြတ်ရန်</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{ရွေးထားသော တဘ် <ph name="TABS_COUNT_ONE" /> ခုအား အုပ်စုမှ ဖယ်ရှားပါ။}other{ရွေးထားသော တဘ် <ph name="TABS_COUNT_MANY" /> ခုအား အုပ်စုမှ ဖယ်ရှားပါ။}}</translation> <translation id="2479148705183875116">'ဆက်တင်များ' သို့ သွားရန်</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> တဘ်ကို ခေါက်ပါ။}other{တဘ် <ph name="TABS_COUNT_MANY" /> ခုဖြင့် အုပ်စုဖွဲ့ထားသည့် <ph name="TITLE_OF_GROUP" /> တဘ်ကို ပြန်ခေါက်ပါ။}}</translation> <translation id="3882834874697329510">ဖွင့်ထားသောတဘ်တွင် ဈေးကျသွားသည့်အခါ သတိပေးချက်ရရှိရန် ‘ဆက်တင်များ’ တွင် အကြောင်းကြားချက်များကို ဖွင့်ပါ။</translation> <translation id="3940195383040445971">တဘ်များတွင် ဈေးနှုန်းများစောင့်ကြည့်ရန်</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{တဘ် အုပ်စုဖွဲ့ရန်}other{တဘ်များ အုပ်စုဖွဲ့ရန်}}</translation> <translation id="3996880007329611795">အကြောင်းကြားချက် ရယူရန်</translation> <translation id="4133493477912226187">တဘ် <ph name="NUMBER_OF_TABS" /> ခုက ဆက်စပ်ပုံပေါ်သည်။ ၎င်းတို့ကို အုပ်စုဖွဲ့မလား။</translation> <translation id="4212246570487010370">ဆက်တိုက် ရှာကြည့်ခြင်း</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(သုံးသပ်ချက် <ph name="REVIEWS_COUNT_ONE" /> ခု)}other{(သုံးသပ်ချက် <ph name="REVIEWS_COUNT_MANY" /> ခု)}}</translation> <translation id="4850886885716139402">မြင်ကွင်း</translation> <translation id="4870911314065352661">တဘ်အားလုံး ပိတ်မလား။</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{တဘ် ပိတ်ရန်}other{တဘ်များ ပိတ်ရန်}}</translation> <translation id="492284538114688557">ဈေးကျသွားသည်ကို တွေ့သည်</translation> <translation id="5007392906805964215">ပြန်ကြည့်ရန်</translation> <translation id="5073204694187207510">မျက်နှာပြင်ပြည့် ဇယားကွက်ကို ဝှက်ရန်</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">ပြရန်</translation> <translation id="6840760312327750441">တဘ်များကို အုပ်စုဖွဲ့ရန် တဘ်တစ်ခုကို တို့ထိ၍ ဖိထားပါ။ ထို့နောက် ၎င်းကို နောက်တဘ်တစ်ခုပေါ်သို့ ဖိဆွဲပါ။</translation> <translation id="6856809498882026482">မျိုးစုံရွေးမုဒ်ကို ဝှက်ရန်</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{တဘ် မျှဝေရန်}other{တဘ်များ မျှဝေရန်}}</translation> <translation id="7129458170538955174">ဤဆိုင် တစ်ဝက်ဖွင့်သည့်အကြောင်း</translation> <translation id="7151209024774799310">အုပ်စုမှ တဘ်များကို ဖယ်ရှားရန်</translation> <translation id="7204204600596740190">မျိုးစုံရွေးမုဒ်</translation> @@ -80,6 +84,7 @@ <translation id="753732157349120914">တဘ်ပြောင်းခလုတ်</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{Google မှ သုံးသပ်ချက် <ph name="REVIEWS_COUNT_ONE" /> ခု}other{Google မှ သုံးသပ်ချက် <ph name="REVIEWS_COUNT_MANY" /> ခု}}</translation> <translation id="7559245342362162951">မျက်နှာပြင်ပြည့် ဇယားကွက်အတွင်း အုပ်စု၏ တဘ်များကို ပြရန်</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{ရွေးထားသည့်တဘ် <ph name="TABS_COUNT_ONE" /> ခု မျှဝေရန်}other{ရွေးထားသည့်တဘ် <ph name="TABS_COUNT_MANY" /> ခု မျှဝေရန်}}</translation> <translation id="7792771145871471484">အကြံပြုချက်များကို စစ်ဆေးရန်။</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{ရွေးထားသောတဘ် <ph name="TABS_COUNT_ONE" /> ခုကို အုပ်စုဖွဲ့ရန်}other{ရွေးထားသောတဘ် <ph name="TABS_COUNT_MANY" /> ခုကို အုပ်စုဖွဲ့ရန်}}</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>
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 7084c40..de70688 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> fane}other{<ph name="TABS_COUNT_MANY" /> faner}}</translation> <translation id="2118649612461486615">Butikkinformasjon</translation> <translation id="2162620598375156287">Nå <ph name="CURRENT_PRICE" /> på <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Fjern fanen fra gruppen}other{Fjern fanene fra gruppen}}</translation> <translation id="2277224997687551299">Endre gruppenavnet</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Fjern <ph name="TABS_COUNT_ONE" /> valgt fane fra gruppen.}other{Fjern <ph name="TABS_COUNT_MANY" /> valgte faner fra gruppen.}}</translation> <translation id="2479148705183875116">Gå til Innstillinger</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Skjul <ph name="TABS_COUNT_ONE" /> fane.}other{Skjul <ph name="TITLE_OF_GROUP" /> fanegruppe med <ph name="TABS_COUNT_MANY" /> faner.}}</translation> <translation id="3882834874697329510">For å bli varslet når det finnes en lavere pris på en åpen fane, slå på varsler i Innstillinger.</translation> <translation id="3940195383040445971">Spor priser på faner</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Grupper fanen}other{Grupper fanene}}</translation> <translation id="3996880007329611795">Bli varslet</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> faner ser ut til å være relaterte. Vil du gruppere dem?</translation> <translation id="4212246570487010370">Fortsett å surfe</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> anmeldelse)}other{(<ph name="REVIEWS_COUNT_MANY" /> anmeldelser)}}</translation> <translation id="4850886885716139402">Visning</translation> <translation id="4870911314065352661">Vil du lukke alle faner?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Lukk fanen}other{Lukk fanene}}</translation> <translation id="492284538114688557">Oppdaget et avslag</translation> <translation id="5007392906805964215">Se gjennom</translation> <translation id="5073204694187207510">Skjul fullskjermrutenett</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Vis meg</translation> <translation id="6840760312327750441">For å gruppere faner, trykk og hold på en fane. Dra den deretter oppå en annen fane.</translation> <translation id="6856809498882026482">Skjul flervalgsmodus</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Del fanen}other{Del fanene}}</translation> <translation id="7129458170538955174">Informasjon om denne butikken er åpnet i halv høyde</translation> <translation id="7151209024774799310">Fjern faner fra gruppen</translation> <translation id="7204204600596740190">Flervalgsmodus</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 956a550..458df9a1 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
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> filă}few{<ph name="TABS_COUNT_MANY" /> file}other{<ph name="TABS_COUNT_MANY" /> de file}}</translation> <translation id="2118649612461486615">Informații magazin</translation> <translation id="2162620598375156287">Acum la <ph name="CURRENT_PRICE" /> pe <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Elimină fila din grup}few{Elimină filele din grup}other{Elimină filele din grup}}</translation> <translation id="2277224997687551299">Editează numele grupului</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Elimină <ph name="TABS_COUNT_ONE" /> filă selectată din grup.}few{Elimină <ph name="TABS_COUNT_MANY" /> file selectate din grup.}other{Elimină <ph name="TABS_COUNT_MANY" /> de file selectate din grup.}}</translation> <translation id="2479148705183875116">Accesează Setările</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Restrânge <ph name="TABS_COUNT_ONE" /> filă.}few{Restrânge grupul de file <ph name="TITLE_OF_GROUP" /> cu <ph name="TABS_COUNT_MANY" /> file.}other{Restrânge grupul de file <ph name="TITLE_OF_GROUP" /> cu <ph name="TABS_COUNT_MANY" /> de file.}}</translation> <translation id="3882834874697329510">Pentru a primi o alertă atunci când scade prețul dintr-o filă deschisă, activează notificările în Setări.</translation> <translation id="3940195383040445971">Urmărește prețurile din file</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Adaugă fila la un grup}few{Grupează filele}other{Grupează filele}}</translation> <translation id="3996880007329611795">Primește notificări</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> file par similare. Vrei să le grupezi?</translation> <translation id="4212246570487010370">Continuă navigarea</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> recenzie)}few{(<ph name="REVIEWS_COUNT_MANY" /> recenzii)}other{(<ph name="REVIEWS_COUNT_MANY" /> de recenzii)}}</translation> <translation id="4850886885716139402">Afișează</translation> <translation id="4870911314065352661">Închizi toate filele?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Închide fila}few{Închide filele}other{Închide filele}}</translation> <translation id="492284538114688557">S-a detectat o scădere de preț</translation> <translation id="5007392906805964215">Examinează</translation> <translation id="5073204694187207510">Ascunde grila pe ecran complet</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Afișează</translation> <translation id="6840760312327750441">Pentru a grupa filele, atinge lung o filă. Apoi trage-o peste o altă filă.</translation> <translation id="6856809498882026482">Ascunde modul de selectare multiplă</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Trimite fila}few{Trimite filele}other{Trimite filele}}</translation> <translation id="7129458170538955174">Informațiile despre magazin deschise la jumătate din înălțime</translation> <translation id="7151209024774799310">Elimină file din grup</translation> <translation id="7204204600596740190">Modul de selectare multiplă</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb index 44d5dc34..d25eb45 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb
@@ -84,6 +84,7 @@ <translation id="753732157349120914">Prepínač kariet</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{<ph name="REVIEWS_COUNT_ONE" /> recenzia od Googlu}few{<ph name="REVIEWS_COUNT_MANY" /> recenzie od Googlu}many{<ph name="REVIEWS_COUNT_MANY" /> reviews from Google}other{<ph name="REVIEWS_COUNT_MANY" /> recenzií od Googlu}}</translation> <translation id="7559245342362162951">Zobraziť karty skupiny v mriežke na celú obrazovku</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{Zdieľať <ph name="TABS_COUNT_ONE" /> vybranú kartu}few{Zdieľať <ph name="TABS_COUNT_MANY" /> vybrané karty}many{Share <ph name="TABS_COUNT_MANY" /> selected tabs}other{Zdieľať <ph name="TABS_COUNT_MANY" /> vybraných kariet}}</translation> <translation id="7792771145871471484">Prezrieť návrhy.</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{Zoskupiť <ph name="TABS_COUNT_ONE" /> vybranú kartu}few{Zoskupiť <ph name="TABS_COUNT_MANY" /> vybrané karty}many{Group <ph name="TABS_COUNT_MANY" /> selected tabs}other{Zoskupiť <ph name="TABS_COUNT_MANY" /> vybraných kariet}}</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Hodnotenie: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> recenzia}few{Hodnotenie: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzie}many{<ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" /> rating, <ph name="REVIEWS_COUNT_MANY" /> reviews}other{Hodnotenie: <ph name="CURRENT_RATING" />/<ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzií}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb index 5b536b4..f6aa321b 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> kartica}one{<ph name="TABS_COUNT_MANY" /> kartica}few{<ph name="TABS_COUNT_MANY" /> kartice}other{<ph name="TABS_COUNT_MANY" /> kartica}}</translation> <translation id="2118649612461486615">Detalji o prodavnici</translation> <translation id="2162620598375156287">Cena je sada <ph name="CURRENT_PRICE" /> na <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Opozovi grupisanje kartice}one{Opozovi grupisanje kartica}few{Opozovi grupisanje kartica}other{Opozovi grupisanje kartica}}</translation> <translation id="2277224997687551299">Izmenite ime grupe</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Uklonite <ph name="TABS_COUNT_ONE" /> izabranu karticu iz grupe.}one{Uklonite <ph name="TABS_COUNT_MANY" /> izabranu karticu iz grupe.}few{Uklonite <ph name="TABS_COUNT_MANY" /> izabrane kartice iz grupe.}other{Uklonite <ph name="TABS_COUNT_MANY" /> izabranih kartica iz grupe.}}</translation> <translation id="2479148705183875116">Idi u Podešavanja</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Skupite <ph name="TABS_COUNT_ONE" /> karticu.}one{Skupite grupu <ph name="TITLE_OF_GROUP" /> sa <ph name="TABS_COUNT_MANY" /> karticom.}few{Skupite grupu <ph name="TITLE_OF_GROUP" /> sa <ph name="TABS_COUNT_MANY" /> kartice.}other{Skupite grupu <ph name="TITLE_OF_GROUP" /> sa <ph name="TABS_COUNT_MANY" /> kartica.}}</translation> <translation id="3882834874697329510">Da biste dobili obaveštenje kada postoji niža cena na otvorenoj kartici, uključite obaveštenja u Podešavanjima.</translation> <translation id="3940195383040445971">Prati cene na karticama</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Grupiši karticu}one{Grupiši kartice}few{Grupiši kartice}other{Grupiši kartice}}</translation> <translation id="3996880007329611795">Obaveštavaj me</translation> <translation id="4133493477912226187">Kartice (<ph name="NUMBER_OF_TABS" />) deluju povezano. Želite li da ih grupišete?</translation> <translation id="4212246570487010370">Nastavite sa pregledanjem</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> recenzija)}one{(<ph name="REVIEWS_COUNT_MANY" /> recenzija)}few{(<ph name="REVIEWS_COUNT_MANY" /> recenzije)}other{(<ph name="REVIEWS_COUNT_MANY" /> recenzija)}}</translation> <translation id="4850886885716139402">Prikaz</translation> <translation id="4870911314065352661">Želite da zatvorite sve kartice?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Zatvori karticu}one{Zatvori kartice}few{Zatvori kartice}other{Zatvori kartice}}</translation> <translation id="492284538114688557">Uočeno je sniženje</translation> <translation id="5007392906805964215">Pregledaj</translation> <translation id="5073204694187207510">Sakrijte prikaz mreže na celom ekranu</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Pokaži mi</translation> <translation id="6840760312327750441">Da biste grupisali kartice, dodirnite karticu i zadržite je. Zatim je prevucite na drugu karticu.</translation> <translation id="6856809498882026482">Sakrijte režim višestrukog izbora</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Deli karticu}one{Deli kartice}few{Deli kartice}other{Deli kartice}}</translation> <translation id="7129458170538955174">Informacije o ovoj prodavnici su otvorene do polovine ekrana</translation> <translation id="7151209024774799310">Ukloni kartice iz grupe</translation> <translation id="7204204600596740190">Režim višestrukog izbora</translation> @@ -80,6 +84,7 @@ <translation id="753732157349120914">Prebacivač kartica</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{<ph name="REVIEWS_COUNT_ONE" /> recenzija iz Google-a}one{<ph name="REVIEWS_COUNT_MANY" /> recenzija iz Google-a}few{<ph name="REVIEWS_COUNT_MANY" /> recenzije iz Google-a}other{<ph name="REVIEWS_COUNT_MANY" /> recenzija iz Google-a}}</translation> <translation id="7559245342362162951">Prikazuje kartice grupe u mreži na celom ekranu</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{Delite <ph name="TABS_COUNT_ONE" /> izabranu karticu}one{Delite <ph name="TABS_COUNT_MANY" /> izabranu karticu}few{Delite <ph name="TABS_COUNT_MANY" /> izabrane kartice}other{Delite <ph name="TABS_COUNT_MANY" /> izabranih kartica}}</translation> <translation id="7792771145871471484">Pregledajte predloge.</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{Dodajte <ph name="TABS_COUNT_ONE" /> izabranu karticu u grupu}one{Dodajte <ph name="TABS_COUNT_MANY" /> izabranu karticu u grupu}few{Dodajte <ph name="TABS_COUNT_MANY" /> izabrane kartice u grupu}other{Dodajte <ph name="TABS_COUNT_MANY" /> izabranih kartica u grupu}}</translation> <translation id="7854360405711302755">{REVIEWS,plural, =1{ Ocena <ph name="CURRENT_RATING" /> od <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_ONE" /> recenzija}one{Ocena <ph name="CURRENT_RATING" /> od <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzija}few{Ocena <ph name="CURRENT_RATING" /> od <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzije}other{Ocena <ph name="CURRENT_RATING" /> od <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> recenzija}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb index e7fed59..7db15b8 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> картица}one{<ph name="TABS_COUNT_MANY" /> картица}few{<ph name="TABS_COUNT_MANY" /> картице}other{<ph name="TABS_COUNT_MANY" /> картица}}</translation> <translation id="2118649612461486615">Детаљи о продавници</translation> <translation id="2162620598375156287">Цена је сада <ph name="CURRENT_PRICE" /> на <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Опозови груписање картице}one{Опозови груписање картица}few{Опозови груписање картица}other{Опозови груписање картица}}</translation> <translation id="2277224997687551299">Измените име групе</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Уклоните <ph name="TABS_COUNT_ONE" /> изабрану картицу из групе.}one{Уклоните <ph name="TABS_COUNT_MANY" /> изабрану картицу из групе.}few{Уклоните <ph name="TABS_COUNT_MANY" /> изабране картице из групе.}other{Уклоните <ph name="TABS_COUNT_MANY" /> изабраних картица из групе.}}</translation> <translation id="2479148705183875116">Иди у Подешавања</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Скупите <ph name="TABS_COUNT_ONE" /> картицу.}one{Скупите групу <ph name="TITLE_OF_GROUP" /> са <ph name="TABS_COUNT_MANY" /> картицом.}few{Скупите групу <ph name="TITLE_OF_GROUP" /> са <ph name="TABS_COUNT_MANY" /> картице.}other{Скупите групу <ph name="TITLE_OF_GROUP" /> са <ph name="TABS_COUNT_MANY" /> картица.}}</translation> <translation id="3882834874697329510">Да бисте добили обавештење када постоји нижа цена на отвореној картици, укључите обавештења у Подешавањима.</translation> <translation id="3940195383040445971">Прати цене на картицама</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Групиши картицу}one{Групиши картице}few{Групиши картице}other{Групиши картице}}</translation> <translation id="3996880007329611795">Обавештавај ме</translation> <translation id="4133493477912226187">Картице (<ph name="NUMBER_OF_TABS" />) делују повезано. Желите ли да их групишете?</translation> <translation id="4212246570487010370">Наставите са прегледањем</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> рецензија)}one{(<ph name="REVIEWS_COUNT_MANY" /> рецензија)}few{(<ph name="REVIEWS_COUNT_MANY" /> рецензије)}other{(<ph name="REVIEWS_COUNT_MANY" /> рецензија)}}</translation> <translation id="4850886885716139402">Приказ</translation> <translation id="4870911314065352661">Желите да затворите све картице?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Затвори картицу}one{Затвори картице}few{Затвори картице}other{Затвори картице}}</translation> <translation id="492284538114688557">Уочено је снижење</translation> <translation id="5007392906805964215">Прегледај</translation> <translation id="5073204694187207510">Сакријте приказ мреже на целом екрану</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Покажи ми</translation> <translation id="6840760312327750441">Да бисте груписали картице, додирните картицу и задржите је. Затим је превуците на другу картицу.</translation> <translation id="6856809498882026482">Сакријте режим вишеструког избора</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Дели картицу}one{Дели картице}few{Дели картице}other{Дели картице}}</translation> <translation id="7129458170538955174">Информације о овој продавници су отворене до половине екрана</translation> <translation id="7151209024774799310">Уклони картице из групе</translation> <translation id="7204204600596740190">Режим вишеструког избора</translation> @@ -80,6 +84,7 @@ <translation id="753732157349120914">Пребацивач картица</translation> <translation id="7545727119051420814">{REVIEWS,plural, =1{<ph name="REVIEWS_COUNT_ONE" /> рецензија из Google-а}one{<ph name="REVIEWS_COUNT_MANY" /> рецензија из Google-а}few{<ph name="REVIEWS_COUNT_MANY" /> рецензије из Google-а}other{<ph name="REVIEWS_COUNT_MANY" /> рецензија из Google-а}}</translation> <translation id="7559245342362162951">Приказује картице групе у мрежи на целом екрану</translation> +<translation id="7699041944097291312">{TABS_COUNT,plural, =1{Делите <ph name="TABS_COUNT_ONE" /> изабрану картицу}one{Делите <ph name="TABS_COUNT_MANY" /> изабрану картицу}few{Делите <ph name="TABS_COUNT_MANY" /> изабране картице}other{Делите <ph name="TABS_COUNT_MANY" /> изабраних картица}}</translation> <translation id="7792771145871471484">Прегледајте предлоге.</translation> <translation id="7838146321400849846">{TABS_COUNT,plural, =1{Додајте <ph name="TABS_COUNT_ONE" /> изабрану картицу у групу}one{Додајте <ph name="TABS_COUNT_MANY" /> изабрану картицу у групу}few{Додајте <ph name="TABS_COUNT_MANY" /> изабране картице у групу}other{Додајте <ph name="TABS_COUNT_MANY" /> изабраних картица у групу}}</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" /> рецензије}other{Оцена <ph name="CURRENT_RATING" /> од <ph name="RATING_BASELINE" />, <ph name="REVIEWS_COUNT_MANY" /> рецензија}}</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb index 3bd0769..ec82229 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ta varaq}other{<ph name="TABS_COUNT_MANY" /> ta varaq}}</translation> <translation id="2118649612461486615">Doʻkon haqida</translation> <translation id="2162620598375156287"><ph name="SOURCE_WEBSITE" /> saytidagi joriy narxi: <ph name="CURRENT_PRICE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Varaqni yechish}other{Varaqlar guruhini yechish}}</translation> <translation id="2277224997687551299">Guruh nomini tahrirlash</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Tanlangan <ph name="TABS_COUNT_ONE" /> ta varaqni guruhdan olib tashlash.}other{Tanlangan <ph name="TABS_COUNT_MANY" /> ta varaqni guruhdan olib tashlash.}}</translation> <translation id="2479148705183875116">Sozlamalarni ochish</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ta varaqni yigʻish.}other{<ph name="TABS_COUNT_MANY" /> varaqli <ph name="TITLE_OF_GROUP" /> guruhini yigʻish.}}</translation> <translation id="3882834874697329510">Ochiq varaqda narx tushganda xabar olish uchun Sozlamalar orqali bildirishnomalarni yoqing.</translation> <translation id="3940195383040445971">Narxlarni varaqlarda kuzatish</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Varaqni guruhlash}other{Varaqlarni guruhlash}}</translation> <translation id="3996880007329611795">Xabardor qolish</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> ta aloqador varaq bor. Ular guruhlansinmi?</translation> <translation id="4212246570487010370">Saytlarni kezishda davom etish</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> ta sharh)}other{(<ph name="REVIEWS_COUNT_MANY" /> ta sharh)}}</translation> <translation id="4850886885716139402">Ko‘rish</translation> <translation id="4870911314065352661">Barcha varaqlar yopilsinmi?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Varaqni yopish}other{Varaqlarni yopish}}</translation> <translation id="492284538114688557">Narx pasayishi aniqlandi</translation> <translation id="5007392906805964215">Tekshirish</translation> <translation id="5073204694187207510">Butun ekranga chiqarilgan jadval shaklini yopish</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Ko‘rsatish</translation> <translation id="6840760312327750441">Varaqlarni guruhlash uchun: bitta varaqni bosib ushlang, keyin uni boshqa varaqning ustiga tortib tashlang.</translation> <translation id="6856809498882026482">Bir nechta variant tanlanadigan rejimni yopish</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Varaqni ulashish}other{Varaqlarni ulashish}}</translation> <translation id="7129458170538955174">Bu doʻkon haqidagi axborot yarim hajmda ochildi</translation> <translation id="7151209024774799310">Varaqlarni guruhdan olib tashlash</translation> <translation id="7204204600596740190">Bir nechta elementni tanlash rejimi</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb index 92c73ea..35a1a39 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb
@@ -13,6 +13,7 @@ <translation id="1869137256605757565">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tab}other{<ph name="TABS_COUNT_MANY" /> tab}}</translation> <translation id="2118649612461486615">Thông tin cửa hàng</translation> <translation id="2162620598375156287">Hiện có giá <ph name="CURRENT_PRICE" /> trên <ph name="SOURCE_WEBSITE" /></translation> +<translation id="22623456902492423">{TABS_COUNT,plural, =1{Huỷ nhóm thẻ}other{Huỷ nhóm các thẻ}}</translation> <translation id="2277224997687551299">Chỉnh sửa tên nhóm</translation> <translation id="228946090561406413">{TABS_COUNT,plural, =1{Xóa <ph name="TABS_COUNT_ONE" /> thẻ đã chọn khỏi nhóm.}other{Xóa <ph name="TABS_COUNT_MANY" /> thẻ đã chọn khỏi nhóm.}}</translation> <translation id="2479148705183875116">Chuyển đến phần Cài đặt</translation> @@ -36,6 +37,7 @@ <translation id="3819916404117584598">{TABS_COUNT,plural, =1{Thu gọn <ph name="TABS_COUNT_ONE" /> thẻ.}other{Thu gọn nhóm thẻ <ph name="TITLE_OF_GROUP" /> có <ph name="TABS_COUNT_MANY" /> thẻ.}}</translation> <translation id="3882834874697329510">Để nhận thông báo khi có ưu đãi giảm giá trong một thẻ đang mở, hãy bật thông báo trong phần Cài đặt.</translation> <translation id="3940195383040445971">Theo dõi giá trên thẻ</translation> +<translation id="3954615705217314756">{TABS_COUNT,plural, =1{Nhóm thẻ}other{Nhóm các thẻ}}</translation> <translation id="3996880007329611795">Nhận thông báo</translation> <translation id="4133493477912226187"><ph name="NUMBER_OF_TABS" /> thẻ có vẻ liên quan đến nhau. Bạn có muốn nhóm các thẻ đó lại không?</translation> <translation id="4212246570487010370">Tiếp tục duyệt web</translation> @@ -44,6 +46,7 @@ <translation id="4788280460033928884">{REVIEWS,plural, =1{(<ph name="REVIEWS_COUNT_ONE" /> bài đánh giá)}other{(<ph name="REVIEWS_COUNT_MANY" /> bài đánh giá)}}</translation> <translation id="4850886885716139402">Xem</translation> <translation id="4870911314065352661">Đóng tất cả các thẻ?</translation> +<translation id="4895402777090717310">{TABS_COUNT,plural, =1{Đóng thẻ}other{Đóng các thẻ}}</translation> <translation id="492284538114688557">Đã phát hiện có mặt hàng giảm giá</translation> <translation id="5007392906805964215">Xem</translation> <translation id="5073204694187207510">Ẩn lưới toàn màn hình</translation> @@ -72,6 +75,7 @@ <translation id="6615455863669487791">Hiển thị cho tôi</translation> <translation id="6840760312327750441">Để nhóm các thẻ, hãy chạm và giữ một thẻ. Sau đó, kéo thẻ đó lên một thẻ khác.</translation> <translation id="6856809498882026482">Ẩn chế độ chọn nhiều thẻ</translation> +<translation id="7100731960740376323">{TABS_COUNT,plural, =1{Chia sẻ thẻ}other{Chia sẻ các thẻ}}</translation> <translation id="7129458170538955174">Thông tin về cửa hàng này đã mở ở nửa dưới của màn hình</translation> <translation id="7151209024774799310">Xóa thẻ khỏi nhóm</translation> <translation id="7204204600596740190">Chế độ chọn nhiều thẻ</translation>
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 ff03416f..d3bdd7e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -985,6 +985,13 @@ mStartSurfaceSupplier.get().setStartSurfaceState( StartSurfaceState.NOT_SHOWN, NewTabPageLaunchOrigin.UNKNOWN); } + + boolean shouldShowRegularOverviewMode = IntentUtils.safeGetBooleanExtra( + intent, IntentHandler.EXTRA_OPEN_REGULAR_OVERVIEW_MODE, false); + if (shouldShowRegularOverviewMode && IntentHandler.wasIntentSenderChrome(intent)) { + mTabModelSelector.selectModel(/*incognito= */ false); + mLayoutManager.showLayout(LayoutType.TAB_SWITCHER, /*animate= */ false); + } } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java index b338027d..2e775a38 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -185,6 +185,10 @@ public static final String EXTRA_OPEN_ADDITIONAL_URLS_IN_TAB_GROUP = "org.chromium.chrome.browser.open_additional_urls_in_tab_group"; + /** Extra specifying to show regular overview mode. */ + public static final String EXTRA_OPEN_REGULAR_OVERVIEW_MODE = + "org.chromium.chrome.browser.open_regular_overview_mode"; + /** * Key to associate a timestamp with an intent. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java index e92c121a..42714de 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.customtabs; +import android.content.Intent; import android.graphics.Rect; import android.text.TextUtils; import android.view.View; @@ -12,6 +13,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; +import org.chromium.base.IntentUtils; import org.chromium.base.jank_tracker.DummyJankTracker; import org.chromium.base.supplier.BooleanSupplier; import org.chromium.base.supplier.ObservableSupplier; @@ -20,6 +22,7 @@ import org.chromium.base.supplier.Supplier; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityTabProvider; +import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.app.reengagement.ReengagementActivity; import org.chromium.chrome.browser.back_press.BackPressManager; import org.chromium.chrome.browser.bookmarks.BookmarkModel; @@ -35,6 +38,7 @@ import org.chromium.chrome.browser.customtabs.features.branding.BrandingController; import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbar; import org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarCoordinator; +import org.chromium.chrome.browser.document.ChromeLauncherActivity; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.flags.ActivityType; import org.chromium.chrome.browser.flags.CachedFeatureFlags; @@ -232,12 +236,18 @@ @Override protected IncognitoReauthCoordinatorFactory getIncognitoReauthCoordinatorFactory() { + Intent showRegularOverviewIntent = new Intent(Intent.ACTION_MAIN); + showRegularOverviewIntent.setClass(mActivity, ChromeLauncherActivity.class); + showRegularOverviewIntent.putExtra(IntentHandler.EXTRA_OPEN_REGULAR_OVERVIEW_MODE, true); + IntentUtils.addTrustedIntentExtras(showRegularOverviewIntent); + return new IncognitoReauthCoordinatorFactory(mActivity, mTabModelSelectorSupplier.get(), mModalDialogManagerSupplier.get(), new IncognitoReauthManager(), new SettingsLauncherImpl(), /*tabSwitcherCustomViewManagerOneshotSupplier= */ null, /*incognitoReauthTopToolbarDelegate= */ null, /*layoutManager=*/null, + /*showRegularOverviewIntent= */ showRegularOverviewIntent, /*isTabbedActivity= */ false); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingAdapter.java index 158c6d2..5815875d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingAdapter.java
@@ -18,6 +18,7 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.sharing.SharingServiceProxy.DeviceInfo; import org.chromium.components.sync.protocol.SharingSpecificFields; +import org.chromium.components.sync_device_info.FormFactor; import org.chromium.ui.widget.ChromeImageView; import java.util.ArrayList; @@ -86,14 +87,12 @@ } private static Drawable getDrawableForDeviceType(Context context, DeviceInfo targetDevice) { - switch (targetDevice.deviceType) { - case TYPE_CROS: - case TYPE_LINUX: - case TYPE_MAC: - case TYPE_WIN: { + // TODO(crbug.com/1368080): Investigate the need to add a tablet device case. + switch (targetDevice.formFactor) { + case FormFactor.DESKTOP: { return AppCompatResources.getDrawable(context, R.drawable.computer_black_24dp); } - case TYPE_PHONE: { + case FormFactor.PHONE: { return AppCompatResources.getDrawable(context, R.drawable.smartphone_black_24dp); } default:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingServiceProxy.java b/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingServiceProxy.java index 2956c23..7db6b05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingServiceProxy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sharing/SharingServiceProxy.java
@@ -9,7 +9,7 @@ import org.chromium.base.annotations.NativeMethods; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.components.sync.protocol.SharingSpecificFields; -import org.chromium.components.sync.protocol.SyncEnums; +import org.chromium.components.sync_device_info.FormFactor; import java.util.ArrayList; @@ -78,17 +78,18 @@ public String guid; public String clientName; - public SyncEnums.DeviceType deviceType; + public @FormFactor int formFactor; public long lastUpdatedTimestampMillis; } @CalledByNative private static void createDeviceInfoAndAppendToList(ArrayList<DeviceInfo> deviceInfo, - String guid, String clientName, int deviceType, long lastUpdatedTimestampMillis) { + String guid, String clientName, @FormFactor int formFactor, + long lastUpdatedTimestampMillis) { DeviceInfo device = new DeviceInfo(); device.guid = guid; device.clientName = clientName; - device.deviceType = SyncEnums.DeviceType.forNumber(deviceType); + device.formFactor = formFactor; device.lastUpdatedTimestampMillis = lastUpdatedTimestampMillis; deviceInfo.add(device); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java index aaf9a4dc..db8b653 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManagerImpl.java
@@ -44,7 +44,6 @@ import org.chromium.components.signin.identitymanager.ConsentLevel; import org.chromium.components.signin.identitymanager.IdentityManager; import org.chromium.components.signin.identitymanager.IdentityMutator; -import org.chromium.components.signin.identitymanager.PrimaryAccountChangeEvent; import org.chromium.components.signin.identitymanager.PrimaryAccountError; import org.chromium.components.signin.metrics.SigninAccessPoint; import org.chromium.components.signin.metrics.SigninReason; @@ -381,58 +380,6 @@ } } - /** - * Implements {@link IdentityManager.Observer} - */ - @Override - public void onPrimaryAccountChanged(PrimaryAccountChangeEvent eventDetails) { - switch (eventDetails.getEventTypeFor(ConsentLevel.SYNC)) { - case PrimaryAccountChangeEvent.Type.SET: - // Simply verify that the request is ongoing (mSignInState != null), as only - // SigninManager should update IdentityManager. This is triggered by the call to - // IdentityMutator.setPrimaryAccount - assert mSignInState != null; - break; - case PrimaryAccountChangeEvent.Type.CLEARED: - // This event can occur in two cases: - // - Syncing account is signed out. User may choose to delete data from UI prompt - // if account is not managed. In this case mSigninOutState is set. - // - RevokeSyncConsent() is called in native code. In this case the user may still - // be signed in with Consentlevel::SIGNIN and just lose sync privileges. - // If the account is managed then the data should be wiped. - // - // TODO(https://crbug.com/1173016): It might be too late to get management status - // here. SyncService should call RevokeSyncConsent/ClearPrimaryAccount in - // SigninManager instead. - if (mSignOutState == null) { - mSignOutState = new SignOutState(null, - getManagementDomain() != null - ? SignOutState.DataWipeAction.WIPE_ALL_PROFILE_DATA - : SignOutState.DataWipeAction.WIPE_SIGNIN_DATA_ONLY); - notifySignOutAllowedChanged(); - } - - // TODO(https://crbug.com/1091858): Remove this after migrating the legacy code that - // uses the sync account before the native is - // loaded. - SigninPreferencesManager.getInstance().setLegacySyncAccountEmail(null); - disableSyncAndWipeData(this::finishSignOut); - break; - case PrimaryAccountChangeEvent.Type.NONE: - if (eventDetails.getEventTypeFor(ConsentLevel.SIGNIN) - == PrimaryAccountChangeEvent.Type.CLEARED) { - if (mSignOutState == null) { - // Don't wipe data as the user is not syncing. - mSignOutState = new SignOutState( - null, SignOutState.DataWipeAction.WIPE_SIGNIN_DATA_ONLY); - notifySignOutAllowedChanged(); - } - disableSyncAndWipeData(this::finishSignOut); - } - break; - } - } - @Override @MainThread public void runAfterOperationInProgress(Runnable runnable) { @@ -498,6 +445,9 @@ // Always use IGNORE_METRIC as Chrome Android has just a single-profile which is // never deleted. SignoutDelete.IGNORE_METRIC); + + notifySignOutAllowedChanged(); + disableSyncAndWipeData(this::finishSignOut); } /** @@ -528,14 +478,14 @@ ? SignOutState.DataWipeAction.WIPE_ALL_PROFILE_DATA : SignOutState.DataWipeAction.WIPE_SIGNIN_DATA_ONLY); - // User data will be wiped in disableSyncAndWipeData(), called from - // onPrimaryAccountChanged(). mIdentityMutator.clearPrimaryAccount(signoutSource, // Always use IGNORE_METRIC for the profile deletion argument. Chrome // Android has just a single-profile which is never deleted upon // sign-out. SignoutDelete.IGNORE_METRIC); + notifySignOutAllowedChanged(); + disableSyncAndWipeData(this::finishSignOut); } /** @@ -716,6 +666,11 @@ Log.i(TAG, "Native signout complete, wiping data (user callback: %s)", mSignOutState.mDataWipeAction); + // TODO(https://crbug.com/1091858): Remove this after migrating the legacy code that + // uses the sync account before the native is + // loaded. + SigninPreferencesManager.getInstance().setLegacySyncAccountEmail(null); + if (mSignOutState.mSignOutCallback != null) { mSignOutState.mSignOutCallback.preWipeData(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java index 6868261c..505d74b2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -578,6 +578,7 @@ mModalDialogManagerSupplier.get(), new IncognitoReauthManager(), new SettingsLauncherImpl(), tabSwitcherCustomViewSupplier, incognitoReauthTopToolbarDelegate, mLayoutManager, + /*showRegularOverviewIntent= */ null, /*isTabbedActivity=*/true); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS index b9fcdf5..2e22e01a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS
@@ -1,4 +1,5 @@ dominickn@chromium.org +eirage@chromium.org hartmanng@chromium.org peconn@chromium.org peter@chromium.org
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/IdentityManagerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninManagerIntegrationTest.java similarity index 84% rename from chrome/android/javatests/src/org/chromium/chrome/browser/signin/IdentityManagerIntegrationTest.java rename to chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninManagerIntegrationTest.java index 2b88250..6b123bcf 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/IdentityManagerIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninManagerIntegrationTest.java
@@ -9,7 +9,6 @@ import androidx.test.filters.MediumTest; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -34,8 +33,6 @@ import org.chromium.components.signin.base.CoreAccountInfo; import org.chromium.components.signin.identitymanager.ConsentLevel; import org.chromium.components.signin.identitymanager.IdentityManager; -import org.chromium.components.signin.identitymanager.IdentityMutator; -import org.chromium.components.signin.metrics.SignoutDelete; import org.chromium.components.signin.metrics.SignoutReason; import org.chromium.content_public.browser.test.NativeLibraryTestUtils; import org.chromium.content_public.browser.test.util.TestThreadUtils; @@ -49,7 +46,7 @@ * These tests initialize the native part of the service. */ @RunWith(BaseJUnit4ClassRunner.class) -public class IdentityManagerIntegrationTest { +public class SigninManagerIntegrationTest { @Rule public final SigninTestRule mSigninTestRule = new SigninTestRule(); @@ -65,8 +62,8 @@ private CoreAccountInfo mTestAccount1; private CoreAccountInfo mTestAccount2; - private IdentityMutator mIdentityMutator; private IdentityManager mIdentityManager; + private SigninManager mSigninManager; @Mock private SigninManager.SignInStateObserver mSignInStateObserverMock; @@ -81,20 +78,12 @@ mSigninTestRule.waitForSeeding(); TestThreadUtils.runOnUiThreadBlocking(() -> { Profile profile = Profile.getLastUsedRegularProfile(); - SigninManagerImpl signinManager = - (SigninManagerImpl) IdentityServicesProvider.get().getSigninManager(profile); - signinManager.addSignInStateObserver(mSignInStateObserverMock); - mIdentityMutator = signinManager.getIdentityMutatorForTesting(); mIdentityManager = IdentityServicesProvider.get().getIdentityManager(profile); + mSigninManager = IdentityServicesProvider.get().getSigninManager(profile); + mSigninManager.addSignInStateObserver(mSignInStateObserverMock); }); } - @After - public void tearDown() { - TestThreadUtils.runOnUiThreadBlocking( - () -> { mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(null); }); - } - @Test @MediumTest public void testUpdateAccountListNoAccountsRegisteredAndNoSignedInUser() { @@ -103,7 +92,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Run test. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(null); + mSigninManager.reloadAllAccountsFromSystem(null); Assert.assertArrayEquals("No account: getAccounts must be empty", new CoreAccountInfo[] {}, mIdentityManager.getAccountsWithRefreshTokens()); @@ -117,7 +106,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Run test. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(null); + mSigninManager.reloadAllAccountsFromSystem(null); Assert.assertArrayEquals("No signed in account: getAccounts must be empty", new CoreAccountInfo[] {}, mIdentityManager.getAccountsWithRefreshTokens()); @@ -131,7 +120,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Run test. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertArrayEquals("Signed in: one account should be available", new CoreAccountInfo[] {mTestAccount1}, @@ -146,7 +135,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Run test. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount2.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount2.getId()); Assert.assertArrayEquals( "Signed in but different account, getAccounts must remain empty", @@ -161,7 +150,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Run one validation. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertArrayEquals("Signed in and one account available", new CoreAccountInfo[] {mTestAccount1}, @@ -173,7 +162,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Re-run validation. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertEquals("Signed in and two accounts available", new HashSet<>(Arrays.asList(mTestAccount1, mTestAccount2)), @@ -190,7 +179,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Run one validation. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertEquals("Signed in and two accounts available", new HashSet<>(Arrays.asList(mTestAccount1, mTestAccount2)), @@ -200,7 +189,7 @@ mSigninTestRule.removeAccountAndWaitForSeeding(TEST_ACCOUNT2); TestThreadUtils.runOnUiThreadBlocking(() -> { - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertArrayEquals( "Only one account available, account2 should not be returned anymore", @@ -217,7 +206,7 @@ mSigninTestRule.addAccountAndWaitForSeeding(TEST_ACCOUNT2); TestThreadUtils.runOnUiThreadBlocking(() -> { - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertEquals("Signed in and two accounts available", new HashSet<>(Arrays.asList(mTestAccount1, mTestAccount2)), @@ -230,7 +219,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Re-validate and run checks. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertArrayEquals("No account available", new CoreAccountInfo[] {}, mIdentityManager.getAccountsWithRefreshTokens()); @@ -245,7 +234,7 @@ mSigninTestRule.addAccountAndWaitForSeeding(TEST_ACCOUNT2); TestThreadUtils.runOnUiThreadBlocking(() -> { - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertEquals("Signed in and two accounts available", new HashSet<>(Arrays.asList(mTestAccount1, mTestAccount2)), @@ -257,7 +246,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Re-validate and run checks. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(null); + mSigninManager.reloadAllAccountsFromSystem(null); Assert.assertArrayEquals("Not signed in and no accounts available", new CoreAccountInfo[] {}, mIdentityManager.getAccountsWithRefreshTokens()); @@ -273,7 +262,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { // Run test. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertEquals("Signed in and two accounts available", new HashSet<>(Arrays.asList(mTestAccount1, mTestAccount2)), @@ -286,7 +275,7 @@ public void testUpdateAccountListNoAccountsRegisteredButSignedIn() { TestThreadUtils.runOnUiThreadBlocking(() -> { // Run test. - mIdentityMutator.reloadAllAccountsFromSystemWithPrimaryAccount(mTestAccount1.getId()); + mSigninManager.reloadAllAccountsFromSystem(mTestAccount1.getId()); Assert.assertArrayEquals("No accounts available", new CoreAccountInfo[] {}, mIdentityManager.getAccountsWithRefreshTokens()); @@ -303,8 +292,7 @@ Assert.assertTrue(mIdentityManager.hasPrimaryAccount(ConsentLevel.SIGNIN)); // Run test. - mIdentityMutator.clearPrimaryAccount( - SignoutReason.SIGNOUT_TEST, SignoutDelete.IGNORE_METRIC); + mSigninManager.signOut(SignoutReason.SIGNOUT_TEST); // Check the account is signed out Assert.assertFalse(mIdentityManager.hasPrimaryAccount(ConsentLevel.SIGNIN)); @@ -328,8 +316,7 @@ Assert.assertTrue(mIdentityManager.hasPrimaryAccount(ConsentLevel.SYNC)); // Run test. - mIdentityMutator.clearPrimaryAccount( - SignoutReason.SIGNOUT_TEST, SignoutDelete.IGNORE_METRIC); + mSigninManager.signOut(SignoutReason.SIGNOUT_TEST); Assert.assertFalse(mIdentityManager.hasPrimaryAccount(ConsentLevel.SIGNIN)); }); @@ -353,8 +340,7 @@ Assert.assertTrue(mIdentityManager.hasPrimaryAccount(ConsentLevel.SYNC)); // Run test. - mIdentityMutator.revokeSyncConsent( - SignoutReason.SIGNOUT_TEST, SignoutDelete.IGNORE_METRIC); + mSigninManager.revokeSyncConsent(SignoutReason.SIGNOUT_TEST, null, false); Assert.assertFalse(mIdentityManager.hasPrimaryAccount(ConsentLevel.SYNC)); Assert.assertTrue(mIdentityManager.hasPrimaryAccount(ConsentLevel.SIGNIN)); @@ -379,8 +365,7 @@ Assert.assertTrue(mIdentityManager.hasPrimaryAccount(ConsentLevel.SYNC)); // Run test. - mIdentityMutator.revokeSyncConsent( - SignoutReason.SIGNOUT_TEST, SignoutDelete.IGNORE_METRIC); + mSigninManager.revokeSyncConsent(SignoutReason.SIGNOUT_TEST, null, false); Assert.assertFalse(mIdentityManager.hasPrimaryAccount(ConsentLevel.SIGNIN)); });
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java index 2aeb3bf9..a1a343b0 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerImplTest.java
@@ -13,6 +13,7 @@ import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -25,6 +26,7 @@ import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -232,17 +234,14 @@ // Trigger the sign out flow! mSigninManager.signOut(SignoutReason.SIGNOUT_TEST); - // PrimaryAccountChanged should be called *before* clearing any account data. + // The primary account should be cleared *before* clearing any account data. // For more information see crbug.com/589028. - verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); - - // Simulate native callback to trigger clearing of account data. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.NONE)); + InOrder inOrder = inOrder(mNativeMock, mIdentityMutator); + inOrder.verify(mIdentityMutator) + .clearPrimaryAccount(eq(SignoutReason.SIGNOUT_TEST), anyInt()); // Sign-out should only clear the profile when the user is managed. - verify(mNativeMock).wipeProfileData(eq(NATIVE_SIGNIN_MANAGER), any()); + inOrder.verify(mNativeMock).wipeProfileData(eq(NATIVE_SIGNIN_MANAGER), any()); verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); } @@ -253,17 +252,14 @@ // Trigger the sign out flow! mSigninManager.signOut(SignoutReason.SIGNOUT_TEST); - // PrimaryAccountChanged should be called *before* clearing any account data. + // The primary account should be cleared *before* clearing any account data. // For more information see crbug.com/589028. - verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); - - // Simulate native callback to trigger clearing of account data. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.CLEARED)); + InOrder inOrder = inOrder(mNativeMock, mIdentityMutator); + inOrder.verify(mIdentityMutator) + .clearPrimaryAccount(eq(SignoutReason.SIGNOUT_TEST), anyInt()); // Sign-out should only clear the profile when the user is managed. - verify(mNativeMock).wipeProfileData(eq(NATIVE_SIGNIN_MANAGER), any()); + inOrder.verify(mNativeMock).wipeProfileData(eq(NATIVE_SIGNIN_MANAGER), any()); verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); } @@ -271,19 +267,16 @@ public void signOutNonSyncingAccountFromJavaWithNullDomain() { mSigninManager.signOut(SignoutReason.SIGNOUT_TEST); - // PrimaryAccountChanged should be called *before* clearing any account data. + // The primary account should be cleared *before* clearing any account data. // For more information see crbug.com/589028. - verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); - - // Simulate native callback to trigger clearing of account data. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.NONE)); + InOrder inOrder = inOrder(mNativeMock, mIdentityMutator); + inOrder.verify(mIdentityMutator) + .clearPrimaryAccount(eq(SignoutReason.SIGNOUT_TEST), anyInt()); // Sign-out should only clear the service worker cache when the user is neither managed or // syncing. verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock).wipeGoogleServiceWorkerCaches(eq(NATIVE_SIGNIN_MANAGER), any()); + inOrder.verify(mNativeMock).wipeGoogleServiceWorkerCaches(eq(NATIVE_SIGNIN_MANAGER), any()); } @Test @@ -295,19 +288,16 @@ mSigninManager.signOut(SignoutReason.SIGNOUT_TEST); - // PrimaryAccountCleared should be called *before* clearing any account data. + // The primary account should be cleared *before* clearing any account data. // For more information see crbug.com/589028. - verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); - - // Simulate native callback to trigger clearing of account data. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.CLEARED)); + InOrder inOrder = inOrder(mNativeMock, mIdentityMutator); + inOrder.verify(mIdentityMutator) + .clearPrimaryAccount(eq(SignoutReason.SIGNOUT_TEST), anyInt()); // Sign-out should only clear the service worker cache when the user has decided not to // wipe data. verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock).wipeGoogleServiceWorkerCaches(eq(NATIVE_SIGNIN_MANAGER), any()); + inOrder.verify(mNativeMock).wipeGoogleServiceWorkerCaches(eq(NATIVE_SIGNIN_MANAGER), any()); } @Test @@ -325,10 +315,6 @@ mSigninManager.signOut(SignoutReason.SIGNOUT_TEST); - // Simulate native callback to trigger clearing of account data. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.CLEARED)); - ArgumentCaptor<Runnable> callback = ArgumentCaptor.forClass(Runnable.class); verify(mNativeMock) .wipeGoogleServiceWorkerCaches(eq(NATIVE_SIGNIN_MANAGER), callback.capture()); @@ -349,57 +335,18 @@ mSigninManager.signOut(SignoutReason.SIGNOUT_TEST, null, true); - // PrimaryAccountCleared should be called *before* clearing any account data. + // The primary account should be cleared *before* clearing any account data. // For more information see crbug.com/589028. - verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); - - // Simulate native callback to trigger clearing of account data. - // Not possible to wipe data if sync account is not cleared. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.CLEARED)); + InOrder inOrder = inOrder(mNativeMock, mIdentityMutator); + inOrder.verify(mIdentityMutator) + .clearPrimaryAccount(eq(SignoutReason.SIGNOUT_TEST), anyInt()); // Sign-out should only clear the profile when the user is syncing and has decided to // wipe data. - verify(mNativeMock).wipeProfileData(eq(NATIVE_SIGNIN_MANAGER), any()); + inOrder.verify(mNativeMock).wipeProfileData(eq(NATIVE_SIGNIN_MANAGER), any()); verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); } - @Test - public void signOutNonSyncingAccountFromNative() { - // Simulate native initiating the sign-out. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.NONE)); - - // Sign-out should only clear the service worker cache when the user is not syncing. - verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock).wipeGoogleServiceWorkerCaches(eq(NATIVE_SIGNIN_MANAGER), any()); - } - - @Test - public void signOutSyncingAccountFromNativeWithManagedDomain() { - when(mNativeMock.getManagementDomain(NATIVE_SIGNIN_MANAGER)).thenReturn("TestDomain"); - - // Simulate native initiating the sign-out. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.CLEARED)); - - // Turning off sync should only clear the profile data when the account is managed. - verify(mNativeMock).wipeProfileData(eq(NATIVE_SIGNIN_MANAGER), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); - } - - @Test - public void signOutSyncingAccountFromNativeWithNullDomain() { - // Simulate native initiating the sign-out. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.CLEARED)); - - // Turning off sync should only clear service worker caches when the account is not managed. - verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock).wipeGoogleServiceWorkerCaches(eq(NATIVE_SIGNIN_MANAGER), any()); - } - // TODO(crbug.com/1294761): add test for revokeSyncConsentFromJavaWithManagedDomain() and // revokeSyncConsentFromJavaWipeData() - this requires making the BookmarkModel mockable in // SigninManagerImpl. @@ -413,19 +360,16 @@ mSigninManager.revokeSyncConsent(SignoutReason.SIGNOUT_TEST, callback, false); - // PrimaryAccountChanged should be called *before* clearing any account data. + // The primary account should be cleared *before* clearing any account data. // For more information see crbug.com/589028. - verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); - - // Simulate native callback to trigger clearing of account data. - mIdentityManager.onPrimaryAccountChanged(new PrimaryAccountChangeEvent( - PrimaryAccountChangeEvent.Type.CLEARED, PrimaryAccountChangeEvent.Type.NONE)); + InOrder inOrder = inOrder(mNativeMock, mIdentityMutator); + inOrder.verify(mIdentityMutator) + .revokeSyncConsent(eq(SignoutReason.SIGNOUT_TEST), anyInt()); // Disabling sync should only clear the service worker cache when the user is neither // managed or syncing. verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any()); + inOrder.verify(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any()); } @Test @@ -471,9 +415,10 @@ verify(mIdentityMutator) .clearPrimaryAccount( SignoutReason.USER_DELETED_ACCOUNT_COOKIES, SignoutDelete.IGNORE_METRIC); - // Sign-out triggered by wiping account cookies shouldn't wipe data. + + // Sign-out triggered by wiping account cookies should only wipe service worker caches. verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); + verify(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any()); } @Test @@ -506,9 +451,9 @@ verify(mIdentityMutator) .clearPrimaryAccount( SignoutReason.USER_DELETED_ACCOUNT_COOKIES, SignoutDelete.IGNORE_METRIC); - // Sign-out triggered by wiping account cookies shouldn't wipe data. + // Sign-out triggered by wiping account cookies should only wipe service worker caches. verify(mNativeMock, never()).wipeProfileData(anyLong(), any()); - verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any()); + verify(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any()); } @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/OWNERS index bb57885e..7b6517c 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/OWNERS +++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/OWNERS
@@ -1,3 +1 @@ -hanxi@chromium.org - file://chrome/android/java/src/org/chromium/chrome/browser/webapps/OWNERS
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt index 7da4a69..34625171 100644 --- a/chrome/android/profiles/newest.txt +++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@ -chromeos-chrome-amd64-108.0.5359.5_rc-r1-merged.afdo.bz2 +chromeos-chrome-amd64-108.0.5359.6_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 6093fc1..08cbde6a 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -419,6 +419,7 @@ <translation id="1397594434718759194">Jy is by Chrome aangemeld op hierdie toestelle en daarom kan jy hulle as sekuriteitsleutels gebruik.</translation> <translation id="1398853756734560583">Maak groot</translation> <translation id="139911022479327130">Ontsluit jou foon en bevestig dat dit jy is</translation> +<translation id="1401216725754314428">Kom in ’n nuwe oortjie meer te wete oor verwante werwe</translation> <translation id="1401308693935339022">Gebruik ligging. Laat programme en dienste met liggingtoestemming toe om hierdie toestel se ligging te gebruik. Google kan van tyd tot tyd liggingdata insamel en hierdie data op 'n anonieme wyse gebruik om liggingakkuraatheid en ligginggegronde dienste te verbeter.</translation> <translation id="1403222014593521787">Kan nie aan die instaanbediener koppel nie.</translation> <translation id="1405779994569073824">Omgeval.</translation> @@ -7677,6 +7678,7 @@ <translation id="820568752112382238">Mees besoekte werwe</translation> <translation id="8206745257863499010">Blues</translation> <translation id="8206859287963243715">Sellulêr</translation> +<translation id="8208188204689616705">Hierdie werwe is in ’n groep wat deur <ph name="FPS_OWNER" /> gedefinieer is. Werwe in ’n groep kan jou aktiwiteit in die groep sien.</translation> <translation id="8208216423136871611">Moenie stoor nie</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Nuwe kennisgewing}other{# nuwe kennisgewings}}</translation> <translation id="821119981794423735">Kies ’n CSV-lêer om wagwoorde vir <ph name="USER_EMAIL" /> in Google Wagwoordbestuurder in te voer</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 9bd57cf..d7b68f3 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1253,6 +1253,7 @@ <translation id="2135787500304447609">&ከቆመበት ቀጥል</translation> <translation id="2136372518715274136">አዲስ የይለፍ ቃል ያስገቡ</translation> <translation id="2136476978468204130">ያስገቡት የይለፍ ሐረግ ትክክል አይደለም</translation> +<translation id="2137128126782078222">ከ<ph name="WEBSITE" /> የሚመጡ ማሳወቂያዎችን አትፍቀድ</translation> <translation id="2137891579555018930">ፈቃድን በመጠበቅ ላይ...</translation> <translation id="2139919072249842737">አዝራርን አቀናብር</translation> <translation id="2140788884185208305">የባትሪ ጤንነት</translation> @@ -2491,6 +2492,7 @@ <translation id="3281892622610078515">የሚገለሉ ፋይሎች እና ፕሮግራሞች፦</translation> <translation id="3282210178675490297">አንድ ትር ለ<ph name="APP_NAME" /> በማጋራት ላይ</translation> <translation id="3285322247471302225">አዲስ &ትር</translation> +<translation id="3285500645985761267">ተዛማጅ ጣቢያዎች በቡድኑ ውስጥ ያለዎትን እንቅስቃሴ እንዲመለከቱ ይፍቀዱ</translation> <translation id="328571385944182268">የእርስዎን የይለፍ ቃላት ይቀመጡ?</translation> <translation id="3288047731229977326">በገንቢ ሁኔታ የሚሄዱ ጥያዎች የእርስዎን ኮምፒውተር ሊጎዱ ይችላሉ። እርስዎ ገንቢ ካልሆኑ ደህንነትዎን ለማረገገጥ በገንቢ ሁኔታ የሚሄዱ ቅጥያዎችን ማሰናከል አለብዎ።</translation> <translation id="3289668031376215426">ራስ-ሰር ዓቢይ ሆሄ ማድረጊያ</translation> @@ -2765,6 +2767,7 @@ <translation id="3541823293333232175">ተመድቧል</translation> <translation id="3543393733900874979">ዝማኔ አልተሳካም (ስህተት፦ <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">የX9.62 ECDSA ፊርማ በSHA-512</translation> +<translation id="3544058026430919413">አንድ ኩባንያ በቡድኑ ውስጥ ያለዎትን እንቅስቃሴ ለማጋራት ኩኪዎችን መጠቀም የሚችሉ የጣቢያዎች ቡድንን ሊገልጽ ይችላል። ይህ ማንነት የማያሳውቅ ውስጥ ጠፍቷል።</translation> <translation id="3544879808695557954">የተጠቃሚ ስም (አማራጭ)</translation> <translation id="354602065659584722">ጎጂ ሶፍትዌር ተወግዷል</translation> <translation id="3547954654003013442">የተኪ ቅንብሮች</translation> @@ -2904,6 +2907,7 @@ <translation id="3681548574519135185">የትኩረት ቀለበት</translation> <translation id="3683524264665795342">የ<ph name="APP_NAME" /> ማያ ገጽ ማጋራት ጥያቄ</translation> <translation id="3685598397738512288">የLinux ዩኤስቢ ምርጫዎች</translation> +<translation id="3687598459967813435">ሁልጊዜ ከ<ph name="WEBSITE" /> የሚመጡ ማሳወቂያዎችን ፍቀድ</translation> <translation id="368789413795732264">ይህን ፋይል ለመጻፍ በመሞከር ላይ ሳለ ስህተት ነበር፦ <ph name="ERROR_TEXT" />።</translation> <translation id="3688507211863392146">በመተግበሪያው ውስጥ በሚከፍቷቸው ፋይሎች እና አቃፊዎች ላይ ይጽፋል</translation> <translation id="3688526734140524629">ሰርጥ ቀይር</translation> @@ -4062,6 +4066,7 @@ <translation id="4779766576531456629">የኢሲም የተንቀሳቃሽ ስልክ አውታረ መረብን ዳግም ይሰይሙ</translation> <translation id="4780321648949301421">ገጽ አስቀምጥ እንደ…</translation> <translation id="4781443161433589743">በChrome በጣም ጠንካራው ደህንነት ላይ ነዎት</translation> +<translation id="4781584184731045253">ውሂብ እና ፈቃዶችን አጽዳ</translation> <translation id="4782861709165039462">በመሣሪያዎች ሃርድዌር መቀየሪያ አማካኝነት ሁሉም ማይክሮፎኖች ተሰናክለዋል</translation> <translation id="4785719467058219317">በዚህ ድር ጣቢያ ያልተመዘገበ የደህንነት ቁልፍ እየተጠቀሙ ነው</translation> <translation id="4785914069240823137">ከርክምን ሰርዝ</translation> @@ -4743,6 +4748,7 @@ <translation id="5449551289610225147">ልክ ያልኾነ የይለፍ ቃል</translation> <translation id="5449588825071916739">ለሁሉም ትሮች ዕልባት አብጅ</translation> <translation id="5449716055534515760">&መስኮት ዝጋ</translation> +<translation id="545133051331995777">ምንም የአውታረ መረብ ግንኙነት የለም</translation> <translation id="5452446625764825792">አሁን የስልክዎን የቅርብ ጊዜ ፎቶዎች፣ ሚዲያ እና መተግበሪያዎች መመልከት ይችላሉ</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (ከመስመር ውጭ ይሰራል)</translation> <translation id="5454166040603940656">ከ<ph name="PROVIDER" /> ጋር</translation> @@ -4786,6 +4792,7 @@ <translation id="5487521232677179737">ውሂብን አጽዳ</translation> <translation id="5488093641312826914">«<ph name="COPIED_ITEM_NAME" />» ተቀድቷል</translation> <translation id="5488508217173274228">የስምረት ምስጠራ አማራጮች</translation> +<translation id="5489077378642700219">ከ<ph name="WEBSITE" /> የሚመጡ ማሳወቂያዎችን አትፍቀድ ነገር ግን በኋላ ጠይቅ</translation> <translation id="5489435190927933437">የተቀመጡ የይለፍ ቃላት ለ<ph name="DOMAIN" /></translation> <translation id="5490721031479690399">የብሉቱዝ መሣሪያን ግንኙነት አቋርጥ</translation> <translation id="5490798133083738649">Linux የእርስዎን ማይክሮፎን እንዲደርስ ይፍቀዱለት</translation> @@ -5124,6 +5131,7 @@ <translation id="5805697420284793859">የWindow አስተዳዳሪ</translation> <translation id="5806447147478173900">በሚታዩት ጣቢያዎች ስራ ላይ የዋለው ጠቅላላ ማከማቻ፦ <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (ነባሪ)</translation> +<translation id="5809835394668218762">ለ<ph name="WEBSITE" /> ተጨማሪ እርምጃዎች</translation> <translation id="5810603387504252966">chrome://flags ውስጥ #borealis-enabled መንቃት አለበት</translation> <translation id="5810809306422959727">ይህ መለያ ለወላጅ መቆጣጠሪያዎች ብቁ አይደለም</translation> <translation id="5811614940486072060">ይህ ፋይል በተለምዶ የሚወርድ አይደለም፣ እና አደገኛ ሊሆን ይችላል</translation> @@ -5138,6 +5146,7 @@ <translation id="5826395379250998812">የእርስዎን <ph name="DEVICE_TYPE" /> ከስልክዎ ጋር ያገናኙት። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="5826993284769733527">ከፊል ብርሃን አሳላፊ</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">በተመሳሳይ ቡድን ውስጥ ያሉ ጣቢያዎችን አሳይ</translation> <translation id="5827733057563115968">የቀጣይ ቃል ግምት</translation> <translation id="5828545842856466741">መገለጫ አክል...</translation> <translation id="5828633471261496623">በማተም ላይ...</translation> @@ -5253,6 +5262,7 @@ <translation id="5927232971138258197">ይህ ቅጥያ <ph name="HOST" />ን ማንበብ እና መለወጥ ይችላል</translation> <translation id="592740088639760830">ይህንን መያዣ ያቁሙ</translation> <translation id="592880897588170157">በChrome ውስጥ በራስ-ሰር ከመክፈት ይልቅ የፒዲኤፍ ፋይሎችን አውርድ</translation> +<translation id="5928969282301718193">ለአሁኑ ሁሉም ተከናውኗል</translation> <translation id="592919310198008711">ቅጥያውን ጠቅ ሳደርግ</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> የእርስዎን <ph name="DEVICE_TYPE" /> ወዲያውኑ እንዲያዘምኑት ይፈልግብዎታል።</translation> <translation id="5932224571077948991">ጣቢያ ረባሽ ወይም አሳሳች ማስታወቂያዎችን ያሳያል</translation> @@ -5427,6 +5437,7 @@ <translation id="6087746524533454243">የአሳሹን ስለ ገጽ እየፈለጉ ነው? ይጎብኙ</translation> <translation id="6087960857463881712">ግሩም ፊት</translation> <translation id="608912389580139775">ይህን ገጽ ወደ የንባብ ዝርዝርዎ ለማከል የዕልባት አዶውን ጠቅ ያድርጉ</translation> +<translation id="6091116443517744502">እባክዎ የበይነመረብ ግንኙነትዎን ይፈትሹት እና እንደገና ይሞክሩ</translation> <translation id="6091761513005122595">አጋራ በተሳካ ሁኔታ ተፈናጥጧል።</translation> <translation id="6093803049406781019">መገለጫን አጥፋ</translation> <translation id="6093888419484831006">ዝማኔን በመሰረዝ ላይ...</translation> @@ -6093,6 +6104,7 @@ <translation id="6736243959894955139">አድራሻ</translation> <translation id="6737393581255281855">እንዲታይ የተደረገው ውሂብ ይጽዳ?</translation> <translation id="6737663862851963468">የKerberos ቲኬትን ያስወግዱ</translation> +<translation id="6738180164164974883">የሦስተኛ ወገን ኩኪዎችን ለማቀናበር ፍቀድ</translation> <translation id="6738430949033571771">የመለያ ትክክለኛነትን በማረጋገጥ ላይ</translation> <translation id="6739923123728562974">የዴስክቶፕ አቋራጭን አሳይ</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> ለአፍታ ቆሟል</translation> @@ -6290,6 +6302,7 @@ <translation id="691106080621596509">ይህ በ<ph name="SITE_GROUP_NAME" />፣ በእሱ ስር ያሉ ማናቸውም ጣቢያዎች እና በተጫነ መተግበሪያው የተከማቹ ሁሉንም ውሂብ እና ኩኪዎች ያጠፋል</translation> <translation id="6911734910326569517">የማህደረ ትውስታ አሻራ</translation> <translation id="6912007319859991306">የተንቀሳቃሽ ስልክ ሲም ፒን</translation> +<translation id="6912380255120084882">የተለየ መሣሪያ ይሞክሩ</translation> <translation id="691289340230098384">የመግለጫ ጽሁፍ ምርጫዎች</translation> <translation id="6914783257214138813">የእርስዎ የይለፍ ቃላት ወደ ውጭ የተላከውን ፋይልን መመልከት ለሚችል ማንኛውም ሰው የሚታዩ ይሆናሉ።</translation> <translation id="6916590542764765824">ቅጥያዎችን አስተዳድር</translation> @@ -6602,6 +6615,7 @@ <translation id="7222204278952406003">Chrome ነባሪው አሳሽዎ ነው</translation> <translation id="7222232353993864120">ኢሜይል አድራሻ</translation> <translation id="7222235798733126207">በጣቢያዎች መካከል የተገደበ ማጋራት</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 ጣቢያ በ<ph name="FPS_OWNER" /> ቡድን ውስጥ}one{{MEMBERS} ጣቢያ በ<ph name="FPS_OWNER" /> ቡድን ውስጥ}other{{MEMBERS} ጣቢያዎች በ<ph name="FPS_OWNER" /> ቡድን ውስጥ}}</translation> <translation id="7225082563376899794">የይለፍ ቃላትን በሚሞሉበት ጊዜ Windows Helloን ይጠቀሙ</translation> <translation id="7225179976675429563">የአውታረ መረብ አይነት ይጎድላል</translation> <translation id="7227458944009118910">ከዚህ በታች የተዘረዘሩት መተግበሪያዎች የፕሮቶኮል አገናኞችንም ማስተናገድ ይችላሉ። ሌሎች መተግበሪያዎች ፈቃድ ይጠይቃሉ።</translation> @@ -7115,6 +7129,7 @@ <translation id="7709152031285164251">አልተሳካም - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Cast...</translation> <translation id="7711900714716399411">ስልክዎን ከኮምፒውተርዎ ጋር ለማገናኘት የዩኤስቢ ገመድ ይጠቀሙ። ስልክዎ ቀድሞ ከተገናኘ ነቅለው መልሰው ይሰኩት።</translation> +<translation id="7711968363685835633">ግላዊነትን የተላበሱ ልወጣዎችን እና የአስተያየት ጥቆማዎችን እንዲሁም የተጠቃሚ መዝገበ ቃላትን አሰናክል</translation> <translation id="7712739869553853093">የህትመት ቅድመ-ዕይታ መገናኛ</translation> <translation id="7714307061282548371">ከ<ph name="DOMAIN" /> የመጡ ኩኪዎች ተፈቅደዋል</translation> <translation id="7714464543167945231">ሰርቲፊኬት</translation> @@ -7187,6 +7202,7 @@ <translation id="7768770796815395237">ለውጥ</translation> <translation id="7768784765476638775">ለመናገር-ይምረጡ</translation> <translation id="7769748505895274502">በቅርቡ የተዘጉትን ሰብስብ</translation> +<translation id="7770072242481632881">የጎን ፓነል መራጭ</translation> <translation id="7770406201819593386">የChromeOS Flex የምርመራ ሙከራዎችን ያሂዱ።</translation> <translation id="7770450735129978837">የመዳፊት ቀኝ ጠቅታ</translation> <translation id="7770612696274572992">ምስል ከሌላ መሣሪያ ተቀድቷል</translation> @@ -7828,6 +7844,7 @@ <translation id="8353683614194668312">ይህንን ማድረግ ይችላል፦</translation> <translation id="8354034204605718473">የልጅዎ ፒን ታክሏል</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">ይህን መሣሪያ አስቀድመው አስመዝግበዋል። ዳግም ማስመዝገብ አያስፈልገዎትም።</translation> <translation id="8357388086258943206">Linuxን በመጫን ላይ ስህተት</translation> <translation id="8358685469073206162">ገጹ ዳግም ይጀምር?</translation> <translation id="8358912028636606457">የትር ኦዲዮን Cast ማድረግ በዚህ መሣሪያ ላይ አይደገፍም።</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 3828f64..65c5959 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1875,6 +1875,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">تم إيقاف المستخدمين تحت الإشراف بواسطة المشرف.</translation> <translation id="2722540561488096675">سيتم إيقاف تشغيل جهازك في غضون <ph name="TIME_LEFT" />. عليك إزالة جهاز USB قبل تشغيل جهازك مرة أخرى. بعد ذلك، يمكنك بدء استخدام <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">المعرّف: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">سجلات WebRTC</translation> <translation id="272488616838512378">تحويل الوحدات</translation> <translation id="2725200716980197196">تمت استعادة اتصال الشبكة</translation> @@ -3035,6 +3036,7 @@ <translation id="3828029223314399057">بحث في الإشارات المرجعية</translation> <translation id="3828953470056652895">لقد قرأت <ph name="BEGIN_LINK1" />بنود خدمة Google<ph name="END_LINK1" /> و<ph name="BEGIN_LINK2" />بنود الخدمة الإضافية لكلٍّ من متصفّح Google Chrome ونظام التشغيل Chrome<ph name="END_LINK2" /> و<ph name="BEGIN_LINK3" />بنود خدمة Google Play<ph name="END_LINK3" /> وأوافق عليها.</translation> <translation id="3829765597456725595">خادم مشاركة الملفات عبر بروتوكول SMB</translation> +<translation id="3830268140528557982">على <ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{أعاد مشرفك تفعيل إضافة واحدة يُحتمل أن تكون ضارة.}zero{أعاد مشرفك تفعيل {NUM_EXTENSIONS} إضافة يُحتمل أن تكون ضارة.}two{أعاد مشرفك تفعيل إضافتَين ({NUM_EXTENSIONS}) يُحتمل أن تكونا ضارتَين.}few{أعاد مشرفك تفعيل {NUM_EXTENSIONS} إضافات يُحتمل أن تكون ضارة.}many{أعاد مشرفك تفعيل {NUM_EXTENSIONS} إضافة يُحتمل أن تكون ضارة.}other{أعاد مشرفك تفعيل {NUM_EXTENSIONS} إضافة يُحتمل أن تكون ضارة.}}</translation> <translation id="3831436149286513437">إقتراحات بحث Google Drive</translation> <translation id="3834728400518755610">يتطلب تغيير إعدادات الميكروفون إيقاف تشغيل نظام التشغيل Linux. ويجب إيقاف نظام التشغيل Linux للمتابعة.</translation> @@ -5137,6 +5139,7 @@ <translation id="5884474295213649357">علامة التبويب هذه متصلة بجهاز USB.</translation> <translation id="5885314688092915589">ستدير مؤسستك هذا الملف الشخصي</translation> <translation id="5886009770935151472">إصبع 1</translation> +<translation id="5886112770923972514">الاتصال بالأجهزة القريبة التي تستخدم ميزة "الإقران السريع" وضبط إعداداتها بسرعة</translation> <translation id="5886384907280980632">الإيقاف الآن</translation> <translation id="5889282057229379085">أقصى عدد من المراجع المصدقة المتوسطة (CA): <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">شبكات Wi-Fi المفضَّلة</translation> @@ -7710,6 +7713,7 @@ <translation id="8338952601723052325">الموقع الإلكتروني للمطوّر</translation> <translation id="833986336429795709">لفتح هذا الرابط، اختر أحد التطبيقات.</translation> <translation id="8340547030807793004">مزيد من الإجراءات لجهاز <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{مراجعة <ph name="BEGIN_BOLD" />موقع إلكتروني واحد<ph name="END_BOLD" /> أرسل الكثير من الإشعارات مؤخرًا}zero{مراجعة <ph name="BEGIN_BOLD" />{NUM_SITES} موقع إلكتروني<ph name="END_BOLD" /> أرسلت الكثير من الإشعارات مؤخرًا}two{مراجعة <ph name="BEGIN_BOLD" />موقعَين ({NUM_SITES}) إلكترونيَّين<ph name="END_BOLD" /> أرسلا الكثير من الإشعارات مؤخرًا}few{مراجعة <ph name="BEGIN_BOLD" />{NUM_SITES} مواقع إلكترونية<ph name="END_BOLD" /> أرسلت الكثير من الإشعارات مؤخرًا}many{مراجعة <ph name="BEGIN_BOLD" />{NUM_SITES} موقعًا إلكترونيًا<ph name="END_BOLD" /> أرسلت الكثير من الإشعارات مؤخرًا}other{مراجعة <ph name="BEGIN_BOLD" />{NUM_SITES} موقع إلكتروني<ph name="END_BOLD" /> أرسلت الكثير من الإشعارات مؤخرًا}}</translation> <translation id="8342221978608739536">لم أحاول</translation> <translation id="8342861492835240085">اختيار مجموعة</translation> <translation id="8345848587667658367">يمكنك الآن الاطّلاع على أحدث الصور والوسائط والإشعارات والتطبيقات المتوفّرة على هاتفك</translation> @@ -8696,6 +8700,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">إنشاء اتصال آمن...</translation> <translation id="996803490569799917">مشاهدة ذكريات أحبائك وغير ذلك</translation> +<translation id="997143476478634194">ستتّبِع المواقع الإلكترونية هذا الإعداد تلقائيًا عند زيارتك لها. ترسل المواقع الإلكترونية عادةً الإشعارات لإعلامك بالأخبار العاجلة أو رسائل المحادثة.</translation> <translation id="99731366405731005">يُرجى تفعيل <ph name="LINK1_BEGIN" />مزامنة Chrome<ph name="LINK1_END" /> لاستخدام ميزة "مزامنة الواي فاي". <ph name="LINK2_BEGIN" />مزيد من المعلومات<ph name="LINK2_END" /></translation> <translation id="998747458861718449">ف&حص</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index a1bdfe3..a231e4c 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1247,6 +1247,7 @@ <translation id="2135787500304447609">&ৰখোৱাৰ পৰা আৰম্ভ কৰক</translation> <translation id="2136372518715274136">নতুন পাছৱৰ্ড দিয়ক</translation> <translation id="2136476978468204130">আপুনি দিয়া পাছফ্রেজটো ভুল</translation> +<translation id="2137128126782078222"><ph name="WEBSITE" />ৰ পৰা জাননী লাভৰ অনুমতি নিদিব</translation> <translation id="2137891579555018930">অনুমতিৰ বাবে অপেক্ষা কৰি থকা হৈছে...</translation> <translation id="2139919072249842737">ছেট আপ বুটাম</translation> <translation id="2140788884185208305">বেটাৰীৰ অৱস্থা</translation> @@ -2478,6 +2479,7 @@ <translation id="3281892622610078515">পৃথক কৰিবলগীয়া ফাইল আৰু প্ৰ’গ্ৰামসমূহ:</translation> <translation id="3282210178675490297"><ph name="APP_NAME" />লৈ এটা টেব শ্বেয়াৰ কৰি থকা হৈছে</translation> <translation id="3285322247471302225">নতুন &টেব</translation> +<translation id="3285500645985761267">জড়িত হৈ থকা ছাইটসমূহক গোটত আপুনি কৰা কাৰ্যকলাপ চাবলৈ অনুমতি দিয়ক</translation> <translation id="328571385944182268">আপোনাৰ পাছৱৰ্ডসমূহ ছেভ কৰিবনে?</translation> <translation id="3288047731229977326">বিকাশকর্তাৰ ম’ড চলি থকা এক্সটেনশ্বনসমূহে আপোনাৰ কম্পিউটাৰৰ ক্ষতি কৰিব পাৰে। যদি আপুনি কোনো বিকাশকর্তা নহয় তেন্তে আপুনি সুৰক্ষিত হৈ থাকিবলৈ বিকাশকর্তাৰ ম’ডত থকা এক্সটেনশ্বনসমূহ অক্ষম কৰা উচিত।</translation> <translation id="3289668031376215426">স্বয়ং-বৰফলাকৰণ</translation> @@ -2752,6 +2754,7 @@ <translation id="3541823293333232175">আবণ্টন কৰা হৈছে</translation> <translation id="3543393733900874979">আপডে'ট কৰিব পৰা নগ'ল (আসোঁৱাহ: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">SHA-512ৰ সৈতে X9.62 ECDSA স্বাক্ষৰ</translation> +<translation id="3544058026430919413">এটা কোম্পানীয়ে গোটটোত আপোনাৰ কাৰ্যকলাপ শ্বেয়াৰ কৰিবলৈ কুকি ব্যৱহাৰ কৰিব পৰা ছাইটৰ এটা গোট সংজ্ঞায়িত কৰিব পাৰে। এয়া ইনক’গনিট’ত অফ কৰা আছে।</translation> <translation id="3544879808695557954">ব্যৱহাৰকাৰীৰ নাম (ঐচ্ছিক)</translation> <translation id="354602065659584722">ক্ষতিকাৰক ছফ্টৱেৰ আঁতৰোৱা হ’ল</translation> <translation id="3547954654003013442">প্ৰক্সি ছেটিংসমূহ</translation> @@ -2889,6 +2892,7 @@ <translation id="3681548574519135185">ফ’কাছ ৰিং</translation> <translation id="3683524264665795342"><ph name="APP_NAME" />ৰ পঠিওৱা স্ক্ৰীন শ্বেয়াৰ কৰাৰ অনুৰোধ</translation> <translation id="3685598397738512288">Linuxৰ USBৰ অগ্ৰাধিকাৰসমূহ</translation> +<translation id="3687598459967813435">সদায়েই <ph name="WEBSITE" />ৰ পৰা জাননী লাভ কৰাৰ অনুমতি দিয়ক</translation> <translation id="368789413795732264">ফাইলটো পঢ়িবলৈ চেষ্টা কৰোঁতে কিবা আসোঁৱাহ হৈছে: <ph name="ERROR_TEXT" />।</translation> <translation id="3688507211863392146">আপুনি এপ্লিকেশ্বনটোত খোলা ফাইল আৰু ফ'ল্ডাৰসমূহত লিখক</translation> <translation id="3688526734140524629">চেনেল সলনি কৰক</translation> @@ -4042,6 +4046,7 @@ <translation id="4779766576531456629">ই-ছিমৰ চেলুলাৰ নেটৱৰ্কৰ নতুন নাম দিয়ক</translation> <translation id="4780321648949301421">এই হিচাপ ছেভ কৰক…</translation> <translation id="4781443161433589743">আপুনি Chromeৰ আটাইতকৈ বৰ্ধিত সুৰক্ষাৰ সুবিধা লাভ কৰি আছে</translation> +<translation id="4781584184731045253">ডেটা আৰু অনুমতি মচক</translation> <translation id="4782861709165039462">ডিভাইচৰ হাৰ্ডৱেৰ ছুইচৰ জৰিয়তে আটাইবোৰ মাইক্ৰ’ফ’ন নিষ্ক্ৰিয় কৰা হয়</translation> <translation id="4785719467058219317">আপুনি ব্যৱহাৰ কৰি থকা সুৰক্ষা চাবিটো এই ৱেবছাইটটোত পঞ্জীকৃত নহয়</translation> <translation id="4785914069240823137">ক্ৰপ কৰাটো বাতিল কৰক</translation> @@ -4717,6 +4722,7 @@ <translation id="5449551289610225147">অমান্য পাছৱৰ্ড</translation> <translation id="5449588825071916739">সকলো টেব বুকমার্ক কৰক</translation> <translation id="5449716055534515760">Win&dow বন্ধ কৰক</translation> +<translation id="545133051331995777">কোনো নেটৱৰ্ক সংযোগ নাই</translation> <translation id="5452446625764825792">এতিয়া আপুনি আপোনাৰ ফ’নৰ শেহতীয়া ফট’, মিডিয়া আৰু এপ্সমূহ চাব পাৰে</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (অফলাইনত কাম কৰে)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" />ৰ সৈতে</translation> @@ -4759,6 +4765,7 @@ <translation id="5487521232677179737">ডেটা মচক</translation> <translation id="5488093641312826914">’<ph name="COPIED_ITEM_NAME" />’ প্ৰতিলিপি কৰা হ’ল</translation> <translation id="5488508217173274228">ছিংক কৰা ডেটাৰ এনক্ৰিপশ্বন সম্পৰ্কীয় বিকল্পসমূহ</translation> +<translation id="5489077378642700219"><ph name="WEBSITE" />ৰ পৰা অহা জাননীৰ অনুমতি নিদিব কিন্তু সেয়া পাছত বিচাৰিব</translation> <translation id="5489435190927933437"><ph name="DOMAIN" />ৰ বাবে ছেভ কৰি ৰখা পাছৱর্ড</translation> <translation id="5490721031479690399">ব্লুটুথ ডিভাইচৰ পৰা সংযোগ বিচ্ছিন্ন কৰক</translation> <translation id="5490798133083738649">Linuxক আপোনাৰ মাইক্ৰ’ফ’ন এক্সেছ কৰিবলৈ দিয়ক</translation> @@ -5095,6 +5102,7 @@ <translation id="5805697420284793859">ৱিণ্ড‘ পৰিচালক</translation> <translation id="5806447147478173900">প্ৰদৰ্শিত ছাইটসমূহে ব্যৱহাৰ কৰা মুঠ ষ্ট’ৰেজ: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">০° (ডিফ’ল্ট)</translation> +<translation id="5809835394668218762"><ph name="WEBSITE" />ৰ বাবে অধিক কাৰ্য</translation> <translation id="5810809306422959727">এই একাউণ্টটো অভিভাৱকীয় নিয়ন্ত্ৰণসমূহ ব্যৱহাৰ কৰিবৰ বাবে যোগ্য নহয়</translation> <translation id="5811614940486072060">এই ফাইলটো সাধাৰণতে ডাউনল’ড কৰা নহয় আৰু ই বিপজ্জনক হ’ব পাৰে</translation> <translation id="5812674658566766066">আটাইখিনি সম্প্ৰসাৰণ কৰক</translation> @@ -5108,6 +5116,7 @@ <translation id="5826395379250998812">আপোনাৰ <ph name="DEVICE_TYPE" /> নিজৰ ফ’নৰ সৈতে সংযোগ কৰক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="5826993284769733527">অৰ্দ্ধ-স্বচ্ছ</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">একেটা গোটত থকা ছাইটসমূহ দেখুৱাওক</translation> <translation id="5827733057563115968">পৰৱৰ্তী শব্দ পূৰ্বানুমান</translation> <translation id="5828545842856466741">প্ৰ’ফাইল যোগ কৰক...</translation> <translation id="5828633471261496623">প্ৰিণ্ট কৰি থকা হৈছে...</translation> @@ -5221,6 +5230,7 @@ <translation id="5927232971138258197">এই এক্সটেনশ্বনটোৱে পঢ়িব আৰু সলনি কৰিব পাৰে <ph name="HOST" /></translation> <translation id="592740088639760830">এই কণ্টেনাৰটো বন্ধ কৰক</translation> <translation id="592880897588170157">PDF ফাইলসমূহ Chromeত স্বয়ংক্ৰিয়ভাৱে খোলাৰ সলনি ডাউনল’ড কৰক</translation> +<translation id="5928969282301718193">এতিয়াৰ কাৰণে আটাইবোৰ কাৰ্য হৈ হ’ল</translation> <translation id="592919310198008711">মই এক্সটেনশ্বনটো ক্লিক কৰিলে</translation> <translation id="5932209916647644605"><ph name="MANAGER" />ৰ বাবে আপুনি তৎক্ষণাৎ আপোনাৰ <ph name="DEVICE_TYPE" />টো আপডে’ট কৰাৰ আৱশ্যক।</translation> <translation id="5932224571077948991">ছাইটে বিনা অনুমতিত বা কোনো বিভ্ৰান্তিকৰ বিজ্ঞাপন দেখুৱায়</translation> @@ -5394,6 +5404,7 @@ <translation id="6087746524533454243">ব্ৰাউজাৰৰ বিষয়ে পৃষ্ঠাখন বিচাৰিছে নেকি? ইয়ালৈ যাওক</translation> <translation id="6087960857463881712">অনন্য মুখমণ্ডল</translation> <translation id="608912389580139775">এই পৃষ্ঠাখন আপোনাৰ পঢ়াৰ সূচীখনত যোগ দিবলৈ, বুকমাৰ্ক চিহ্নটোত ক্লিক কৰক</translation> +<translation id="6091116443517744502">অনুগ্ৰহ কৰি আপোনাৰ ইণ্টাৰনেট সংযোগ পৰীক্ষা কৰক আৰু পুনৰ চেষ্টা কৰক</translation> <translation id="6091761513005122595">শ্বেয়াৰ সফলভাৱে মাউণ্ট কৰা হ’ল।</translation> <translation id="6093803049406781019">প্ৰ’ফাইল মচক</translation> <translation id="6093888419484831006">আপডে'ট বাতিল কৰি থকা হৈছে...</translation> @@ -6056,6 +6067,7 @@ <translation id="6736243959894955139">ঠিকনা</translation> <translation id="6737393581255281855">প্ৰদৰ্শিত ডেটা মচিবনে?</translation> <translation id="6737663862851963468">Kerberosৰ টিকেটটো আঁতৰাওক</translation> +<translation id="6738180164164974883">তৃতীয় পক্ষৰ কুকি ছেট কৰাৰ অনুমতি দিয়ক</translation> <translation id="6738430949033571771">একাউণ্ট সত্যাপন কৰি থকা হৈছে...</translation> <translation id="6739923123728562974">ডেস্কটপ শ্বৰ্টকাট দেখুৱাওক</translation> <translation id="6740234557573873150">পজ কৰা আছে <ph name="FILE_NAME" /></translation> @@ -6253,6 +6265,7 @@ <translation id="691106080621596509">এই কাৰ্যই <ph name="SITE_GROUP_NAME" />, ইয়াৰ অধীনত থকা যিকোনো ছাইট আৰু এইটোৰ ইনষ্টল হৈ থকা এপে ষ্ট’ৰ কৰা সকলো ডেটা আৰু কুকি মচিব</translation> <translation id="6911734910326569517">মেম’ৰি ফুটপ্ৰিণ্ট</translation> <translation id="6912007319859991306">চেলুলাৰ ছিম পিন</translation> +<translation id="6912380255120084882">অন্য এটা ডিভাইচ ব্যৱহাৰ কৰি চাওক</translation> <translation id="691289340230098384">কেপশ্বনৰ অগ্ৰাধিকাৰসমূহ</translation> <translation id="6914783257214138813">ৰপ্তানি কৰা ফাইল দেখা পোৱা যিকোনো লোকে আপোনাৰ পাছৱৰ্ড দেখা পাব।</translation> <translation id="6916590542764765824">এক্সটেনশ্বন পৰিচালনা কৰক</translation> @@ -6561,6 +6574,7 @@ <translation id="7222204278952406003">Chrome হৈছে আপোনাৰ ডিফ'ল্ট ব্ৰাউজাৰ</translation> <translation id="7222232353993864120">ইমেইল ঠিকনা</translation> <translation id="7222235798733126207">ছাইটসমূহৰ মাজত শ্বেয়াৰ কৰাটো সীমিত</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{<ph name="FPS_OWNER" />ৰ গোটত ১ টা ছাইট}one{<ph name="FPS_OWNER" />ৰ গোটত {MEMBERS} টা ছাইট}other{<ph name="FPS_OWNER" />ৰ গোটত {MEMBERS} টা ছাইট}}</translation> <translation id="7225082563376899794">পাছৱৰ্ড পূৰ কৰাৰ সময়ত Windows Hello ব্যৱহাৰ কৰক</translation> <translation id="7225179976675429563">নেটৱৰ্কৰ প্ৰকাৰ নাই</translation> <translation id="7227458944009118910">তলত সূচীবদ্ধ কৰা এপ্সমুহে প্ৰট’কলৰ লিংকো পৰিচালনা কৰিব পাৰে। অন্য এপে অনুমতি বিচাৰিব।</translation> @@ -7071,6 +7085,7 @@ <translation id="7709152031285164251">বিফল হ’ল - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&কাষ্ট কৰক...</translation> <translation id="7711900714716399411">আপোনাৰ ফ’নটো নিজৰ কম্পিউটাৰটোৰ সৈতে সংযোগ কৰিবলৈ এডাল ইউএছবি কে’বল ব্যৱহাৰ কৰক। যদি আপোনাৰ ফ’নটো ইতিমধ্যে সংযুক্ত হৈ আছে, তেন্তে এইটো আনপ্লাগ কৰক আৰু পুনৰ প্লাগ ইন কৰক।</translation> +<translation id="7711968363685835633">ব্যক্তিগতকৃত ৰূপান্তৰণ আৰু পৰামৰ্শৰ লগতে ব্যৱহাৰকাৰী অভিধানো অক্ষম কৰক</translation> <translation id="7712739869553853093">প্ৰিণ্টৰ পূৰ্বদৰ্শনৰ ডায়লগ</translation> <translation id="7714307061282548371"><ph name="DOMAIN" />ৰ কুকীৰ অনুমতি দিয়া হৈছে</translation> <translation id="7714464543167945231">প্ৰমাণপত্ৰ</translation> @@ -7141,6 +7156,7 @@ <translation id="7768770796815395237">সলনি কৰক</translation> <translation id="7768784765476638775">কথা ক’বলৈ বাছনি কৰক</translation> <translation id="7769748505895274502">শেহতীয়াকৈ বন্ধ কৰা শিতানটো সংকোচন কৰক</translation> +<translation id="7770072242481632881">ছাইডৰ পেনেল বাছনি কৰোঁতা</translation> <translation id="7770406201819593386">ChromeOS Flex ডায়েগন’ষ্টিক পৰীক্ষা চলাওক।</translation> <translation id="7770450735129978837">মাউছৰ ৰাইট ক্লিক</translation> <translation id="7770612696274572992">অন্য ডিভাইচৰ পৰা প্ৰতিলিপি কৰা প্ৰতিচ্ছবি</translation> @@ -7770,6 +7786,7 @@ <translation id="8353683614194668312">ই এই কার্য কৰিব পাৰে:</translation> <translation id="8354034204605718473">আপোনাৰ শিশুৰ পিন যোগ দিয়া হৈছে</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">আপুনি ইতিমধ্যে এই ডিভাইচটো পঞ্জীয়ন কৰিছে। আপুনি এইটো পুনৰ পঞ্জীয়ন কৰিব নালাগে।</translation> <translation id="8357388086258943206">Linux ইনষ্টল কৰোঁতে আসোঁৱাহ হৈছে</translation> <translation id="8358685469073206162">পৃষ্ঠাবোৰ পুনঃস্থাপন কৰিবনে?</translation> <translation id="8358912028636606457">এই ডিভাইচটোত টেব অডিঅ’ কাষ্ট কৰাটো সমৰ্থিত নহয়।</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 9d9408d4b..96b6b5f4 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1241,6 +1241,7 @@ <translation id="2135787500304447609">Davam edin</translation> <translation id="2136372518715274136">Yeni parol daxil edin</translation> <translation id="2136476978468204130">Daxil etdiyiniz parol söz yanlışdır</translation> +<translation id="2137128126782078222"><ph name="WEBSITE" /> saytından bildirişlərə icazə verməyin</translation> <translation id="2137891579555018930">İcazə gözlənilir...</translation> <translation id="2139919072249842737">Ayarlayın düyməsi</translation> <translation id="2140788884185208305">Enerji Statusu</translation> @@ -2482,6 +2483,7 @@ <translation id="3281892622610078515">Təcrid ediləcək fayl və proqramlar:</translation> <translation id="3282210178675490297">Tab <ph name="APP_NAME" /> ilə paylaşılır</translation> <translation id="3285322247471302225">Yeni Tab</translation> +<translation id="3285500645985761267">Əlaqədar saytlara qrupdakı fəaliyyətinizi görməyə icazə verin</translation> <translation id="328571385944182268">Parollar yadda saxlanılsın?</translation> <translation id="3288047731229977326">Developer rejimində işləyən artırmalar kompüterinizə zərər verə bilər. Developer deyilsinizsə, güvənli qalmaq üçün bu artırmaların developer rejimində işləməsinə icazə verməməlisiniz.</translation> <translation id="3289668031376215426">Avto-kapitalizasiya</translation> @@ -2756,6 +2758,7 @@ <translation id="3541823293333232175">Təyin edildi</translation> <translation id="3543393733900874979">Güncəllənmə alınmadı (xəta: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">X9.62 ECDSA SHA-512 ilə imza</translation> +<translation id="3544058026430919413">Şirkət qrupda fəaliyyətinizi paylaşmaq üçün kukilərdən istifadə edə biləcək saytlar qrupu təyin edə bilər. Bu, Anonim rejimdə deaktivdir.</translation> <translation id="3544879808695557954">İstifadəçi adı (istəyə görə)</translation> <translation id="354602065659584722">Zərərli proqram təminatı silindi</translation> <translation id="3547954654003013442">Proksi ayarları</translation> @@ -2895,6 +2898,7 @@ <translation id="3681548574519135185">Fokus halqası</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> Ekran Paylaşımı Sorğusu</translation> <translation id="3685598397738512288">Linux USB tərcihləri</translation> +<translation id="3687598459967813435">Həmişə <ph name="WEBSITE" /> saytından bildirişlərə icazə verin</translation> <translation id="368789413795732264">Faylı yazan zaman xəta baş verdi: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Tətbiqdə açdığınız fayl və qovluqlara yazın</translation> <translation id="3688526734140524629">Kanalı dəyişin</translation> @@ -4054,6 +4058,7 @@ <translation id="4779766576531456629">eSIM Mobil şəbəkəsinin adını dəyişin</translation> <translation id="4780321648949301421">Səhifəni yadda saxlama formatı:</translation> <translation id="4781443161433589743">Chrome’un ən güclü güvənlik sistemi aktivdir</translation> +<translation id="4781584184731045253">Data və icazələri silin</translation> <translation id="4782861709165039462">Bütün mikrofonlar cihazların aparat keçiricisi ilə deaktiv edilib</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> @@ -4734,6 +4739,7 @@ <translation id="5449551289610225147">Yanlış parol</translation> <translation id="5449588825071916739">Bütün Tabları Əlfəcinləyin</translation> <translation id="5449716055534515760">Pəncərəni bağlayın</translation> +<translation id="545133051331995777">Şəbəkə bağlantısı yoxdur</translation> <translation id="5452446625764825792">İndi telefonunuzun son fotolarına, mediasına və tətbiqlərinə baxa bilərsiniz</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (oflayn işləyir)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" /> ilə</translation> @@ -4777,6 +4783,7 @@ <translation id="5487521232677179737">Datanı silin</translation> <translation id="5488093641312826914">"<ph name="COPIED_ITEM_NAME" />" kopyalandı</translation> <translation id="5488508217173274228">Sinxronizasiyanın şifrələnməsi seçimləri</translation> +<translation id="5489077378642700219"><ph name="WEBSITE" /> saytından bildirişlərə icazə verməyin, lakin sonra soruşun</translation> <translation id="5489435190927933437"><ph name="DOMAIN" /> üçün parolları yadda saxlayın</translation> <translation id="5490721031479690399">Bluetooth cihazını ayırın</translation> <translation id="5490798133083738649">Linux'a mikrofona giriş icazəsi verin</translation> @@ -5115,6 +5122,7 @@ <translation id="5805697420284793859">Pəncərə meneceri</translation> <translation id="5806447147478173900">Göstərilən saytlar tərəfindən istifadə olunan cəmi yaddaş: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Defolt)</translation> +<translation id="5809835394668218762"><ph name="WEBSITE" /> üçün digər əməliyyatlar</translation> <translation id="5810603387504252966">#borealis-enabled chrome://flags bölməsində aktiv edilməlidir</translation> <translation id="5810809306422959727">Bu hesab valideyn nəzarəti üçün uyğun deyil</translation> <translation id="5811614940486072060">Bu fayl tez-tez endirilmədiyinə görə təhlükəli ola bilər</translation> @@ -5129,6 +5137,7 @@ <translation id="5826395379250998812"><ph name="DEVICE_TYPE" /> cihazını telefona qoşun. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Yarı-şəffaf</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Eyni qrupdakı saytları göstərin</translation> <translation id="5827733057563115968">Növbəti söz proqnozu</translation> <translation id="5828545842856466741">Profil əlavə edin...</translation> <translation id="5828633471261496623">Çap edilir...</translation> @@ -5243,6 +5252,7 @@ <translation id="5927232971138258197">Bu artırma <ph name="HOST" /> domenini oxuya və dəyişə bilər</translation> <translation id="592740088639760830">Bu konteyneri dayandırın</translation> <translation id="592880897588170157">PDF faylları Chrome'da avtomatik açmaq əvəzinə onları endirin</translation> +<translation id="5928969282301718193">Hələlik hər şey hazırdır</translation> <translation id="592919310198008711">Artırmaya tıkladığım zaman</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> sizdən <ph name="DEVICE_TYPE" /> cihazınızı dərhal güncəlləməyinizi tələb edir.</translation> <translation id="5932224571077948991">Sayt intruziv və ya aldadıcı reklamlar göstərir</translation> @@ -5417,6 +5427,7 @@ <translation id="6087746524533454243">Brauzerin haqqında səhifəsini axtarırsınız? Ziyarət edin</translation> <translation id="6087960857463881712">Zəhmli üz</translation> <translation id="608912389580139775">Bu səhifəni oxu siyahınıza əlavə etmək üçün Əlfəcin ikonasına toxunun</translation> +<translation id="6091116443517744502">şəbəkə bağlantısını yoxlayın və yenidən cəhd edin</translation> <translation id="6091761513005122595">Paylaşım başladı.</translation> <translation id="6093803049406781019">Profili silin</translation> <translation id="6093888419484831006">Güncəllənmə ləğv edilir...</translation> @@ -6081,6 +6092,7 @@ <translation id="6736243959894955139">Ünvan:</translation> <translation id="6737393581255281855">Göstərilən data silinsin?</translation> <translation id="6737663862851963468">Kerberos biletini silin</translation> +<translation id="6738180164164974883">Üçüncü tərəf kukilərini təyin etməyə icazə verin</translation> <translation id="6738430949033571771">Hesab doğrulanır...</translation> <translation id="6739923123728562974">Masaüstü qısayolunu göstərin</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> durduruldu</translation> @@ -6278,6 +6290,7 @@ <translation id="691106080621596509">Bununla <ph name="SITE_GROUP_NAME" />, oradakı saytlar və quraşdırılmış tətbiq tərəfindən saxlanılan bütün data və kukilər silinəcək</translation> <translation id="6911734910326569517">Yaddaş sahəsi</translation> <translation id="6912007319859991306">Mobil SİM kartın PİN kodu</translation> +<translation id="6912380255120084882">Fərqli cihazı sınayın</translation> <translation id="691289340230098384">Subtitr tərcihləri</translation> <translation id="6914783257214138813">Eksport edilmiş faylı görən hər kəs parollarınızı görəcək.</translation> <translation id="6916590542764765824">İstisnaları idarə edin</translation> @@ -6590,6 +6603,7 @@ <translation id="7222204278952406003">Chrome defolt brauzerdir</translation> <translation id="7222232353993864120">E-poçt Ünvanı</translation> <translation id="7222235798733126207">Saytlar arasında məhdud paylaşım</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{<ph name="FPS_OWNER" /> adlı şəxsin qrupunda 1 sayt}other{<ph name="FPS_OWNER" /> adlı şəxsin qrupunda {MEMBERS} sayt}}</translation> <translation id="7225082563376899794">Parolları daxil edərkən Windows Hello istifadə edin</translation> <translation id="7225179976675429563">Şəbəkə növü çatışmır</translation> <translation id="7227458944009118910">Aşağıda sadalanan tətbiqlər protokol keçidlərini də idarə edə bilər. Digər tətbiqlər icazə istəyəcək.</translation> @@ -7103,6 +7117,7 @@ <translation id="7709152031285164251">Alınmadı - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Yayım...</translation> <translation id="7711900714716399411">Telefonunuzu kompüterinizə qoşmaq üçün USB kabelindən istifadə edin. Telefonunuz artıq qoşulubsa, elektrik mənbəyindən ayırıb yenidən taxın.</translation> +<translation id="7711968363685835633">Fərdi çevirmələri və təklifləri, həmçinin istifadəçi lüğətini deaktiv edin</translation> <translation id="7712739869553853093">Çap önbaxışı dialoqu</translation> <translation id="7714307061282548371"><ph name="DOMAIN" /> domenindən olan kukilərə icazə var</translation> <translation id="7714464543167945231">Sertifikat</translation> @@ -7175,6 +7190,7 @@ <translation id="7768770796815395237">Dəyişin</translation> <translation id="7768784765476638775">Seç və Dinlə</translation> <translation id="7769748505895274502">Son bağlananı yığcamlaşdırın</translation> +<translation id="7770072242481632881">Yan Panel Seçicisi</translation> <translation id="7770406201819593386">ChromeOS Flex diaqnostik testlərini işə salın.</translation> <translation id="7770450735129978837">Mausun sağ düyməsinə tıklama</translation> <translation id="7770612696274572992">Şəkil başqa cihazdan kopyalanıb</translation> @@ -7811,6 +7827,7 @@ <translation id="8353683614194668312">Bunu bacarır:</translation> <translation id="8354034204605718473">Övladınızın PİN kodu əlavə edilib</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Bu cihazı artıq qeydiyyatdan keçirmisiniz. Onu yenidən qeydiyyatdan keçirməyə ehtiyac yoxdur.</translation> <translation id="8357388086258943206">Linux quraşdırılarkən xəta baş verdi</translation> <translation id="8358685469073206162">Səhifələr bərpa edilsin?</translation> <translation id="8358912028636606457">Bu cihazda tab yayımı zamanı audio dəstəklənmir.</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 58a95b3..bbb1655 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -5592,7 +5592,7 @@ <translation id="6270770586500173387">Адправіць <ph name="BEGIN_LINK1" />звесткі пра сістэму і праграмы<ph name="END_LINK1" />, а таксама <ph name="BEGIN_LINK2" />паказчыкі<ph name="END_LINK2" /></translation> <translation id="6271348838875430303">выпраўленне адроблена</translation> <translation id="6273677812470008672">Якасць</translation> -<translation id="6274202259872570803">Трансляцыя экрана</translation> +<translation id="6274202259872570803">Скрынкаст</translation> <translation id="6276210637549544171">Проксі-сервер <ph name="PROXY_SERVER" /> патрабуе імя карыстальніка і пароль.</translation> <translation id="6277105963844135994">Час чакання сеткі</translation> <translation id="6277518330158259200">&Зрабіць здымак экрана</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 1c262f1..7c25a73 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1905,6 +1905,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">তত্ত্বাবধানে থাকা ব্যবহারকারীদেরকে আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে।</translation> <translation id="2722540561488096675"><ph name="TIME_LEFT" />-এর মধ্যে আপনার ডিভাইস বন্ধ হয়ে যাবে। আপনার ডিভাইস আবার চালু করার আগে ইউএসবি সরিয়ে দিন। এরপর আপনি <ph name="DEVICE_OS" /> ব্যবহার শুরু করতে পারবেন।</translation> +<translation id="2722547199758472013">আইডি: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC লগগুলি</translation> <translation id="272488616838512378">ইউনিট কনর্ভাসন</translation> <translation id="2725200716980197196">নেটওয়ার্ক সংযোগ পুনঃস্থাপিত হয়েছে</translation> @@ -3076,6 +3077,7 @@ <translation id="3828029223314399057">বুকমার্কগুলি খুঁজুন</translation> <translation id="3828953470056652895">আমি <ph name="BEGIN_LINK1" />Google পরিষেবার শর্তাবলী<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Chrome ও ChromeOS-এর অতিরিক্ত পরিষেবার শর্তাবলী<ph name="END_LINK2" /> এবং <ph name="BEGIN_LINK3" />Play পরিষেবার শর্তাবলী<ph name="END_LINK3" /> পড়েছি ও সেগুলিতে সম্মতি জানাচ্ছি।</translation> <translation id="3829765597456725595">SMB ফাইল শেয়ার</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" />-এ</translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{আপনার অ্যাডমিনিস্ট্রেটর ১টি সম্ভাব্য ক্ষতিকর এক্সটেনশন আবার চালু করে দিয়েছে}one{আপনার অ্যাডমিনিস্ট্রেটর {NUM_EXTENSIONS}টি সম্ভাব্য ক্ষতিকর এক্সটেনশন আবার চালু করে দিয়েছে}other{আপনার অ্যাডমিনিস্ট্রেটর {NUM_EXTENSIONS}টি সম্ভাব্য ক্ষতিকর এক্সটেনশন আবার চালু করে দিয়েছে}}</translation> <translation id="3831436149286513437">Google ড্রাইভ সার্চ সাজেশন</translation> <translation id="3834728400518755610">মাইক্রোফোন সেটিং পরিবর্তন করতে Linux বন্ধ করতে হবে। এগোনোর জন্য Linux বন্ধ করুন।</translation> @@ -5209,6 +5211,7 @@ <translation id="5884474295213649357">এই ট্যাব একটি USB ডিভাইসের সাথে সংযুক্ত করা আছে।</translation> <translation id="5885314688092915589">আপনার প্রতিষ্ঠান এই প্রোফাইল ম্যানেজ করবে</translation> <translation id="5886009770935151472">আঙ্গুল ১</translation> +<translation id="5886112770923972514">আশেপাশের ডিভাইসে কানেক্ট করে দ্রুত পেয়ার সেট-আপ করুন</translation> <translation id="5886384907280980632">এখনই বন্ধ করুন</translation> <translation id="5889282057229379085">ইন্টারমিডিয়েট CAগুলির সর্বাধিক সংখ্যা: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">পছন্দের ওয়াই-ফাই নেটওয়ার্ক</translation> @@ -7802,6 +7805,7 @@ <translation id="8338952601723052325">ডেভেলপার ওয়েবসাইট</translation> <translation id="833986336429795709">এই লিঙ্কটি খুলতে, একটি অ্যাপ বেছে নিন</translation> <translation id="8340547030807793004"><ph name="DEVICE" />-এর জন্য আরও অ্যাকশন</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{<ph name="BEGIN_BOLD" />১টি সাইট<ph name="END_BOLD" /> পর্যালোচনা করুন যেখান থেকে সম্প্রতি প্রচুর বিজ্ঞপ্তি পাঠানো হয়েছে}one{<ph name="BEGIN_BOLD" />{NUM_SITES}টি সাইট<ph name="END_BOLD" /> পর্যালোচনা করুন যেখান থেকে সম্প্রতি প্রচুর বিজ্ঞপ্তি পাঠানো হয়েছে}other{<ph name="BEGIN_BOLD" />{NUM_SITES}টি সাইট<ph name="END_BOLD" /> পর্যালোচনা করুন যেখান থেকে সম্প্রতি প্রচুর বিজ্ঞপ্তি পাঠানো হয়েছে}}</translation> <translation id="8342221978608739536">ব্যবহার করিনি</translation> <translation id="8342861492835240085">একটি সংগ্রহ বেছে নিন</translation> <translation id="8345848587667658367">আপনি এখন আপনার ফোনের সাম্প্রতিক ফটো, মিডিয়া, বিজ্ঞপ্তি এবং অ্যাপ দেখতে পারেন</translation> @@ -8798,6 +8802,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">নিরাপদ সংযোগ স্থাপন করা হচ্ছে...</translation> <translation id="996803490569799917">আপনার প্রিয় মানুষের সাথে কাটানো সময়ের স্মৃতি দেখুন ও আরও অনেক কিছু করুন</translation> +<translation id="997143476478634194">আপনি কোনও সাইট খুললে সেটি অটোমেটিক এই সেটিং মেনে কাজ করবে। ব্রেকিং নিউজ বা চ্যাট মেসেজ সম্পর্কে আপনাকে জানাতে সাইট সাধারণত বিজ্ঞপ্তি পাঠিয়ে থাকে।</translation> <translation id="99731366405731005">ওয়াই-ফাই সিঙ্ক ব্যবহার করতে <ph name="LINK1_BEGIN" />Chrome সিঙ্ক<ph name="LINK1_END" /> চালু করুন। <ph name="LINK2_BEGIN" />আরও জানুন<ph name="LINK2_END" /></translation> <translation id="998747458861718449">স&তর্কভাবে পরীক্ষা করুন</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 347541a..58d9baf 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -424,6 +424,7 @@ <translation id="1397594434718759194">Prijavili ste se u Chrome na ovim uređajima, pa ih možete koristiti kao sigurnosne ključeve.</translation> <translation id="1398853756734560583">Povećaj maksimalno</translation> <translation id="139911022479327130">Otključajte telefon i potvrdite identitet</translation> +<translation id="1401216725754314428">Saznajte više o povezanim web-lokacijama na novoj kartici</translation> <translation id="1401308693935339022">Koristite lokaciju. Dozvolite aplikacijama i uslugama s odobrenjem za lokaciju da koriste lokaciju ovog uređaja. Google može povremeno prikupljati podatke o lokaciji i anonimno koristiti te podatke radi poboljšavanja preciznosti lokacije i usluga koje se zasnivaju na lokaciji.</translation> <translation id="1403222014593521787">Nije se moguće povezati s proksi serverom</translation> <translation id="1405779994569073824">Došlo je do pada kartice.</translation> @@ -7700,6 +7701,7 @@ <translation id="8206745257863499010">Bluesy</translation> <translation id="8206859287963243715">Mobitel</translation> <translation id="8207404892907560325">Odaberite pristupni ključ</translation> +<translation id="8208188204689616705">Ove su web-lokacije u grupi koju definira domena <ph name="FPS_OWNER" />. Web-lokacije u grupi mogu vidjeti vašu aktivnost u grupi.</translation> <translation id="8208216423136871611">Ne spremaj</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Novo obavještenje}one{# novo obavještenje}few{# nova obavještenja}other{# novih obavještenja}}</translation> <translation id="821119981794423735">Da uvezete lozinke u Google upravitelja lozinki za <ph name="USER_EMAIL" />, odaberite CSV fajl</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index 0440308..1095d6f 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">Creada</translation> <translation id="1067661089446014701">Per augmentar la seguretat, pots encriptar les contrasenyes al dispositiu abans que es desin al teu Compte de Google</translation> <translation id="1067922213147265141">Altres serveis de Google</translation> +<translation id="1069104208554708737">Aquesta clau d'accés només es desarà en aquest dispositiu</translation> <translation id="1069355737714877171">Suprimeix el perfil d'eSIM anomenat <ph name="PROFILE_NAME" /></translation> <translation id="1069814191880976658">Tria una altra pantalla</translation> <translation id="1070377999570795893">Un altre programa de l'ordinador ha afegit una extensió que pot canviar el funcionament de Chrome. @@ -347,6 +348,7 @@ <translation id="1324106254079708331">Protegeix els Comptes de Google personals de qualsevol usuari que corri el risc de rebre atacs dirigits</translation> <translation id="1327272175893960498">Tiquets de Kerberos</translation> <translation id="1327495825214193325">Per activar la depuració d'ADB, cal reiniciar el dispositiu <ph name="DEVICE_TYPE" />. Per desactivar-la, cal restablir-ne la configuració de fàbrica.</translation> +<translation id="1327527584824210101">Utilitza la teva clau d'accés</translation> <translation id="1327794256477341646">Les funcions que necessiten la teva ubicació no funcionaran</translation> <translation id="1331977651797684645">Sí que era jo.</translation> <translation id="1333489022424033687">Pot ser que algunes funcions que inclou <ph name="ORIGIN" /> no es puguin executar fins que no esborris les dades que altres llocs web han emmagatzemat al teu dispositiu</translation> @@ -407,6 +409,7 @@ <translation id="139013308650923562">Amb permís per utilitzar els tipus de lletra instal·lats al teu dispositiu</translation> <translation id="1390548061267426325">Obre com a pestanya normal</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> no té autorització per imprimir a <ph name="PRINTER_NAME" />. Contacta amb l'administrador.</translation> +<translation id="1392047138650695757">Diccionaris de l'usuari</translation> <translation id="1393283411312835250">Sol i núvols</translation> <translation id="1395730723686586365">S'ha iniciat l'actualitzador.</translation> <translation id="1395832189806039783">Marca l'element amb el focus del teclat</translation> @@ -1515,6 +1518,7 @@ <translation id="2356070529366658676">Pregunta-ho</translation> <translation id="2357330829548294574">Suprimeix <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Els llocs web poden utilitzar JavaScript</translation> +<translation id="2358703245148663432">Un altre dispositiu</translation> <translation id="2358777858338503863">Fes clic per permetre-ho a <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Pot ser que les aplicacions de Linux no responguin.</translation> <translation id="2359345697448000899">Per gestionar les extensions, feu clic a Extensions al menú Eines.</translation> @@ -1875,6 +1879,7 @@ <translation id="271033894570825754">Nou</translation> <translation id="2711073837061989559">Proves</translation> <translation id="2712173769900027643">Demana permís</translation> +<translation id="2712207122921938368">Crea una clau d'accés en un altre dispositiu</translation> <translation id="2713106313042589954">Desactiva la càmera</translation> <translation id="2713444072780614174">Blanc</translation> <translation id="2714393097308983682">Google Play Store</translation> @@ -2387,6 +2392,7 @@ <translation id="3182749001423093222">Corrector ortogràfic</translation> <translation id="3183139917765991655">Importador de perfils</translation> <translation id="3183143381919926261">Xarxes de dades mòbils</translation> +<translation id="3183613134231754987">Aquesta clau d'accés només es desarà a Windows Hello. Es conservarà en aquest dispositiu després que tanquis totes les finestres d'incògnit.</translation> <translation id="3183944777708523606">Disposició del monitor</translation> <translation id="3184536091884214176">Configura o gestiona les impressores CUPS. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{Aquesta aplicació està bloquejada}other{Algunes aplicacions estan bloquejades}}</translation> @@ -2866,6 +2872,7 @@ <translation id="3654045516529121250">Consultar la configuració d'accessibilitat</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Té accés permanent a un fitxer.}other{Té accés permanent a # fitxers.}}</translation> <translation id="3658871634334445293">Acceleració TrackPoint</translation> +<translation id="3659550105763988702">Utilitza la clau d'accés per a <ph name="APP_NAME" /></translation> <translation id="3659929705630080526">Has escrit un codi d'accés incorrecte massa vegades. Torna-ho a provar més tard.</translation> <translation id="3660234220361471169">No és de confiança</translation> <translation id="3664511988987167893">Icona de l'extensió</translation> @@ -3139,6 +3146,7 @@ <translation id="3898327728850887246"><ph name="SITE_NAME" /> vol <ph name="FIRST_PERMISSION" /> i <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">Selecciona el teclat</translation> <translation id="3900966090527141178">Exporta les contrasenyes</translation> +<translation id="3902789559055749153">Tria com vols crear una clau d'accés per a <ph name="APP_NAME" /></translation> <translation id="3903187154317825986">Teclat integrat</translation> <translation id="3904326018476041253">Serveis d'ubicació</translation> <translation id="3904849010307028014">Un lloc web, en funció de com hi interaccionis (per exemple, si hi inicies la sessió habitualment en un compte), pot emetre un testimoni de confiança al teu navegador. Després, si altres llocs web que visitis cerquen i troben un testimoni de confiança vàlid, és més possible que et tractin com una persona i no com un bot.</translation> @@ -3467,6 +3475,7 @@ <translation id="4218081191298393750">Fes clic a la icona del micròfon per silenciar aquesta pestanya</translation> <translation id="4219558185499589032">Box</translation> <translation id="4220648711404560261">S'ha produït un error durant l'activació.</translation> +<translation id="4223845867739585293">Crea una clau d'accés</translation> <translation id="4225397296022057997">En tots els llocs web</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Aquesta extensió no està permesa}other{Algunes extensions no estan permeses}}</translation> <translation id="4231095370974836764">Instal·la aplicacions i jocs de Google Play al dispositiu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation> @@ -4108,6 +4117,7 @@ <translation id="4838907349371614303">S'ha actualitzat la contrasenya</translation> <translation id="4838958829619609362">La selecció no està en <ph name="LANGUAGE" /></translation> <translation id="4839303808932127586">De&sa el vídeo com a...</translation> +<translation id="4839910546484524995">Consulta el dispositiu</translation> <translation id="4840096453115567876">Vols sortir del mode d'incògnit de totes maneres?</translation> <translation id="4841741146571978176">La màquina virtual necessària no existeix. Prova de configurar <ph name="VM_TYPE" /> per continuar.</translation> <translation id="4842976633412754305">Aquesta pàgina està provant de carregar scripts de fonts no autenticades.</translation> @@ -5025,6 +5035,7 @@ <translation id="5729712731028706266">&Lector</translation> <translation id="5731247495086897348">En&ganxa i ves-hi</translation> <translation id="5732392974455271431">Els teus pares te'l poden desbloquejar</translation> +<translation id="5733109311583381874">Afegeix paraules pròpies als diccionaris de l'usuari per personalitzar els candidats de la conversió.</translation> <translation id="5733866499231170760">L'identificador no és vàlid. El format que has introduït no és correcte. Comprova les instruccions que has rebut per assegurar-te que el format de l'identificador és correcte. Si no pots resoldre aquest problema, deixa el camp en blanc i continua amb la instal·lació.</translation> <translation id="5734362860645681824">Comunicacions</translation> <translation id="5734697361979786483">Afegeix compartició de fitxers</translation> @@ -5134,6 +5145,7 @@ <translation id="583431638776747">El lloc web no estava disponible</translation> <translation id="5834581999798853053">Queda cosa de <ph name="TIME" /> minuts</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" />: la càmera o el micròfon estan enregistrant contingut</translation> +<translation id="5835625581856809102">Escaneja aquest codi QR amb el dispositiu en què vulguis crear una clau d'accés per a <ph name="APP_NAME" /></translation> <translation id="583673505367439042">Els llocs web poden demanar permís per editar fitxers i carpetes del dispositiu</translation> <translation id="5836999627049108525">Idioma de partida de la traducció</translation> <translation id="583756221537636748">Cas</translation> @@ -5372,6 +5384,7 @@ <translation id="6059276912018042191">Pestanyes de Chrome recents</translation> <translation id="6059652578941944813">Jerarquia del certificat</translation> <translation id="6059925163896151826">Dispositius USB</translation> +<translation id="6061408389284235459">S'ha enviat una notificació a <ph name="DEVICE_NAME" /></translation> <translation id="6063284707309177505">Crea un codi QR</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />Nota<ph name="END_BOLD" />: És possible que una veu similar a la de <ph name="SUPERVISED_USER_NAME" /> o una gravació puguin accedir als seus resultats personals. Per estalviar bateria, pots seleccionar a la configuració de l'Assistent de <ph name="SUPERVISED_USER_NAME" /> que l'opció "Hey Google" només estigui activada quan aquest dispositiu estigui connectat a una font d'alimentació.</translation> <translation id="6064217302520318294">Bloqueig de pantalla</translation> @@ -5499,6 +5512,7 @@ <translation id="6178664161104547336">Seleccioneu un certificat</translation> <translation id="6178682841350631965">Les teves dades d'inici de sessió s'han actualitzat</translation> <translation id="6180510783007738939">Eina de línia</translation> +<translation id="6180550893222597997">Quina clau d'accés vols utilitzar per a <ph name="APP_NAME" />?</translation> <translation id="6181431612547969857">S'ha bloquejat la baixada</translation> <translation id="6184099524311454384">Cerca pestanyes</translation> <translation id="6185132558746749656">Ubicació del dispositiu</translation> @@ -5934,6 +5948,7 @@ <translation id="6596816719288285829">Adreça IP</translation> <translation id="6597017209724497268">Mostres</translation> <translation id="6597331566371766302">L'administrador ha bloquejat les extensions següents:</translation> +<translation id="6601262427770154296">Gestiona els diccionaris de l'usuari</translation> <translation id="6601612474695404578">Alguns llocs web utilitzen galetes de tercers per carregar les seves pàgines. Si un lloc web no funciona, pots provar de permetre les galetes.</translation> <translation id="6602937173026466876">Accedir a les teves impressores</translation> <translation id="6602956230557165253">Feu servir les tecles de fletxa a la dreta i a l'esquerra per navegar.</translation> @@ -6297,6 +6312,7 @@ <translation id="6943060957016121200">Activa la compartició de xarxa instantània</translation> <translation id="6943176775188458830">Cancel·la la impressió</translation> <translation id="6943939122536910181">S'ha desconnectat del dispositiu <ph name="DEVICE" /></translation> +<translation id="6944708469742828051">Aquesta clau d'accés només es desarà a Windows Hello</translation> <translation id="6945221475159498467">Selecciona</translation> <translation id="694592694773692225">S'ha bloquejat la redirecció en aquesta pàgina.</translation> <translation id="6947015141909171112">Veus receptes en funció de la teva activitat de cerca recent sobre receptes. @@ -6549,6 +6565,7 @@ <translation id="7193051357671784796">La teva organització ha afegit aquesta aplicació. Reinicia-la perquè s'acabi d'instal·lar.</translation> <translation id="7193374945610105795">No hi ha cap contrasenya desada per a <ph name="ORIGIN" /></translation> <translation id="7194873994243265344">La teva organització ha bloquejat aquest fitxer perquè està encriptat. Demana al propietari que el desencripti.</translation> +<translation id="7196272782924897510">Vols utilitzar una clau d'accés d'un altre dispositiu?</translation> <translation id="7196913789568937443">Crea còpies de seguretat a Google Drive. Canvia de dispositiu o restaura'n les dades fàcilment en qualsevol moment. La còpia de seguretat inclou dades d'aplicacions. Les còpies de seguretat es pengen a Google i s'encripten amb la contrasenya del teu Compte de Google. <ph name="BEGIN_LINK1" />Més informació<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Gaudeix de la Cerca i de les eines intel·ligents de Google sempre que naveguis</translation> <translation id="719791532916917144">Tecla de drecera</translation> @@ -7046,6 +7063,7 @@ <translation id="7670483791111801022">Subtítols</translation> <translation id="7671130400130574146">Utilitza la barra del títol i els límits del sistema</translation> <translation id="767127784612208024">Toca per confirmar el restabliment</translation> +<translation id="7672504401554182757">Tria quin dispositiu té la clau d'accés per a <ph name="APP_NAME" /></translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, a <ph name="PAGE_TITLE" />.</translation> <translation id="7674416868315480713">Desactiva tots els ports que es redirigeixen a Linux</translation> <translation id="7674537509496907005"><ph name="APP_COUNT" /> aplicacions</translation> @@ -7155,6 +7173,7 @@ <translation id="7766807826975222231">Visita guiada</translation> <translation id="7766838926148951335">Accepta els permisos</translation> <translation id="7767554953520855281">Els detalls estan amagats mentre comparteixes la pantalla</translation> +<translation id="7767972280546034736">Crea una clau d'accés per a <ph name="APP_NAME" /></translation> <translation id="7768507955883790804">Aquesta opció de configuració s'aplica automàticament als llocs web quan els visites</translation> <translation id="7768526219335215384"><ph name="ORIGIN" /> podrà veure els fitxers de la carpeta <ph name="FOLDERNAME" /></translation> <translation id="7768770796815395237">Canvia</translation> @@ -7643,6 +7662,7 @@ <translation id="820568752112382238">Els llocs web més visitats</translation> <translation id="8206745257863499010">Música</translation> <translation id="8206859287963243715">Cel·lular</translation> +<translation id="8207404892907560325">Tria una clau d'accés</translation> <translation id="8208216423136871611">No desis</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Notificació nova}other{# notificacions noves}}</translation> <translation id="821119981794423735">Per importar contrasenyes al gestor de contrasenyes de Google per a <ph name="USER_EMAIL" />, selecciona un fitxer CSV</translation> @@ -7816,6 +7836,7 @@ <translation id="8376137163494131156">Explica'ns què passa amb Google Cast.</translation> <translation id="8376384591331888629">Incloses les galetes de tercers en aquest lloc web</translation> <translation id="8376451933628734023">Si aquesta aplicació web està provant d'enganyar-te perquè pensis que és una altra aplicació, desinstal·la-la.</translation> +<translation id="8377625247046155446">Aquesta clau d'accés només es desarà en aquest dispositiu. S'hi conservarà després que tanquis totes les finestres d'incògnit.</translation> <translation id="8378714024927312812">Gestionat per la teva organització</translation> <translation id="8379156816349755485">En iniciar la sessió, s'emmagatzemarà un testimoni d'autenticació únic i s'utilitzarà per a totes les baixades aptes que es facin en el futur.</translation> <translation id="8379878387931047019">Aquest dispositiu no admet el tipus de clau de seguretat sol·licitat per aquest lloc web</translation> @@ -8646,6 +8667,7 @@ <ph name="LIST_ITEM" />Executa Diagnòstic de connectivitat de Chrome. <ph name="END_LIST" /></translation> <translation id="916607977885256133">Pantalla en pantalla</translation> +<translation id="9166253503936244008">Escaneja aquest codi QR amb el dispositiu que té la clau d'accés que vols utilitzar per a <ph name="APP_NAME" /></translation> <translation id="9167063903968449027">Mostra la Llista de lectura</translation> <translation id="9167450455589251456">El perfil no s'admet</translation> <translation id="9168436347345867845">Fes-ho més tard</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 002601de..0dac93b 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">Vytvořeno</translation> <translation id="1067661089446014701">Za účelem zvýšení zabezpečení můžete hesla před uložením do účtu Google v zařízení zašifrovat</translation> <translation id="1067922213147265141">Další služby Google</translation> +<translation id="1069104208554708737">Tento přístupový klíč bude uložen pouze na tomto zařízení</translation> <translation id="1069355737714877171">Odstranit profil eSIM karty s názvem <ph name="PROFILE_NAME" /></translation> <translation id="1069814191880976658">Vybrat jinou obrazovku</translation> <translation id="1070377999570795893">Jiný program ve vašem počítači nainstaloval rozšíření, které může měnit funkce Chromu. @@ -349,6 +350,7 @@ <translation id="1324106254079708331">Chrání osobní účty Google kohokoliv, kdo by mohl být vystaven cíleným útokům</translation> <translation id="1327272175893960498">Lístky Kerberos</translation> <translation id="1327495825214193325">K aktivaci ladění ADB je toto zařízení <ph name="DEVICE_TYPE" /> potřeba restartovat. K vypnutí je potřeba resetovat tovární nastavení.</translation> +<translation id="1327527584824210101">Použití přístupového klíče</translation> <translation id="1327794256477341646">Funkce vyžadující polohu nebudou k dispozici</translation> <translation id="1331977651797684645">To jsem byl(a) já.</translation> <translation id="1333489022424033687">Některé funkce ze zdroje <ph name="ORIGIN" /> nemusí fungovat, dokud neuvolníte data uložená do zařízení z jiných webů</translation> @@ -409,6 +411,7 @@ <translation id="139013308650923562">Mohou používat písma nainstalovaná ve vašem zařízení</translation> <translation id="1390548061267426325">Otevřít jako běžnou kartu</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> nemá oprávnění k tisku na tiskárně <ph name="PRINTER_NAME" />. Obraťte se na administrátora.</translation> +<translation id="1392047138650695757">Uživatelské slovníky</translation> <translation id="1393283411312835250">Slunce a mraky</translation> <translation id="1395730723686586365">Byl spuštěn nástroj na aktualizaci</translation> <translation id="1395832189806039783">Zvýraznit položku pomocí výběru klávesnicí</translation> @@ -1518,6 +1521,7 @@ <translation id="2356070529366658676">Zeptat se</translation> <translation id="2357330829548294574">Odstranit uživatele <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Weby mohou používat JavaScript</translation> +<translation id="2358703245148663432">Jiné zařízení</translation> <translation id="2358777858338503863">Kliknutím povolíte přístup k webu <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Aplikace pro Linux mohou přestat reagovat.</translation> <translation id="2359345697448000899">Chcete-li spravovat rozšíření, klikněte v nabídce Nástroje na příkaz Rozšíření.</translation> @@ -1878,6 +1882,7 @@ <translation id="271033894570825754">Nové</translation> <translation id="2711073837061989559">Zkušební funkce</translation> <translation id="2712173769900027643">Požádat o oprávnění</translation> +<translation id="2712207122921938368">Vytvoření přístupového klíče na jiném zařízení</translation> <translation id="2713106313042589954">Vypnout kameru</translation> <translation id="2713444072780614174">Bílá</translation> <translation id="2714393097308983682">Obchod Google Play</translation> @@ -1892,6 +1897,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Váš administrátor dozorované uživatele zakázal.</translation> <translation id="2722540561488096675">Zařízení se za <ph name="TIME_LEFT" /> vypne. Než ho znovu zapnete, vyjměte z něj USB. Poté můžete zařízení <ph name="DEVICE_OS" /> začít používat.</translation> +<translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">Protokoly WebRTC</translation> <translation id="272488616838512378">Převod jednotek</translation> <translation id="2725200716980197196">Připojení k síti bylo obnoveno</translation> @@ -2389,6 +2395,7 @@ <translation id="3182749001423093222">Kontrola pravopisu</translation> <translation id="3183139917765991655">Nástroj na import profilů</translation> <translation id="3183143381919926261">Mobilní datové sítě</translation> +<translation id="3183613134231754987">Tento přístupový klíč bude uložen pouze ve službě Windows Hello. Zůstane v tomto zařízení i po zavření všech anonymních oken.</translation> <translation id="3183944777708523606">Uspořádání monitorů</translation> <translation id="3184536091884214176">Nastavení nebo správa tiskáren CUPS. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{Tato aplikace je blokována}few{Některé aplikace jsou blokovány}many{Některé aplikace jsou blokovány}other{Některé aplikace jsou blokovány}}</translation> @@ -2870,6 +2877,7 @@ <translation id="3654045516529121250">Čtení nastavení usnadnění přístupu</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Má trvalý přístup k jednomu souboru.}few{Má trvalý přístup ke # souborům.}many{Má trvalý přístup k # souboru.}other{Má trvalý přístup k # souborům.}}</translation> <translation id="3658871634334445293">Akcelerace TrackPointu</translation> +<translation id="3659550105763988702">Přístupový klíč pro <ph name="APP_NAME" /></translation> <translation id="3659929705630080526">Zadali jste příliš mnohokrát nesprávný přístupový kód. Zkuste to znovu později</translation> <translation id="3660234220361471169">Nedůvěryhodný</translation> <translation id="3664511988987167893">Ikona rozšíření</translation> @@ -3066,6 +3074,7 @@ <translation id="3828029223314399057">Hledat v záložkách</translation> <translation id="3828953470056652895">Přečetl(a) jsem si <ph name="BEGIN_LINK1" />smluvní podmínky společnosti Google<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />dodatečné smluvní podmínky prohlížeče Chrome a systému ChromeOS<ph name="END_LINK2" /> a <ph name="BEGIN_LINK3" />smluvní podmínky služby Play<ph name="END_LINK3" /> a souhlasím s nimi.</translation> <translation id="3829765597456725595">Sdílené úložiště SMB</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Administrátor znovu zapnul jedno potenciálně škodlivé rozšíření}few{Administrátor znovu zapnul {NUM_EXTENSIONS} potenciálně škodlivá rozšíření}many{Administrátor znovu zapnul {NUM_EXTENSIONS} potenciálně škodlivého rozšíření}other{Administrátor znovu zapnul {NUM_EXTENSIONS} potenciálně škodlivých rozšíření}}</translation> <translation id="3831436149286513437">Návrhy vyhledávacích dotazů z Disku Google</translation> <translation id="3834728400518755610">Ke změně nastavení přístupu k mikrofonu je Linux potřeba ukončit. Chcete-li pokračovat, ukončete Linux.</translation> @@ -3143,6 +3152,7 @@ <translation id="3898327728850887246">Web <ph name="SITE_NAME" /> žádá o tato oprávnění: <ph name="FIRST_PERMISSION" /> a <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">Vybrat klávesnici</translation> <translation id="3900966090527141178">Export hesel</translation> +<translation id="3902789559055749153">Zvolte, jak chcete vytvořit přístupový klíč pro <ph name="APP_NAME" /></translation> <translation id="3903187154317825986">Vestavěná klávesnice</translation> <translation id="3904326018476041253">Služby určování polohy</translation> <translation id="3904849010307028014">Web může na základě vaší interakce, např. pravidelné přihlašování k účtu, vystavit vašemu prohlížeči token důvěry. Když potom ostatní weby, které navštívíte, najdou platný token důvěry, s větší pravděpodobností s vámi budou nakládat jako s člověkem a ne jako s robotem.</translation> @@ -3471,6 +3481,7 @@ <translation id="4218081191298393750">Kliknutím na ikonu reproduktoru tuto kartu ztlumíte</translation> <translation id="4219558185499589032">Box</translation> <translation id="4220648711404560261">Při aktivaci došlo k chybě.</translation> +<translation id="4223845867739585293">Vytvoření přístupového klíče</translation> <translation id="4225397296022057997">Na všech webech</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Toto rozšíření není povoleno}few{Některá rozšíření nejsou povolena}many{Některá rozšíření nejsou povolena}other{Některá rozšíření nejsou povolena}}</translation> <translation id="4231095370974836764">Instalujte do svého zařízení <ph name="DEVICE_TYPE" /> aplikace a hry z Google Play. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> @@ -4113,6 +4124,7 @@ <translation id="4838907349371614303">Heslo bylo aktualizováno</translation> <translation id="4838958829619609362">Výběr není v jazyce <ph name="LANGUAGE" /></translation> <translation id="4839303808932127586">Uložit &video jako...</translation> +<translation id="4839910546484524995">Zkontrolujte své zařízení</translation> <translation id="4840096453115567876">Přesto anonymní režim ukončit?</translation> <translation id="4841741146571978176">Povinný virtuální počítač neexistuje. Pokud chcete pokračovat, zkuste nastavit virtuální počítač typu <ph name="VM_TYPE" /></translation> <translation id="4842976633412754305">Tato stránka se pokouší načíst skripty z neověřených zdrojů.</translation> @@ -5030,6 +5042,7 @@ <translation id="5729712731028706266">&Zobrazit</translation> <translation id="5731247495086897348">Vl&ožit a přejít</translation> <translation id="5732392974455271431">Rodiče ti jej mohou odblokovat.</translation> +<translation id="5733109311583381874">Pokud si kandidáty konverzí chcete přizpůsobit, přidejte do uživatelského slovníku vlastní slova.</translation> <translation id="5733866499231170760">Neplatné ID. Zadali jste neplatný formát. Projděte si pokyny k zadání správného formátu. Pokud se vám problém nedaří odstranit, nechte pole prázdné a pokračujte v instalaci.</translation> <translation id="5734362860645681824">Komunikační příslušenství</translation> <translation id="5734697361979786483">Přidat sdílené úložiště</translation> @@ -5141,6 +5154,7 @@ <translation id="583431638776747">Web nebyl k dispozici</translation> <translation id="5834581999798853053">Zbývá přibližně <ph name="TIME" /> min</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – probíhá záznam z fotoaparátu nebo mikrofonu</translation> +<translation id="5835625581856809102">Naskenujte tento QR kód pomocí zařízení, ve kterém chcete vytvořit přístupový klíč pro <ph name="APP_NAME" /></translation> <translation id="583673505367439042">Weby mohou žádat o úpravu souborů a složek v zařízení</translation> <translation id="5836999627049108525">Jazyk, ze kterého se má překládat</translation> <translation id="583756221537636748">Pouzdro</translation> @@ -5198,6 +5212,7 @@ <translation id="5884474295213649357">Tato karta je připojena k zařízení USB.</translation> <translation id="5885314688092915589">Tento profil bude spravovat vaše organizace</translation> <translation id="5886009770935151472">Prst 1</translation> +<translation id="5886112770923972514">Připojte se a rychle nastavte zařízení s Rychlým párováním v okolí</translation> <translation id="5886384907280980632">Vypnout</translation> <translation id="5889282057229379085">Maximální počet zprostředkujících certifikačních autorit: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Preferované sítě Wi-Fi</translation> @@ -5379,6 +5394,7 @@ <translation id="6059276912018042191">Nedávno použité karty Chromu</translation> <translation id="6059652578941944813">Hierarchie certifikátů</translation> <translation id="6059925163896151826">Zařízení USB</translation> +<translation id="6061408389284235459">Do zařízení <ph name="DEVICE_NAME" /> bylo odesláno oznámení</translation> <translation id="6063284707309177505">Vytvořit QR kód</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />Poznámka<ph name="END_BOLD" />: K osobním výsledkům uživatele <ph name="SUPERVISED_USER_NAME" /> může získat přístup někdo s podobným hlasem nebo nahrávkou jeho hlasu. Pokud chcete šetřit baterii, můžete v nastavení Asistenta uživatele <ph name="SUPERVISED_USER_NAME" /> nastavit, aby příkaz „Ok Google“ fungoval, jen když je toto zařízení připojené ke zdroji napájení.</translation> <translation id="6064217302520318294">Zámek obrazovky</translation> @@ -5507,6 +5523,7 @@ <translation id="6178664161104547336">Vyberte certifikát</translation> <translation id="6178682841350631965">Vaše přihlašovací údaje byly aktualizovány</translation> <translation id="6180510783007738939">Nástroj Čára</translation> +<translation id="6180550893222597997">Který přístupový klíč chcete pro <ph name="APP_NAME" /> použít?</translation> <translation id="6181431612547969857">Stahování zablokováno</translation> <translation id="6184099524311454384">Hledat karty</translation> <translation id="6185132558746749656">Poloha zařízení</translation> @@ -5946,6 +5963,7 @@ <translation id="6596816719288285829">IP adresa</translation> <translation id="6597017209724497268">Vzory</translation> <translation id="6597331566371766302">Následující rozšíření váš administrátor zablokoval:</translation> +<translation id="6601262427770154296">Spravovat uživatelské slovníky</translation> <translation id="6601612474695404578">Některé weby k načítání svých stránek používají soubory cookie třetích stran. Pokud web nefunguje, můžete zkusit povolit soubory cookie.</translation> <translation id="6602937173026466876">Přístup k vašim tiskárnám</translation> <translation id="6602956230557165253">K navigaci použijte šipky vlevo a vpravo.</translation> @@ -6311,6 +6329,7 @@ <translation id="6943060957016121200">Aktivovat dynamický tethering</translation> <translation id="6943176775188458830">Zrušit tisk</translation> <translation id="6943939122536910181">Odpojeno od zařízení <ph name="DEVICE" /></translation> +<translation id="6944708469742828051">Tento přístupový klíč se uloží pouze do služby Windows Hello</translation> <translation id="6945221475159498467">Vybrat</translation> <translation id="694592694773692225">Na této stránce bylo zablokováno přesměrování.</translation> <translation id="6947015141909171112">Zobrazují se vám recepty na základě nedávné aktivity ve vyhledávání receptů. @@ -6563,6 +6582,7 @@ <translation id="7193051357671784796">Tuto aplikaci přidala vaše organizace. Chcete-li její instalaci dokončit, restartujte ji.</translation> <translation id="7193374945610105795">Pro web <ph name="ORIGIN" /> nejsou uložena žádná hesla</translation> <translation id="7194873994243265344">Vaše organizace tento soubor zablokovala, protože je šifrovaný. Požádejte vlastníka, aby ho dešifroval.</translation> +<translation id="7196272782924897510">Použít přístupový klíč z jiného zařízení?</translation> <translation id="7196913789568937443">Zálohování na Disk Google. Snadno obnovte svá data nebo kdykoliv přejděte na jiné zařízení. Záloha zahrnuje data aplikací. Zálohy se nahrávají do Googlu a šifrují pomocí hesla účtu Google. <ph name="BEGIN_LINK1" />Další informace<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Mějte při procházení internetu vždy k dispozici Vyhledávání Google a chytré funkce Google</translation> <translation id="719791532916917144">Klávesová zkratka</translation> @@ -7061,6 +7081,7 @@ <translation id="7670483791111801022">Titulky</translation> <translation id="7671130400130574146">Použít systémové záhlaví a okraje okna</translation> <translation id="767127784612208024">Potvrďte reset dotykem</translation> +<translation id="7672504401554182757">Zvolte, které zařízení má přístupový klíč pro <ph name="APP_NAME" /></translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" /> na stránce <ph name="PAGE_TITLE" />.</translation> <translation id="7674416868315480713">Deaktivovat všechny porty přesměrovávané v Linuxu</translation> <translation id="7674537509496907005"><ph name="APP_COUNT" /> aplikace</translation> @@ -7171,6 +7192,7 @@ <translation id="7766807826975222231">Spustit prohlídku</translation> <translation id="7766838926148951335">Přijmout oprávnění</translation> <translation id="7767554953520855281">Podrobnosti jsou při sdílení obrazovky skryty</translation> +<translation id="7767972280546034736">Vytvoření přístupového klíče pro <ph name="APP_NAME" /></translation> <translation id="7768507955883790804">Weby, které navštívíte, se automaticky řídí tímto nastavením</translation> <translation id="7768526219335215384"><ph name="ORIGIN" /> bude moci zobrazit soubory ve složce <ph name="FOLDERNAME" /></translation> <translation id="7768770796815395237">Změnit</translation> @@ -7660,6 +7682,7 @@ <translation id="820568752112382238">Nejnavštěvovanější weby</translation> <translation id="8206745257863499010">Melodie</translation> <translation id="8206859287963243715">Mobil</translation> +<translation id="8207404892907560325">Vyberte přístupový klíč</translation> <translation id="8208216423136871611">Neukládat</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Nové oznámení}few{# nová oznámení}many{# nového oznámení}other{# nových oznámení}}</translation> <translation id="821119981794423735">Pokud chcete importovat hesla do Správce hesel Google pro účet <ph name="USER_EMAIL" />, vyberte soubor CSV</translation> @@ -7799,6 +7822,7 @@ <translation id="8338952601723052325">Webové stránky pro vývojáře</translation> <translation id="833986336429795709">Chcete-li otevřít tento odkaz, vyberte aplikaci</translation> <translation id="8340547030807793004">Další akce: <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Zkontrolujte <ph name="BEGIN_BOLD" />1 web<ph name="END_BOLD" />, který nedávno odeslal mnoho oznámení}few{Zkontrolujte <ph name="BEGIN_BOLD" />{NUM_SITES} weby<ph name="END_BOLD" />, které nedávno odeslaly mnoho oznámení}many{Zkontrolujte <ph name="BEGIN_BOLD" />{NUM_SITES} webu<ph name="END_BOLD" />, které nedávno odeslaly mnoho oznámení}other{Zkontrolujte <ph name="BEGIN_BOLD" />{NUM_SITES} webů<ph name="END_BOLD" />, které nedávno odeslaly mnoho oznámení}}</translation> <translation id="8342221978608739536">Nezkoušel(a) jsem to</translation> <translation id="8342861492835240085">Vyberte sbírku</translation> <translation id="8345848587667658367">Nyní můžete zobrazit nedávné fotky, média, oznámení a aplikace v telefonu</translation> @@ -7832,6 +7856,7 @@ <translation id="8376137163494131156">Řekněte nám, co se děje s fungováním technologie Google Cast.</translation> <translation id="8376384591331888629">Včetně souborů cookie třetích stran na tomto webu</translation> <translation id="8376451933628734023">Pokud se vás tato webová aplikace snaží přesvědčit, že se jedná o jinou aplikaci, odinstalujte ji.</translation> +<translation id="8377625247046155446">Tento přístupový klíč bude uložen pouze na tomto zařízení. Zůstane v tomto zařízení i po zavření všech anonymních oken.</translation> <translation id="8378714024927312812">Spravováno vaší organizací</translation> <translation id="8379156816349755485">Po registraci bude uložen unikátní ověřovací token a využíván při všech budoucích aktivních stahováních.</translation> <translation id="8379878387931047019">Toto zařízení typ bezpečnostního klíče požadovaný tímto webem nepodporuje</translation> @@ -8664,6 +8689,7 @@ <ph name="LIST_ITEM" />Spustit Diagnostiku připojení Chrome <ph name="END_LIST" /></translation> <translation id="916607977885256133">Obraz v obraze</translation> +<translation id="9166253503936244008">Naskenujte tento QR kód pomocí zařízení, které má přístupový klíč, jenž chcete použít pro <ph name="APP_NAME" /></translation> <translation id="9167063903968449027">Zobrazit seznam četby</translation> <translation id="9167450455589251456">Profil není podporován</translation> <translation id="9168436347345867845">Později</translation> @@ -8797,6 +8823,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Navazování zabezpečeného připojení...</translation> <translation id="996803490569799917">Prohlédněte si vzpomínky na své oblíbené lidi apod.</translation> +<translation id="997143476478634194">Weby, které navštívíte, se automaticky řídí tímto nastavením. Weby obvykle zasílají oznámení, kterými vás informují o mimořádných zprávách nebo zprávách v chatu.</translation> <translation id="99731366405731005">Chcete-li použít Synchronizaci Wi-Fi, zapněte <ph name="LINK1_BEGIN" />Synchronizaci Chromu<ph name="LINK1_END" />. <ph name="LINK2_BEGIN" />Další informace<ph name="LINK2_END" /></translation> <translation id="998747458861718449">&Prozkoumat</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index c339211..570efb0 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">Crëwyd</translation> <translation id="1067661089446014701">Er mwyn diogelwch ychwanegol, gallwch amgryptio cyfrineiriau ar eich dyfais cyn iddynt gael eu cadw yn eich Cyfrif Google</translation> <translation id="1067922213147265141">Gwasanaethau Google eraill</translation> +<translation id="1069104208554708737">Bydd y cod pas hwn yn cael ei gadw ar y ddyfais hon yn unig</translation> <translation id="1069355737714877171">Tynnu'r proffil eSIM o'r enw <ph name="PROFILE_NAME" /></translation> <translation id="1069814191880976658">Dewiswch sgrîn wahanol</translation> <translation id="1070377999570795893">Ychwanegodd rhaglen arall ar eich cyfrifiadur estyniad a allai newid y ffordd y mae Chrome yn gweithio. @@ -353,6 +354,7 @@ <translation id="1324106254079708331">Yn diogelu Cyfrifon Google personol unrhyw un sydd mewn perygl o ymosodiadau wedi'u targedu</translation> <translation id="1327272175893960498">Tocynnau Kerberos</translation> <translation id="1327495825214193325">Er mwyn galluogi dadfygio ADB, mae angen ailgychwyn y <ph name="DEVICE_TYPE" /> hwn. Er mwyn ei analluogi mae angen ei ailosod i'r gosodiadau ffatri.</translation> +<translation id="1327527584824210101">Defnyddiwch eich cod pas</translation> <translation id="1327794256477341646">Ni fydd nodweddion sydd angen eich lleoliad yn gweithio</translation> <translation id="1331977651797684645">Fi oedd hyn.</translation> <translation id="1333489022424033687">Mae'n bosib na fydd rhai nodweddion ar <ph name="ORIGIN" /> yn gweithio nes i chi glirio data y mae gwefannau eraill wedi'u storio ar eich dyfais</translation> @@ -413,6 +415,7 @@ <translation id="139013308650923562">Caniateir i ddefnyddio ffontiau sydd wedi'u gosod ar eich dyfais</translation> <translation id="1390548061267426325">Agor fel Tab Rheolaidd</translation> <translation id="1390907927270446471">Nid yw <ph name="PROFILE_USERNAME" /> wedi'i awdurdodi i argraffu i <ph name="PRINTER_NAME" />. Cysylltwch â'ch gweinyddwr.</translation> +<translation id="1392047138650695757">Geiriaduron defnyddwyr</translation> <translation id="1393283411312835250">Yr haul a chymylau</translation> <translation id="1395730723686586365">Mae'r rhaglen diweddaru wedi'i ddechrau</translation> <translation id="1395832189806039783">Amlygu eitem gyda ffocws bysellfwrdd</translation> @@ -1534,6 +1537,7 @@ <translation id="2356070529366658676">Gofyn</translation> <translation id="2357330829548294574">Tynnu <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Gall gwefannau ddefnyddio JavaScript</translation> +<translation id="2358703245148663432">Dyfais wahanol</translation> <translation id="2358777858338503863">Cliciwch i ganiatáu ar <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Gall apiau Linux ddod yn anymatebol.</translation> <translation id="2359345697448000899">Rheoli eich estyniadau drwy glicio Estyniadau yn y ddewislen Offer.</translation> @@ -1894,6 +1898,7 @@ <translation id="271033894570825754">Newydd</translation> <translation id="2711073837061989559">Profion</translation> <translation id="2712173769900027643">Gofyn am ganiatâd</translation> +<translation id="2712207122921938368">Creu cod pas ar ddyfais arall</translation> <translation id="2713106313042589954">Diffodd y camera</translation> <translation id="2713444072780614174">Gwyn</translation> <translation id="2714393097308983682">Google Play Store</translation> @@ -1908,6 +1913,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Mae defnyddwyr dan oruchwyliaeth wedi'u hanalluogi gan eich gweinyddwr.</translation> <translation id="2722540561488096675">Bydd eich dyfais yn diffodd mewn <ph name="TIME_LEFT" />. Tynnwch yr USB cyn troi eich dyfais yn ôl ymlaen. Yna gallwch ddechrau defnyddio <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">Rhif adnabod: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">Cofnodion WebRTC</translation> <translation id="272488616838512378">Trosi Uned</translation> <translation id="2725200716980197196">Adferwyd cysylltedd rhwydwaith</translation> @@ -2405,6 +2411,7 @@ <translation id="3182749001423093222">Gwirio sillafu</translation> <translation id="3183139917765991655">Mewnforiwr Proffiliau</translation> <translation id="3183143381919926261">Rhwydweithiau data symudol</translation> +<translation id="3183613134231754987">Bydd y cod pas hwn yn cael ei gadw yn Windows Hello yn unig. Bydd yn aros ar y ddyfais hon ar ôl i chi gau pob ffenestr Anhysbys.</translation> <translation id="3183944777708523606">Trefniant monitorau</translation> <translation id="3184536091884214176">Gosod neu reoli argraffwyr CUPS. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{Mae'r ap hwn wedi'i rwystro}zero{Mae rhai apiau wedi'u rhwystro}two{Mae rhai apiau wedi'u rhwystro}few{Mae rhai apiau wedi'u rhwystro}many{Mae rhai apiau wedi'u rhwystro}other{Mae rhai apiau wedi'u rhwystro}}</translation> @@ -2886,6 +2893,7 @@ <translation id="3654045516529121250">Darllen eich gosodiadau hygyrchedd</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Mae ganddo fynediad parhaol at un ffeil.}zero{Mae ganddo fynediad parhaol at # ffeil.}two{Mae ganddo fynediad parhaol at # ffeil.}few{Mae ganddo fynediad parhaol at # ffeil.}many{Mae ganddo fynediad parhaol at # ffeil.}other{Mae ganddo fynediad parhaol at # ffeil.}}</translation> <translation id="3658871634334445293">Cyflymiad TrackPoint</translation> +<translation id="3659550105763988702">Defnyddiwch eich cod pas ar gyfer <ph name="APP_NAME" /></translation> <translation id="3659929705630080526">Rydych wedi rhoi cod mynediad anghywir ormod o weithiau. Rhowch gynnig arall arni'n nes ymlaen</translation> <translation id="3660234220361471169">Annibynadwy</translation> <translation id="3664511988987167893">Eicon Estyniad</translation> @@ -3082,6 +3090,7 @@ <translation id="3828029223314399057">Chwilio nodau tudalen</translation> <translation id="3828953470056652895">Rydw i wedi darllen ac yn cytuno i <ph name="BEGIN_LINK1" />Delerau Gwasanaeth Google<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Telerau Gwasanaeth Ychwanegol Chrome a ChromeOS<ph name="END_LINK2" /> a <ph name="BEGIN_LINK3" />Thelerau Gwasanaeth Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">Cyfran ffeil SMB</translation> +<translation id="3830268140528557982">ar <ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Mae eich gweinyddwr wedi troi 1 estyniad a allai fod yn niweidiol ymlaen eto}zero{Mae eich gweinyddwr wedi troi {NUM_EXTENSIONS} estyniad a allai fod yn niweidiol ymlaen eto}two{Mae eich gweinyddwr wedi troi {NUM_EXTENSIONS} estyniad a allai fod yn niweidiol ymlaen eto}few{Mae eich gweinyddwr wedi troi {NUM_EXTENSIONS} estyniad a allai fod yn niweidiol ymlaen eto}many{Mae eich gweinyddwr wedi troi {NUM_EXTENSIONS} estyniad a allai fod yn niweidiol ymlaen eto}other{Mae eich gweinyddwr wedi troi {NUM_EXTENSIONS} estyniad a allai fod yn niweidiol ymlaen eto}}</translation> <translation id="3831436149286513437">Awgrymiadau chwilio Google Drive</translation> <translation id="3834728400518755610">Mae'r newid yn y gosodiad meicroffon yn ei gwneud yn ofynnol i Linux gau. Caewch Linux i barhau.</translation> @@ -3159,6 +3168,7 @@ <translation id="3898327728850887246">Mae <ph name="SITE_NAME" /> am: <ph name="FIRST_PERMISSION" /> a <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">Dewis bysellfwrdd</translation> <translation id="3900966090527141178">Allforio cyfrineiriau</translation> +<translation id="3902789559055749153">Dewiswch sut rydych am greu cod pas ar gyfer <ph name="APP_NAME" /></translation> <translation id="3903187154317825986">Bysellfwrdd Integredig</translation> <translation id="3904326018476041253">Gwasanaethau Lleoliad</translation> <translation id="3904849010307028014">Yn seiliedig ar eich rhyngweithiad gyda gwefan, megis mewngofnodi i gyfrif yn rheolaidd, gall y wefan honno roi tocyn ymddiriedaeth i'ch porwr. Yn nes ymlaen, os bydd gwefannau eraill rydych yn ymweld â nhw yn dod o hyd i docyn ymddiriedaeth dilys, maent yn fwy tebygol o'ch trin fel person ac nid bot.</translation> @@ -3488,6 +3498,7 @@ <translation id="4218081191298393750">Cliciwch yr eicon seinydd i ddistewi'r tab hwn</translation> <translation id="4219558185499589032">Blwch</translation> <translation id="4220648711404560261">Bu gwall wrth weithredu.</translation> +<translation id="4223845867739585293">Creu cod pas</translation> <translation id="4225397296022057997">Ar bob gwefan</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Ni chaniateir yr estyniad hwn}zero{Ni chaniateir rhai estyniadau}two{Ni chaniateir rhai estyniadau}few{Ni chaniateir rhai estyniadau}many{Ni chaniateir rhai estyniadau}other{Ni chaniateir rhai estyniadau}}</translation> <translation id="4231095370974836764">Gosod apiau a gemau o Google Play ar eich <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> @@ -4131,6 +4142,7 @@ <translation id="4838907349371614303">Diweddarwyd y cyfrinair</translation> <translation id="4838958829619609362">Nid yw'r dewis yn <ph name="LANGUAGE" /></translation> <translation id="4839303808932127586">Ca&dw'r fideo fel...</translation> +<translation id="4839910546484524995">Gwiriwch eich dyfais</translation> <translation id="4840096453115567876">Gadael y modd Anhysbys beth bynnag?</translation> <translation id="4841741146571978176">Nid oes peiriant rhithwir gofynnol yn bodoli. Rhowch gynnig ar osod <ph name="VM_TYPE" /> i barhau</translation> <translation id="4842976633412754305">Mae'r dudalen hon yn ceisio llwytho sgriptiau o ffynonellau sydd heb eu dilysu.</translation> @@ -5049,6 +5061,7 @@ <translation id="5729712731028706266">&Gwedd</translation> <translation id="5731247495086897348">Gl&udo a Mynd</translation> <translation id="5732392974455271431">Gall eich rhieni ei ddadrwystro ar eich rhan</translation> +<translation id="5733109311583381874">Ychwanegwch eich geiriau eich hun i'r geiriaduron defnyddwyr er mwyn addasu'r ymgeiswyr trosi.</translation> <translation id="5733866499231170760">Rhif adnabod annilys. Mae'r fformat a roddwyd gennych yn anghywir. Gwiriwch y cyfarwyddiadau a gawsoch i sicrhau eich bod yn rhoi'r rhif adnabod yn y fformat cywir. Os na allwch ddatrys y broblem hon, gadewch y maes yn wag a pharhau i osod.</translation> <translation id="5734362860645681824">Cyfathrebiadau</translation> <translation id="5734697361979786483">Ychwanegu cyfran ffeil</translation> @@ -5160,6 +5173,7 @@ <translation id="583431638776747">Nid oedd y wefan ar gael</translation> <translation id="5834581999798853053">Tua <ph name="TIME" /> o funudau ar ôl</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - Mae'r camera neu'r meicroffon yn recordio</translation> +<translation id="5835625581856809102">Sganiwch y cod QR hwn gyda'r ddyfais lle rydych am greu cod pas ar gyfer <ph name="APP_NAME" /></translation> <translation id="583673505367439042">Gall gwefannau ofyn am olygu ffeiliau a ffolderi ar eich dyfais</translation> <translation id="5836999627049108525">Iaith i Gyfieithu ohoni</translation> <translation id="583756221537636748">Cyflwr</translation> @@ -5217,6 +5231,7 @@ <translation id="5884474295213649357">Mae'r tab hwn wedi'i gysylltu â dyfais USB.</translation> <translation id="5885314688092915589">Bydd eich sefydliad yn rheoli'r proffil hwn</translation> <translation id="5886009770935151472">Bys 1</translation> +<translation id="5886112770923972514">Cysylltwch a gosodwch ddyfeisiau Paru Cyflym yn gyflym gerllaw</translation> <translation id="5886384907280980632">Diffodd nawr</translation> <translation id="5889282057229379085">Uchafswm y CA canolradd: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Rhwydweithiau Wi-Fi a ffefrir</translation> @@ -5399,6 +5414,7 @@ <translation id="6059276912018042191">Tabiau Chrome diweddar</translation> <translation id="6059652578941944813">Hierarchaeth Tystysgrifau</translation> <translation id="6059925163896151826">Dyfeisiau USB</translation> +<translation id="6061408389284235459">Anfonwyd hysbysiad at <ph name="DEVICE_NAME" /></translation> <translation id="6063284707309177505">Creu Cod QR</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />Sylwer:<ph name="END_BOLD" /> Mae'n bosib y bydd llais neu recordiad tebyg yn gallu cael mynediad at ganlyniadau personol <ph name="SUPERVISED_USER_NAME" />. I arbed batri, gallwch ddewis i gael "Hei Google" ymlaen yng ngosodiadau Assistant <ph name="SUPERVISED_USER_NAME" /> ar y ddyfais hon pan fydd wedi'i chysylltu â chyflenwad pŵer yn unig.</translation> <translation id="6064217302520318294">Clo sgrîn</translation> @@ -5527,6 +5543,7 @@ <translation id="6178664161104547336">Dewiswch dystysgrif</translation> <translation id="6178682841350631965">Cafodd eich data mewngofnodi eu diweddaru</translation> <translation id="6180510783007738939">Offeryn Llinell</translation> +<translation id="6180550893222597997">Pa god pas ydych chi am ei ddefnyddio ar gyfer <ph name="APP_NAME" />?</translation> <translation id="6181431612547969857">Rhwystrwyd y lawrlwythiad</translation> <translation id="6184099524311454384">Chwilio Tabiau</translation> <translation id="6185132558746749656">Lleoliad Dyfais</translation> @@ -5970,6 +5987,7 @@ <translation id="6596816719288285829">Cyfeiriad IP</translation> <translation id="6597017209724497268">Samplau</translation> <translation id="6597331566371766302">Cafodd yr estyniadau canlynol eu rhwystro gan eich gweinyddwr:</translation> +<translation id="6601262427770154296">Rheoli geiriaduron defnyddwyr</translation> <translation id="6601612474695404578">Mae rhai gwefannau yn defnyddio cwcis trydydd parti i lwytho eu tudalennau. Os nad yw gwefan yn gweithio, gallwch roi cynnig ar ganiatáu cwcis.</translation> <translation id="6602937173026466876">Cael mynediad at eich argraffwyr</translation> <translation id="6602956230557165253">Defnyddiwch y bysellau saeth chwith a de i lywio.</translation> @@ -6335,6 +6353,7 @@ <translation id="6943060957016121200">Galluogi Rhannu Cysylltiad Sydyn</translation> <translation id="6943176775188458830">Canslo'r argraffu</translation> <translation id="6943939122536910181">Wedi datgysylltu o <ph name="DEVICE" /></translation> +<translation id="6944708469742828051">Bydd y cod pas hwn yn cael ei gadw yn Windows Hello yn unig</translation> <translation id="6945221475159498467">Dewis</translation> <translation id="694592694773692225">Mae ailgyfeirio wedi'i rwystro ar y dudalen hon.</translation> <translation id="6947015141909171112">Rydych yn gweld ryseitiau yn seiliedig ar eich Gweithgarwch chwilio diweddar ar gyfer ryseitiau. @@ -6587,6 +6606,7 @@ <translation id="7193051357671784796">Cafodd yr ap hwn ei ychwanegu gan eich sefydliad. Ailgychwynnwch yr ap er mwyn gorffen ei osod.</translation> <translation id="7193374945610105795">Ni chadwyd unrhyw gyfrineiriau ar gyfer <ph name="ORIGIN" /></translation> <translation id="7194873994243265344">Gwnaeth eich sefydliad rwystro'r ffeil hon oherwydd ei bod wedi'i hamgryptio. Gofynnwch i'w pherchennog ddadgryptio.</translation> +<translation id="7196272782924897510">Defnyddiwch god pas o ddyfais arall?</translation> <translation id="7196913789568937443">Gwneud copi wrth gefn yn Google Drive. Adfer eich data neu newid dyfais yn hawdd ar unrhyw adeg. Mae eich copïau wrth gefn yn cynnwys data apiau. Mae eich copïau wrth gefn yn cael eu huwchlwytho i Google a'u hamgryptio gan ddefnyddio eich cyfrinair Cyfrif Google. <ph name="BEGIN_LINK1" />Dysgu rhagor<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Cael Google Search a buddion Google bob tro y byddwch yn pori</translation> <translation id="719791532916917144">Llwybr byr bysellfwrdd</translation> @@ -7085,6 +7105,7 @@ <translation id="7670483791111801022">Isdeitlau</translation> <translation id="7671130400130574146">Defnyddio bar teitl ac ymylon y system</translation> <translation id="767127784612208024">Cyffyrddwch i gadarnhau ailosod</translation> +<translation id="7672504401554182757">Dewiswch pa ddyfais sydd â'r cod pas ar gyfer <ph name="APP_NAME" /></translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, yn <ph name="PAGE_TITLE" />.</translation> <translation id="7674416868315480713">Dadweithredu pob porth sy'n cael ei anfon ymlaen yn Linux</translation> <translation id="7674537509496907005"><ph name="APP_COUNT" /> ap</translation> @@ -7195,6 +7216,7 @@ <translation id="7766807826975222231">Mynd ar daith</translation> <translation id="7766838926148951335">Derbyn caniatadau</translation> <translation id="7767554953520855281">Mae manylion yn cael eu cuddio wrth i chi rannu'ch sgrîn</translation> +<translation id="7767972280546034736">Creu cod pas ar gyfer <ph name="APP_NAME" /></translation> <translation id="7768507955883790804">Bydd gwefannau'n dilyn y gosodiad hwn yn awtomatig wrth i chi ymweld â nhw</translation> <translation id="7768526219335215384">Bydd <ph name="ORIGIN" /> yn gallu gweld ffeiliau yn <ph name="FOLDERNAME" /></translation> <translation id="7768770796815395237">Newid</translation> @@ -7683,6 +7705,7 @@ <translation id="820568752112382238">Gwefannau yr ymwelwyd â nhw y mwyaf</translation> <translation id="8206745257863499010">Bluesy</translation> <translation id="8206859287963243715">Symudol</translation> +<translation id="8207404892907560325">Dewiswch god pas</translation> <translation id="8208216423136871611">Peidiwch â chadw</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Hysbysiad newydd}zero{# hysbysiad newydd}two{# hysbysiad newydd}few{# hysbysiad newydd}many{# hysbysiad newydd}other{# hysbysiad newydd}}</translation> <translation id="821119981794423735">I fewnforio cyfrineiriau i Reolwr Cyfrineiriau Google ar gyfer <ph name="USER_EMAIL" />, dewiswch ffeil CSV</translation> @@ -7822,6 +7845,7 @@ <translation id="8338952601723052325">Gwefan datblygwyr</translation> <translation id="833986336429795709">I agor y ddolen hon, dewiswch ap</translation> <translation id="8340547030807793004">Rhagor o gamau gweithredu ar gyfer <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Adolygwch <ph name="BEGIN_BOLD" />1 wefan<ph name="END_BOLD" /> a anfonodd lawer o hysbysiadau yn ddiweddar}zero{Adolygwch <ph name="BEGIN_BOLD" />{NUM_SITES} gwefan<ph name="END_BOLD" /> a anfonodd lawer o hysbysiadau yn ddiweddar}two{Adolygwch <ph name="BEGIN_BOLD" />{NUM_SITES} wefan<ph name="END_BOLD" /> a anfonodd lawer o hysbysiadau yn ddiweddar}few{Adolygwch <ph name="BEGIN_BOLD" />{NUM_SITES} gwefan<ph name="END_BOLD" /> a anfonodd lawer o hysbysiadau yn ddiweddar}many{Adolygwch <ph name="BEGIN_BOLD" />{NUM_SITES} gwefan<ph name="END_BOLD" /> a anfonodd lawer o hysbysiadau yn ddiweddar}other{Adolygwch <ph name="BEGIN_BOLD" />{NUM_SITES} gwefan<ph name="END_BOLD" /> a anfonodd lawer o hysbysiadau yn ddiweddar}}</translation> <translation id="8342221978608739536">Heb geisio</translation> <translation id="8342861492835240085">Dewis casgliad</translation> <translation id="8345848587667658367">Gallwch bellach weld lluniau, cyfryngau, hysbysiadau ac apiau diweddar eich ffôn</translation> @@ -7855,6 +7879,7 @@ <translation id="8376137163494131156">Dywedwch wrthym beth sy'n digwydd gyda Google Cast.</translation> <translation id="8376384591331888629">Gan gynnwys cwcis trydydd parti ar y wefan hon</translation> <translation id="8376451933628734023">Os mae'r ap gwe yn ceisio eich twyllo i feddwl ei fod yn ap gwahanol, dadosodwch ef.</translation> +<translation id="8377625247046155446">Bydd y cod pas hwn yn cael ei gadw ar y ddyfais hon yn unig. Bydd yn aros ar y ddyfais hon ar ôl i chi gau pob ffenestr Anhysbys.</translation> <translation id="8378714024927312812">Rheolir gan eich sefydliad</translation> <translation id="8379156816349755485">Wrth fewngofnodi, bydd tocyn dilysu unigryw yn cael ei storio a'i ddefnyddio ar gyfer pob lawrlwythiad cymwys yn y dyfodol.</translation> <translation id="8379878387931047019">Nid yw'r ddyfais hon yn cefnogi'r math o allwedd ddiogelwch y mae'r wefan hon yn gofyn amdani</translation> @@ -8689,6 +8714,7 @@ <ph name="LIST_ITEM" />Rhedeg Diagnosteg Cysylltedd Chrome <ph name="END_LIST" /></translation> <translation id="916607977885256133">Llun mewn Llun</translation> +<translation id="9166253503936244008">Sganiwch y cod QR hwn gyda'r ddyfais sydd â'r cod pas rydych am ei ddefnyddio ar gyfer <ph name="APP_NAME" /></translation> <translation id="9167063903968449027">Dangos y Rhestr Ddarllen</translation> <translation id="9167450455589251456">Ni chefnogir y proffil</translation> <translation id="9168436347345867845">Gwneud e'n nes ymlaen</translation> @@ -8822,6 +8848,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Wrthi'n sefydlu cysylltiad diogel...</translation> <translation id="996803490569799917">Gweld atgofion o'ch hoff bobl a rhagor</translation> +<translation id="997143476478634194">Bydd gwefannau'n dilyn y gosodiad hwn yn awtomatig wrth i chi ymweld â nhw. Mae gwefannau fel arfer yn anfon hysbysiadau i roi gwybod i chi am newyddion yn torri neu negeseuon sgwrsio.</translation> <translation id="99731366405731005">Trowch <ph name="LINK1_BEGIN" />Cysoni Chrome<ph name="LINK1_END" /> ymlaen i ddefnyddio Cysoni Wi-Fi. <ph name="LINK2_BEGIN" />Dysgu rhagor<ph name="LINK2_END" /></translation> <translation id="998747458861718449">A&rchwilio</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 81e41a76..59bddc0 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1258,6 +1258,7 @@ <translation id="2135787500304447609">&Genoptag</translation> <translation id="2136372518715274136">Angiv ny adgangskode</translation> <translation id="2136476978468204130">Den adgangssætning, du angav, er forkert.</translation> +<translation id="2137128126782078222">Tillad ikke notifikationer fra <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Afventer tilladelse ...</translation> <translation id="2139919072249842737">Knappen Konfigurer</translation> <translation id="2140788884185208305">Batteriets tilstand</translation> @@ -1910,6 +1911,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Administrerede brugere er deaktiveret af din administrator.</translation> <translation id="2722540561488096675">Din enhed lukker ned om <ph name="TIME_LEFT" />. Fjern USB-enheden, før du tænder enheden igen. Derefter kan du begynde at bruge <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">Id: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC-logfiler</translation> <translation id="272488616838512378">Enhedsomregning</translation> <translation id="2725200716980197196">Forbindelsen til netværket er genoprettet</translation> @@ -2498,6 +2500,7 @@ <translation id="3281892622610078515">Filer og programmer, der skal i karantæne:</translation> <translation id="3282210178675490297">Deler en fane med <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Ny &fane</translation> +<translation id="3285500645985761267">Giv relaterede websites tilladelse til at se din aktivitet i gruppen</translation> <translation id="328571385944182268">Vil du gemme dine adgangskoder?</translation> <translation id="3288047731229977326">Udvidelser, der kører i udviklertilstand, kan skade din computer. Hvis du ikke er udvikler, skal du deaktivere udvidelserne, der kører i udviklertilstand, af hensyn til sikkerheden.</translation> <translation id="3289668031376215426">Skriv automatisk med stort</translation> @@ -2772,6 +2775,7 @@ <translation id="3541823293333232175">Tildelt</translation> <translation id="3543393733900874979">Opdateringen mislykkedes (fejl: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">X9.62 ECDSA-signatur med SHA-512</translation> +<translation id="3544058026430919413">En virksomhed kan definere en gruppe af websites, der kan bruge cookies til at dele din aktivitet i gruppen. Dette er deaktiveret i inkognitotilstand.</translation> <translation id="3544879808695557954">Brugernavn (valgfrit)</translation> <translation id="354602065659584722">Den skadelige software er slettet</translation> <translation id="3547954654003013442">Proxyindstillinger</translation> @@ -2911,6 +2915,7 @@ <translation id="3681548574519135185">Tastaturfokus</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> anmoder om at dele din skærm</translation> <translation id="3685598397738512288">Præferencer for USB i Linux</translation> +<translation id="3687598459967813435">Tillad altid notifikationer fra <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Der opstod en fejl under forsøg på at skrive filen: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Skrive til filer og mapper, som du åbner i applikationen</translation> <translation id="3688526734140524629">Skift kanal</translation> @@ -3083,6 +3088,7 @@ <translation id="3828029223314399057">Søg i bogmærker</translation> <translation id="3828953470056652895">Jeg har læst og accepterer <ph name="BEGIN_LINK1" />Googles servicevilkår<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />de yderligere vilkår for Chrome og ChromeOS<ph name="END_LINK2" /> og <ph name="BEGIN_LINK3" />servicevilkårene for Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">SMV-fildeling</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Din administrator har genaktiveret 1 potentielt skadelig udvidelse}one{Din administrator har genaktiveret {NUM_EXTENSIONS} potentielt skadelig udvidelse}other{Din administrator har genaktiveret {NUM_EXTENSIONS} potentielt skadelige udvidelser}}</translation> <translation id="3831436149286513437">Google Drev-søgeforslag</translation> <translation id="3834728400518755610">Ændringen af mikrofonindstillingen kræver, at Linux skal lukkes ned. Luk Linux ned for at fortsætte.</translation> @@ -4072,6 +4078,7 @@ <translation id="4779766576531456629">Omdøb eSIM-mobilnetværk</translation> <translation id="4780321648949301421">Gem side som...</translation> <translation id="4781443161433589743">Du anvender Chromes stærkeste beskyttelse</translation> +<translation id="4781584184731045253">Ryd data og tilladelser</translation> <translation id="4782861709165039462">Alle mikrofoner er deaktiveret af hardwarekontakten på enhederne</translation> <translation id="4785719467058219317">Du bruger en sikkerhedsnøgle, som ikke er registreret på dette website</translation> <translation id="4785914069240823137">Annuller beskæring</translation> @@ -4753,6 +4760,7 @@ <translation id="5449551289610225147">Ugyldig adgangskode</translation> <translation id="5449588825071916739">Tilføj alle faner som bogmærker</translation> <translation id="5449716055534515760">Luk vin&due</translation> +<translation id="545133051331995777">Ingen netværksforbindelse</translation> <translation id="5452446625764825792">Du kan nu se din telefons seneste billeder, medier og apps</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (fungerer offline)</translation> <translation id="5454166040603940656">med <ph name="PROVIDER" /></translation> @@ -4796,6 +4804,7 @@ <translation id="5487521232677179737">Ryd data</translation> <translation id="5488093641312826914">"<ph name="COPIED_ITEM_NAME" />" er kopieret</translation> <translation id="5488508217173274228">Indstillinger for synkronisering af kryptering</translation> +<translation id="5489077378642700219">Tillad ikke notifikationer fra <ph name="WEBSITE" />, men spørg senere</translation> <translation id="5489435190927933437">Gemte adgangskoder til <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Afbryd forbindelsen til Bluetooth-enhed</translation> <translation id="5490798133083738649">Tillad, at Linux får adgang til din mikrofon</translation> @@ -5134,6 +5143,7 @@ <translation id="5805697420284793859">Vinduesadministrator</translation> <translation id="5806447147478173900">Samlet lagerplads, der bruges af de viste websites: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (standard)</translation> +<translation id="5809835394668218762">Flere handlinger for <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled skal være aktiveret under chrome://flags</translation> <translation id="5810809306422959727">Denne konto er ikke kvalificeret til forældreindstillinger</translation> <translation id="5811614940486072060">Denne fil er ikke downloadet på almindelig vis og kan være skadelig</translation> @@ -5148,6 +5158,7 @@ <translation id="5826395379250998812">Opret forbindelse til <ph name="DEVICE_TYPE" /> med din telefon. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Halvtransparent</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Vis websites i samme gruppe</translation> <translation id="5827733057563115968">Forudsigelse af næste ord</translation> <translation id="5828545842856466741">Tilføj profil...</translation> <translation id="5828633471261496623">Udskriver...</translation> @@ -5219,6 +5230,7 @@ <translation id="5884474295213649357">Denne fane er sluttet til en USB-enhed.</translation> <translation id="5885314688092915589">Din organisation administrerer denne profil</translation> <translation id="5886009770935151472">Finger 1</translation> +<translation id="5886112770923972514">Du kan hurtigt oprette forbindelse til og konfigurere enheder i nærheden med Hurtig parring</translation> <translation id="5886384907280980632">Deaktiver nu</translation> <translation id="5889282057229379085">Maksimalt antal mellemliggende CA'er: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Foretrukne Wi-Fi-netværk</translation> @@ -5263,6 +5275,7 @@ <translation id="5927232971138258197">Denne udvidelse kan læse og ændre <ph name="HOST" /></translation> <translation id="592740088639760830">Stop denne container</translation> <translation id="592880897588170157">Download PDF-filer, i stedet for at de åbnes automatisk i Chrome</translation> +<translation id="5928969282301718193">Det var det hele for denne gang</translation> <translation id="592919310198008711">Når jeg klikker på udvidelsen</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> kræver, at du opdaterer din <ph name="DEVICE_TYPE" /> med det samme.</translation> <translation id="5932224571077948991">Websitet viser påtrængende eller vildledende annoncer</translation> @@ -5437,6 +5450,7 @@ <translation id="6087746524533454243">Leder du efter siden Om for browseren? Gå til</translation> <translation id="6087960857463881712">Fantastisk-smiley</translation> <translation id="608912389580139775">Klik på bogmærkeikonet for at føje denne side til din læseliste</translation> +<translation id="6091116443517744502">tjek din internetforbindelse, og prøv igen</translation> <translation id="6091761513005122595">Delingen blev anvendt.</translation> <translation id="6093803049406781019">Slet profil</translation> <translation id="6093888419484831006">Annullerer opdatering...</translation> @@ -6103,6 +6117,7 @@ <translation id="6736243959894955139">Adresse</translation> <translation id="6737393581255281855">Vil du rydde de viste data?</translation> <translation id="6737663862851963468">Fjern Kerberos-billet</translation> +<translation id="6738180164164974883">Giv tilladelse til at gemme tredjepartscookies</translation> <translation id="6738430949033571771">Bekræfter kontoen...</translation> <translation id="6739923123728562974">Vis genvej på skrivebordet</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> er sat på pause</translation> @@ -6300,6 +6315,7 @@ <translation id="691106080621596509">Denne handling rydder alle de data og cookies, der er gemt af <ph name="SITE_GROUP_NAME" />, eventuelle websites i denne gruppe og de apps, den har installeret</translation> <translation id="6911734910326569517">Hukommelsesforbrug</translation> <translation id="6912007319859991306">SIM-pinkode til mobilnetværk</translation> +<translation id="6912380255120084882">Prøv en anden enhed</translation> <translation id="691289340230098384">Præferencer for undertekster</translation> <translation id="6914783257214138813">Dine adgangskoder vil være synlige for alle, der kan se den eksporterede fil.</translation> <translation id="6916590542764765824">Administrer udvidelser</translation> @@ -6612,6 +6628,7 @@ <translation id="7222204278952406003">Chrome er din standardbrowser</translation> <translation id="7222232353993864120">Mailadresse</translation> <translation id="7222235798733126207">Begrænset deling mellem websites</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 website i gruppen tilhørende <ph name="FPS_OWNER" />}one{{MEMBERS} website i gruppen tilhørende <ph name="FPS_OWNER" />}other{{MEMBERS} websites i gruppen tilhørende <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Brug Windows Hello til at udfylde adgangskoder</translation> <translation id="7225179976675429563">Netværkstype mangler</translation> <translation id="7227458944009118910">De apps, der er angivet nedenfor, kan også håndtere protokollinks. Andre apps beder om tilladelse.</translation> @@ -7125,6 +7142,7 @@ <translation id="7709152031285164251">Mislykket - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Cast...</translation> <translation id="7711900714716399411">Forbind din telefon til computeren med et USB-kabel. Hvis din telefon allerede er tilsluttet, skal du tage stikket ud og sætte det i igen.</translation> +<translation id="7711968363685835633">Deaktiver brugerdefinerede konverteringer og forslag samt brugerordbog</translation> <translation id="7712739869553853093">Dialogboks for udskriftsvisning</translation> <translation id="7714307061282548371">Cookies fra <ph name="DOMAIN" /> er tilladt</translation> <translation id="7714464543167945231">Certifikat</translation> @@ -7197,6 +7215,7 @@ <translation id="7768770796815395237">Skift</translation> <translation id="7768784765476638775">Tekstoplæsning</translation> <translation id="7769748505895274502">Skjul senest lukkede</translation> +<translation id="7770072242481632881">Sidepanelvælger</translation> <translation id="7770406201819593386">Kør ChromeOS Flex-diagnostiktest.</translation> <translation id="7770450735129978837">Højre museknap</translation> <translation id="7770612696274572992">Billede kopieret fra en anden enhed</translation> @@ -7819,6 +7838,7 @@ <translation id="8338952601723052325">Udviklerens website</translation> <translation id="833986336429795709">Vælg en app for at åbne dette link</translation> <translation id="8340547030807793004">Flere handlinger for <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Gennemgå <ph name="BEGIN_BOLD" />1 website<ph name="END_BOLD" />, som har sendt mange notifikationer for nylig}one{Gennemgå <ph name="BEGIN_BOLD" />{NUM_SITES} website<ph name="END_BOLD" />, som har sendt mange notifikationer for nylig}other{Gennemgå <ph name="BEGIN_BOLD" />{NUM_SITES} websites<ph name="END_BOLD" />, som har sendt mange notifikationer for nylig}}</translation> <translation id="8342221978608739536">Jeg prøvede ikke</translation> <translation id="8342861492835240085">Vælg en samling</translation> <translation id="8345848587667658367">Du kan nu se din telefons seneste billeder, medier, notifikationer og apps</translation> @@ -7832,6 +7852,7 @@ <translation id="8353683614194668312">Den kan:</translation> <translation id="8354034204605718473">Dit barns pinkode er tilføjet</translation> <translation id="8356197132883132838"><ph name="TITLE" /> – <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Du har allerede registreret denne enhed. Du behøver ikke at registrere den igen.</translation> <translation id="8357388086258943206">Der opstod en fejl under installationen af Linux</translation> <translation id="8358685469073206162">Vil du gendanne siderne?</translation> <translation id="8358912028636606457">Det er ikke muligt at caste lyd fra faner på denne enhed.</translation> @@ -8818,6 +8839,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Etablerer sikker forbindelse...</translation> <translation id="996803490569799917">Se minder med dine yndlingspersoner og meget mere</translation> +<translation id="997143476478634194">Websites følger automatisk denne indstilling, når du besøger dem. Websites sender normalt notifikationer for at informere dig om breaking news eller chatbeskeder.</translation> <translation id="99731366405731005">Aktivér <ph name="LINK1_BEGIN" />Chrome-synkronisering<ph name="LINK1_END" /> for at bruge Wi-Fi-synkronisering. <ph name="LINK2_BEGIN" />Få flere oplysninger<ph name="LINK2_END" /></translation> <translation id="998747458861718449">U&ndersøg</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 96ca507..e738b1c 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1239,6 +1239,7 @@ <translation id="2135787500304447609">&Fortsetzen</translation> <translation id="2136372518715274136">Neues Passwort eingeben</translation> <translation id="2136476978468204130">Du hast eine ungültige Passphrase eingegeben</translation> +<translation id="2137128126782078222">Keine Benachrichtigungen von <ph name="WEBSITE" /> zulassen</translation> <translation id="2137891579555018930">Berechtigung steht aus…</translation> <translation id="2139919072249842737">Schaltfläche zum Einrichten</translation> <translation id="2140788884185208305">Akkuzustand</translation> @@ -1886,6 +1887,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Betreute Nutzer wurden von deinem Administrator deaktiviert.</translation> <translation id="2722540561488096675">Dein Gerät wird in <ph name="TIME_LEFT" /> heruntergefahren. Trenne das USB-Gerät, bevor du das Gerät neu startest. Anschließend kannst du <ph name="DEVICE_OS" /> verwenden.</translation> +<translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC-Protokolle</translation> <translation id="272488616838512378">Umrechnen von Einheiten</translation> <translation id="2725200716980197196">Netzwerkverbindung wiederhergestellt</translation> @@ -2473,6 +2475,7 @@ <translation id="3281892622610078515">Dateien und Programme, die unter Quarantäne gestellt werden:</translation> <translation id="3282210178675490297">Tab wird mit <ph name="APP_NAME" /> geteilt</translation> <translation id="3285322247471302225">Neuer &Tab</translation> +<translation id="3285500645985761267">Ähnliche Websites dürfen meine Aktivitäten in der Gruppe sehen</translation> <translation id="328571385944182268">Passwörter speichern?</translation> <translation id="3288047731229977326">Erweiterungen im Entwicklermodus können auf deinem Computer Schaden anrichten. Wenn du kein Entwickler bist, solltest du diese Erweiterungen im Entwicklermodus deaktivieren, um sicher zu sein.</translation> <translation id="3289668031376215426">Automatische Groß-/Kleinschreibung</translation> @@ -2747,6 +2750,7 @@ <translation id="3541823293333232175">Zugewiesen</translation> <translation id="3543393733900874979">Fehler bei der Aktualisierung (Fehler: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">X9.62-ECDSA-Signatur mit SHA-512</translation> +<translation id="3544058026430919413">Ein Unternehmen kann eine Gruppe von Websites festlegen, die deine Aktivitäten in der Gruppe mithilfe von Cookies teilen. Im Inkognitomodus ist diese Funktion deaktiviert.</translation> <translation id="3544879808695557954">Nutzername (optional)</translation> <translation id="354602065659584722">Schädliche Software entfernt</translation> <translation id="3547954654003013442">Proxy-Einstellungen</translation> @@ -2885,6 +2889,7 @@ <translation id="3681548574519135185">Fokusring</translation> <translation id="3683524264665795342">Anfrage zur Bildschirmfreigabe durch <ph name="APP_NAME" /></translation> <translation id="3685598397738512288">Linux-USB-Einstellungen</translation> +<translation id="3687598459967813435">Benachrichtigungen von <ph name="WEBSITE" /> immer zulassen</translation> <translation id="368789413795732264">Beim Versuch, in die Datei <ph name="ERROR_TEXT" /> zu schreiben, ist ein Fehler aufgetreten.</translation> <translation id="3688507211863392146">In Dateien und Ordner schreiben, die du in der Anwendung öffnest</translation> <translation id="3688526734140524629">Kanal ändern</translation> @@ -3057,6 +3062,7 @@ <translation id="3828029223314399057">In Lesezeichen suchen</translation> <translation id="3828953470056652895">Ich habe die <ph name="BEGIN_LINK1" />Nutzungsbedingungen von Google<ph name="END_LINK1" /> und <ph name="BEGIN_LINK2" />die zusätzlichen Nutzungsbedingungen für Google Chrome und Chrome OS<ph name="END_LINK2" /> sowie die <ph name="BEGIN_LINK3" />Google Play-Nutzungsbedingungen<ph name="END_LINK3" /> gelesen und stimme ihnen zu.</translation> <translation id="3829765597456725595">SMB-Netzwerkfreigabe</translation> +<translation id="3830268140528557982">auf <ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Dein Administrator hat 1 potenziell schädliche Erweiterung wieder aktiviert}other{Dein Administrator hat {NUM_EXTENSIONS} potenziell schädliche Erweiterungen wieder aktiviert}}</translation> <translation id="3831436149286513437">Google Drive-Suchvorschläge</translation> <translation id="3834728400518755610">Nach der Änderung der Mikrofoneinstellungen muss Linux heruntergefahren werden. Linux herunterfahren, um fortzufahren.</translation> @@ -4043,6 +4049,7 @@ <translation id="4779766576531456629">eSIM-Mobilfunknetz umbenennen</translation> <translation id="4780321648949301421">Seite speichern unter...</translation> <translation id="4781443161433589743">Du nutzt die höchste Sicherheit in Chrome</translation> +<translation id="4781584184731045253">Daten und Berechtigungen löschen</translation> <translation id="4782861709165039462">Alle Mikrofone wurden durch den Hardwareschalter des Geräts deaktiviert</translation> <translation id="4785719467058219317">Du verwendest einen Sicherheitsschlüssel, der nicht auf dieser Website registriert ist</translation> <translation id="4785914069240823137">Zuschneiden abbrechen</translation> @@ -4723,6 +4730,7 @@ <translation id="5449551289610225147">Ungültiges Passwort</translation> <translation id="5449588825071916739">Alle Tabs als Lesezeichen speichern</translation> <translation id="5449716055534515760">Fen&ster schließen</translation> +<translation id="545133051331995777">Keine Netzwerkverbindung</translation> <translation id="5452446625764825792">Du kannst jetzt die neuesten Fotos, Medien und Apps von deinem Smartphone aufrufen</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (funktioniert im Offlinemodus)</translation> <translation id="5454166040603940656">mit <ph name="PROVIDER" /></translation> @@ -4766,6 +4774,7 @@ <translation id="5487521232677179737">Daten löschen</translation> <translation id="5488093641312826914">"<ph name="COPIED_ITEM_NAME" />" kopiert</translation> <translation id="5488508217173274228">Verschlüsselungsoptionen synchronisieren</translation> +<translation id="5489077378642700219">Benachrichtigungen von <ph name="WEBSITE" /> nicht zulassen, später noch einmal fragen</translation> <translation id="5489435190927933437">Gespeicherte Passwörter für <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Bluetooth-Gerät trennen</translation> <translation id="5490798133083738649">Linux Zugriff auf mein Mikrofon erlauben</translation> @@ -5101,6 +5110,7 @@ <translation id="5805697420284793859">Fenstermanager</translation> <translation id="5806447147478173900">Von angezeigten Websites belegter Speicherplatz insgesamt: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Standard)</translation> +<translation id="5809835394668218762">Weitere Aktionen für „<ph name="WEBSITE" />“</translation> <translation id="5810603387504252966">#borealis-enabled muss unter chrome://flags aktiviert sein</translation> <translation id="5810809306422959727">Dieses Konto lässt keine Jugendschutzeinstellungen zu</translation> <translation id="5811614940486072060">Diese Datei ist ein ungewöhnlicher Download und könnte schädlich sein</translation> @@ -5115,6 +5125,7 @@ <translation id="5826395379250998812"><ph name="DEVICE_TYPE" /> mit Smartphone verbinden. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Halbtransparent</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Websites in derselben Gruppe anzeigen</translation> <translation id="5827733057563115968">Vervollständigung des nächsten Wortes</translation> <translation id="5828545842856466741">Profil hinzufügen…</translation> <translation id="5828633471261496623">Wird gedruckt...</translation> @@ -5185,6 +5196,7 @@ <translation id="5884474295213649357">Dieser Tab ist mit einem USB-Gerät verbunden.</translation> <translation id="5885314688092915589">Dieses Profil wird von deiner Organisation verwaltet</translation> <translation id="5886009770935151472">Finger 1</translation> +<translation id="5886112770923972514">Geräte in der Nähe mit der Funktion „Schnelles Pairing“ ganz leicht verbinden und einrichten</translation> <translation id="5886384907280980632">Jetzt deaktivieren</translation> <translation id="5889282057229379085">Maximal zulässige Anzahl an Zwischenzertifizierungsstellen: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Bevorzugte WLANs</translation> @@ -5229,6 +5241,7 @@ <translation id="5927232971138258197">Diese Erweiterung kann <ph name="HOST" /> lesen und ändern</translation> <translation id="592740088639760830">Diesen Container anhalten</translation> <translation id="592880897588170157">PDF-Dateien herunterladen, anstatt sie automatisch in Chrome zu öffnen</translation> +<translation id="5928969282301718193">Das ist im Moment alles</translation> <translation id="592919310198008711">Wenn ich die Erweiterung anklicke</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> erfordert, dass das Gerät (<ph name="DEVICE_TYPE" />) sofort aktualisiert wird.</translation> <translation id="5932224571077948991">Website zeigt aufdringliche oder irreführende Werbung an</translation> @@ -5401,6 +5414,7 @@ <translation id="6087746524533454243">Suchst du die Seite „Über den Browser“? Gehe zu</translation> <translation id="6087960857463881712">Cooles Gesicht</translation> <translation id="608912389580139775">Wenn du deiner Leseliste diese Seite hinzufügen möchtest, klicke auf das Lesezeichensymbol</translation> +<translation id="6091116443517744502">Prüfe die Internetverbindung und versuch es noch einmal</translation> <translation id="6091761513005122595">Freigabe wurde erfolgreich bereitgestellt.</translation> <translation id="6093803049406781019">Profil löschen</translation> <translation id="6093888419484831006">Aktualisierung wird abgebrochen...</translation> @@ -6063,6 +6077,7 @@ <translation id="6736243959894955139">Adresse</translation> <translation id="6737393581255281855">Daten angezeigter Websites löschen?</translation> <translation id="6737663862851963468">Kerberos-Ticket entfernen</translation> +<translation id="6738180164164974883">Drittanbieter-Cookies zulassen</translation> <translation id="6738430949033571771">Konto wird überprüft…</translation> <translation id="6739923123728562974">Desktopverknüpfung einblenden</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> angehalten</translation> @@ -6260,6 +6275,7 @@ <translation id="691106080621596509">Dadurch werden alle Daten und Cookies gelöscht, die von <ph name="SITE_GROUP_NAME" />, ihren untergeordneten Websites und der zugehörigen installierten App gespeichert wurden</translation> <translation id="6911734910326569517">Speicherbedarf</translation> <translation id="6912007319859991306">PIN für SIM-Karte</translation> +<translation id="6912380255120084882">Anderes Gerät verwenden</translation> <translation id="691289340230098384">Untertitel-Einstellungen</translation> <translation id="6914783257214138813">Deine Passwörter sind für jeden zugänglich, der die exportierte Passwortdatei aufrufen kann.</translation> <translation id="6916590542764765824">Erweiterungen verwalten</translation> @@ -6570,6 +6586,7 @@ <translation id="7222204278952406003">Chrome ist dein Standardbrowser</translation> <translation id="7222232353993864120">E-Mail-Adresse</translation> <translation id="7222235798733126207">Eingeschränkte Datenweitergabe zwischen Websites</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 Website in der Gruppe von <ph name="FPS_OWNER" />}other{{MEMBERS} Websites in der Gruppe von <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Windows Hello beim Ausfüllen von Passwörtern verwenden</translation> <translation id="7225179976675429563">Netzwerktyp fehlt.</translation> <translation id="7227458944009118910">Die unten aufgeführten Apps können auch Protokolllinks verarbeiten. Für andere Apps ist eine Berechtigung erforderlich.</translation> @@ -7082,6 +7099,7 @@ <translation id="7709152031285164251">Fehler – <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Streamen...</translation> <translation id="7711900714716399411">Verbinde dein Smartphone über ein USB-Kabel mit deinem Computer. Wenn dein Smartphone schon verbunden ist, trenne die Verbindung und schließe es wieder an.</translation> +<translation id="7711968363685835633">Personalisierte Konvertierungen und Vorschläge sowie mein Wörterbuch deaktivieren</translation> <translation id="7712739869553853093">Dialogfeld zur Druckvorschau</translation> <translation id="7714307061282548371">Cookies von <ph name="DOMAIN" /> zugelassen</translation> <translation id="7714464543167945231">Zertifikat</translation> @@ -7153,6 +7171,7 @@ <translation id="7768770796815395237">Ändern</translation> <translation id="7768784765476638775">Vorlesen</translation> <translation id="7769748505895274502">Kürzlich geschlossene Tabs minimieren</translation> +<translation id="7770072242481632881">Seitenleistenauswahl</translation> <translation id="7770406201819593386">Chrome OS Flex-Diagnose durchführen.</translation> <translation id="7770450735129978837">Mit der rechten Maustaste klicken</translation> <translation id="7770612696274572992">Bild wurde von einem anderen Gerät kopiert</translation> @@ -7775,6 +7794,7 @@ <translation id="8338952601723052325">Website des Entwicklers</translation> <translation id="833986336429795709">App auswählen, um diesen Link zu öffnen</translation> <translation id="8340547030807793004">Weitere Aktionen für „<ph name="DEVICE" />“</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Hier kannst du dir <ph name="BEGIN_BOLD" />1 Website<ph name="END_BOLD" /> ansehen, die in letzter Zeit viele Benachrichtigungen gesendet hat}other{Hier kannst du dir <ph name="BEGIN_BOLD" />{NUM_SITES}<ph name="END_BOLD" /> Websites ansehen, die in letzter Zeit viele Benachrichtigungen gesendet haben}}</translation> <translation id="8342221978608739536">Nicht ausprobiert</translation> <translation id="8342861492835240085">Sammlung auswählen</translation> <translation id="8345848587667658367">Du kannst jetzt die neuesten Fotos, Medien, Benachrichtigungen und Apps von deinem Smartphone ansehen</translation> @@ -7788,6 +7808,7 @@ <translation id="8353683614194668312">Berechtigungen:</translation> <translation id="8354034204605718473">Die PIN deines Kindes wurde hinzugefügt</translation> <translation id="8356197132883132838"><ph name="TITLE" /> – <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Du hast dieses Gerät bereits registriert. Es muss nicht noch einmal registriert werden.</translation> <translation id="8357388086258943206">Fehler beim Installieren von Linux</translation> <translation id="8358685469073206162">Seiten wiederherstellen?</translation> <translation id="8358912028636606457">Das Audio-Streaming von einem Tab wird auf diesem Gerät nicht unterstützt.</translation> @@ -8770,6 +8791,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Sichere Verbindung wird hergestellt...</translation> <translation id="996803490569799917">Erinnerungen deiner Liebsten und mehr</translation> +<translation id="997143476478634194">Wenn du Websites aufrufst, wird diese Einstellung automatisch angewendet. Websites senden normalerweise Benachrichtigungen, um dich über Eilmeldungen oder Chatnachrichten zu informieren.</translation> <translation id="99731366405731005"><ph name="LINK1_BEGIN" />Chrome-Synchronisierung<ph name="LINK1_END" /> aktivieren, um die WLAN-Synchronisation zu verwenden. <ph name="LINK2_BEGIN" />Weitere Informationen<ph name="LINK2_END" /></translation> <translation id="998747458861718449">Untersuchen</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 1c22ee6..0e96741 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1257,6 +1257,7 @@ <translation id="2135787500304447609">&Συνέχιση</translation> <translation id="2136372518715274136">Εισαγωγή νέου κωδικού πρόσβασης</translation> <translation id="2136476978468204130">Η φράση πρόσβασης που έχετε εισαγάγει είναι εσφαλμένη</translation> +<translation id="2137128126782078222">Να μην επιτρέπονται οι ειδοποιήσεις από <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Αναμονή για άδεια…</translation> <translation id="2139919072249842737">Κουμπί ρύθμισης</translation> <translation id="2140788884185208305">Κατάσταση μπαταρίας</translation> @@ -2498,6 +2499,7 @@ <translation id="3281892622610078515">Αρχεία και προγράμματα για καραντίνα:</translation> <translation id="3282210178675490297">Κοινοποίηση καρτέλας στην εφαρμογή <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Νέα &Καρτέλα</translation> +<translation id="3285500645985761267">Να επιτρέπεται σε σχετικούς ιστοτόπους να βλέπουν τη δραστηριότητά σας στην ομάδα</translation> <translation id="328571385944182268">Αποθήκευση των κωδικών πρόσβασής σας;</translation> <translation id="3288047731229977326">Οι επεκτάσεις που εκτελούνται σε λειτουργία προγραμματιστή μπορούν να βλάψουν τον υπολογιστή σας. Εάν δεν είστε προγραμματιστής, θα πρέπει να απενεργοποιήσετε αυτές τις επεκτάσεις που εκτελούνται σε λειτουργία προγραμματιστή για να διατηρήσετε την ασφάλειά σας.</translation> <translation id="3289668031376215426">Αυτόματη χρήση κεφαλαίων</translation> @@ -2772,6 +2774,7 @@ <translation id="3541823293333232175">Έχει ανατεθεί</translation> <translation id="3543393733900874979">Αποτυχία ενημέρωσης (σφάλμα: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">Υπογραφή X9.62 ECDSA με SHA-512</translation> +<translation id="3544058026430919413">Μια εταιρεία μπορεί να ορίσει μια ομάδα ιστοτόπων που μπορούν να χρησιμοποιούν cookie για την κοινοποίηση της δραστηριότητάς σας στην ομάδα. Αυτή η επιλογή είναι απενεργοποιημένη στην Ανώνυμη περιήγηση.</translation> <translation id="3544879808695557954">Όνομα χρήστη (προαιρετικά)</translation> <translation id="354602065659584722">Το επιβλαβές λογισμικό καταργήθηκε</translation> <translation id="3547954654003013442">Ρυθμίσεις διακομιστή μεσολάβησης</translation> @@ -2911,6 +2914,7 @@ <translation id="3681548574519135185">Δακτύλιος εστίασης</translation> <translation id="3683524264665795342">Αίτημα κοινής χρήσης οθόνης από την εφαρμογή <ph name="APP_NAME" /></translation> <translation id="3685598397738512288">Προτιμήσεις USB Linux</translation> +<translation id="3687598459967813435">Να επιτρέπονται πάντα οι ειδοποιήσεις από <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Παρουσιάστηκε σφάλμα κατά την απόπειρα εγγραφής στο αρχείο <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Εγγραφή σε αρχεία και φακέλους που ανοίγετε στην εφαρμογή</translation> <translation id="3688526734140524629">Αλλαγή καναλιού</translation> @@ -4073,6 +4077,7 @@ <translation id="4779766576531456629">Μετονομασία δικτύου κινητής τηλεφωνίας eSIM</translation> <translation id="4780321648949301421">Αποθήκευση σελίδας &ως...</translation> <translation id="4781443161433589743">Χρησιμοποιείτε την ισχυρότερη ασφάλεια του Chrome</translation> +<translation id="4781584184731045253">Διαγραφή δεδομένων και αδειών</translation> <translation id="4782861709165039462">Όλα τα μικρόφωνα απενεργοποιήθηκαν από τον διακόπτη εξοπλισμού συσκευών</translation> <translation id="4785719467058219317">Χρησιμοποιείτε ένα κλειδί ασφαλείας το οποίο δεν είναι εγγεγραμμένο σε αυτόν τον ιστότοπο</translation> <translation id="4785914069240823137">Ακύρωση περικοπής</translation> @@ -4754,6 +4759,7 @@ <translation id="5449551289610225147">Μη έγκυρος κωδικός πρόσβασης</translation> <translation id="5449588825071916739">Δημιουργία σελιδοδείκτη για όλες τις καρτέλες</translation> <translation id="5449716055534515760">Κλείσιμο παραθύρου</translation> +<translation id="545133051331995777">Δεν υπάρχει σύνδεση δικτύου</translation> <translation id="5452446625764825792">Μπορείτε πλέον να βλέπετε τις πρόσφατες φωτογραφίες, τα μέσα και τις εφαρμογές του τηλεφώνου σας.</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (λειτουργεί εκτός σύνδεσης)</translation> <translation id="5454166040603940656">με <ph name="PROVIDER" /></translation> @@ -4797,6 +4803,7 @@ <translation id="5487521232677179737">Διαγραφή δεδομένων</translation> <translation id="5488093641312826914">Το στοιχείο "<ph name="COPIED_ITEM_NAME" />" αντιγράφηκε</translation> <translation id="5488508217173274228">Εμφάνιση επιλογών κρυπτογράφησης</translation> +<translation id="5489077378642700219">Να μην επιτρέπονται οι ειδοποιήσεις από <ph name="WEBSITE" /> αλλά να γίνει ερώτηση αργότερα</translation> <translation id="5489435190927933437">Αποθηκευμένοι κωδικοί πρόσβασης για τον τομέα <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Αποσύνδεση συσκευής Bluetooth</translation> <translation id="5490798133083738649">Να επιτρέπεται στο Linux να αποκτήσει πρόσβαση στο μικρόφωνό σας</translation> @@ -5136,6 +5143,7 @@ <translation id="5805697420284793859">Διαχείριση παραθύρου</translation> <translation id="5806447147478173900">Συνολικός αποθηκευτικός χώρος που χρησιμοποιείται από ιστοτόπους που προβάλλονται: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Προεπιλογή)</translation> +<translation id="5809835394668218762">Περισσότερες ενέργειες για <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">Το #borealis-enabled πρέπει να είναι ενεργοποιημένο στο chrome://flags</translation> <translation id="5810809306422959727">Αυτός ο λογαριασμός δεν είναι κατάλληλος για γονικούς ελέγχους</translation> <translation id="5811614940486072060">Δεν πραγματοποιείται συχνά λήψη αυτού του αρχείου και ενδέχεται να είναι επικίνδυνο</translation> @@ -5150,6 +5158,7 @@ <translation id="5826395379250998812">Συνδέστε τη συσκευή <ph name="DEVICE_TYPE" /> με το τηλέφωνό σας. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Ημιδιαφανές</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Εμφάνιση ιστοτόπων στην ίδια ομάδα</translation> <translation id="5827733057563115968">Πρόβλεψη επόμενης λέξης</translation> <translation id="5828545842856466741">Προσθήκη προφίλ…</translation> <translation id="5828633471261496623">Εκτύπωση...</translation> @@ -5266,6 +5275,7 @@ <translation id="5927232971138258197">Αυτή η επέκταση μπορεί να διαβάσει και να αλλάξει τον ιστότοπο <ph name="HOST" /></translation> <translation id="592740088639760830">Διακοπή αυτού του κοντέινερ</translation> <translation id="592880897588170157">Λήψη αρχείων PDF αντί για αυτόματο άνοιγμα στο Chrome</translation> +<translation id="5928969282301718193">Όλα έτοιμα προς το παρόν</translation> <translation id="592919310198008711">Όταν κάνω κλικ σε μια επέκταση</translation> <translation id="5932209916647644605">Ο τομέας <ph name="MANAGER" /> απαιτεί να ενημερώσετε άμεσα τη συσκευή <ph name="DEVICE_TYPE" />.</translation> <translation id="5932224571077948991">Ο ιστότοπος εμφανίζει παρεμβατικές ή παραπλανητικές διαφημίσεις</translation> @@ -5440,6 +5450,7 @@ <translation id="6087746524533454243">Αναζητάτε τη σελίδα πληροφοριών του προγράμματος περιήγησης; Επισκεφτείτε τη σελίδα</translation> <translation id="6087960857463881712">Καταπληκτικό πρόσωπο</translation> <translation id="608912389580139775">Για να προσθέσετε αυτήν τη σελίδα στη λίστα ανάγνωσής σας, κάντε κλικ στο εικονίδιο σελιδοδείκτη</translation> +<translation id="6091116443517744502">ελέγξτε τη σύνδεση στο διαδίκτυο και δοκιμάστε ξανά</translation> <translation id="6091761513005122595">Το σύστημα κοινοποίησης προσαρτήθηκε επιτυχώς.</translation> <translation id="6093803049406781019">Διαγραφή προφίλ</translation> <translation id="6093888419484831006">Ακύρωση ενημέρωσης...</translation> @@ -6104,6 +6115,7 @@ <translation id="6736243959894955139">Διεύθυνση</translation> <translation id="6737393581255281855">Να διαγραφούν τα δεδομένα που προβάλλονται;</translation> <translation id="6737663862851963468">Κατάργηση εισιτηρίου Kerberos</translation> +<translation id="6738180164164974883">Να επιτρέπεται ο ορισμός cookie τρίτου μέρους</translation> <translation id="6738430949033571771">Επαλήθευση λογαριασμού…</translation> <translation id="6739923123728562974">Εμφάνιση συντόμευσης επιφάνειας εργασίας</translation> <translation id="6740234557573873150">Το αρχείο <ph name="FILE_NAME" /> τέθηκε σε παύση</translation> @@ -6301,6 +6313,7 @@ <translation id="691106080621596509">Με αυτήν την ενέργεια θα διαγραφούν όλα τα δεδομένα και τα cookie που έχουν αποθηκευτεί από την ομάδα ιστοτόπων <ph name="SITE_GROUP_NAME" /> τυχόν ιστοτόπους που περιλαμβάνονται σε αυτήν και την εγκατεστημένη εφαρμογή τους.</translation> <translation id="6911734910326569517">Αποτύπωμα μνήμης</translation> <translation id="6912007319859991306">PIN κάρτας SIM δικτύου κινητής τηλεφωνίας</translation> +<translation id="6912380255120084882">Δοκιμή διαφορετικής συσκευής</translation> <translation id="691289340230098384">Προτιμήσεις υπότιτλων</translation> <translation id="6914783257214138813">Οι κωδικοί πρόσβασής σας θα είναι ορατοί σε οποιονδήποτε μπορεί να δει το αρχείο εξαγωγής.</translation> <translation id="6916590542764765824">Διαχείριση επεκτάσεων</translation> @@ -6613,6 +6626,7 @@ <translation id="7222204278952406003">Το Chrome είναι το προεπιλεγμένο σας πρόγραμμα περιήγησης.</translation> <translation id="7222232353993864120">Διεύθυνση ηλεκτρονικού ταχυδρομείου</translation> <translation id="7222235798733126207">Περιορισμένη κοινοποίηση μεταξύ ιστοτόπων</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 ιστότοπος στην ομάδα <ph name="FPS_OWNER" />}other{{MEMBERS} ιστότοποι στην ομάδα <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Χρήση του Windows Hello κατά τη συμπλήρωση κωδικών πρόσβασης</translation> <translation id="7225179976675429563">Ο τύπος δικτύου λείπει</translation> <translation id="7227458944009118910">Οι εφαρμογές που παρατίθενται παρακάτω μπορούν επίσης να χειρίζονται συνδέσμους πρωτοκόλλου. Οι άλλες εφαρμογές θα ζητούν άδεια.</translation> @@ -7126,6 +7140,7 @@ <translation id="7709152031285164251">Αποτυχία - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Μετάδοση…</translation> <translation id="7711900714716399411">Χρησιμοποιήστε ένα καλώδιο USB για να συνδέσετε το τηλέφωνο στον υπολογιστή σας. Εάν το τηλέφωνό σας είναι ήδη συνδεδεμένο, αποσυνδέστε το και συνδέστε το ξανά.</translation> +<translation id="7711968363685835633">Απενεργοποίηση εξατομικευμένων μετατροπών και προτάσεων, καθώς και του λεξικού χρήστη</translation> <translation id="7712739869553853093">Παράθυρο διαλόγου προεπισκόπησης εκτύπωσης</translation> <translation id="7714307061282548371">Τα cookie από τον τομέα <ph name="DOMAIN" /> επιτρέπονται</translation> <translation id="7714464543167945231">Πιστοποιητικό</translation> @@ -7198,6 +7213,7 @@ <translation id="7768770796815395237">Αλλαγή</translation> <translation id="7768784765476638775">Επιλέξτε για αυτόματη ανάγνωση</translation> <translation id="7769748505895274502">Σύμπτυξη στοιχείου που έκλεισε πρόσφατα</translation> +<translation id="7770072242481632881">Επιλογέας πλαϊνού πλαισίου</translation> <translation id="7770406201819593386">Εκτέλεση διαγνωστικών ελέγχων ChromeOS Flex.</translation> <translation id="7770450735129978837">Δεξί κλικ με το ποντίκι</translation> <translation id="7770612696274572992">Η εικόνα αντιγράφηκε από άλλη συσκευή</translation> @@ -7835,6 +7851,7 @@ <translation id="8353683614194668312">Έχει τις εξής δυνατότητες:</translation> <translation id="8354034204605718473">Προστέθηκε το PIN του παιδιού σας</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Έχετε ήδη εγγράψει αυτήν τη συσκευή. Δεν χρειάζεται να την εγγράψετε ξανά.</translation> <translation id="8357388086258943206">Σφάλμα εγκατάστασης Linux</translation> <translation id="8358685469073206162">Να γίνει επαναφορά σελίδων;</translation> <translation id="8358912028636606457">Η μετάδοση του ήχου καρτέλας δεν υποστηρίζεται σε αυτήν τη συσκευή.</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index c3bbaaf..e33cba0 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1242,6 +1242,7 @@ <translation id="2135787500304447609">&Reanudar</translation> <translation id="2136372518715274136">Escribe una contraseña nueva</translation> <translation id="2136476978468204130">La frase de contraseña que has introducido no es correcta</translation> +<translation id="2137128126782078222">No permitir notificaciones de <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Esperando permiso...</translation> <translation id="2139919072249842737">Botón de configuración</translation> <translation id="2140788884185208305">Salud de la batería</translation> @@ -2478,6 +2479,7 @@ <translation id="3281892622610078515">Archivos y programas que se pondrán en cuarentena:</translation> <translation id="3282210178675490297">Compartiendo una pestaña con <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Nueva &pestaña</translation> +<translation id="3285500645985761267">Permitir que los sitios relacionados vean tu actividad en el grupo</translation> <translation id="328571385944182268">¿Quieres guardar tus contraseñas?</translation> <translation id="3288047731229977326">Las extensiones que se ejecutan en modo de desarrollador pueden causar daños en el ordenador. Si no eres desarrollador, debes inhabilitar esas extensiones para mantener protegido tu ordenador.</translation> <translation id="3289668031376215426">Mayúsculas automáticas</translation> @@ -2752,6 +2754,7 @@ <translation id="3541823293333232175">Asignado</translation> <translation id="3543393733900874979">Se ha producido un error durante la actualización (error: <ph name="ERROR_NUMBER" />).</translation> <translation id="3543597750097719865">Firma X9.62 ECDSA con SHA-512</translation> +<translation id="3544058026430919413">Una empresa puede definir un grupo de sitios que pueden usar cookies para compartir tu actividad dentro del grupo. Esta función está desactivada en el modo Incógnito.</translation> <translation id="3544879808695557954">Nombre de usuario (opcional)</translation> <translation id="354602065659584722">Se ha eliminado software dañino</translation> <translation id="3547954654003013442">Configuración de proxy</translation> @@ -2890,6 +2893,7 @@ <translation id="3681548574519135185">Anillo de enfoque</translation> <translation id="3683524264665795342">Solicitud de <ph name="APP_NAME" /> para compartir pantalla</translation> <translation id="3685598397738512288">Preferencias de USB en Linux</translation> +<translation id="3687598459967813435">Permitir siempre las notificaciones de <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Se ha producido un error al intentar escribir el archivo: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Escribe en archivos y carpetas que abras en la aplicación</translation> <translation id="3688526734140524629">Cambiar canal</translation> @@ -4048,6 +4052,7 @@ <translation id="4779766576531456629">Cambiar nombre de la red móvil de eSIM</translation> <translation id="4780321648949301421">Guardar página como...</translation> <translation id="4781443161433589743">Estás usando la seguridad más potente de Chrome.</translation> +<translation id="4781584184731045253">Borrar datos y permisos</translation> <translation id="4782861709165039462">Todos los micrófonos inhabilitados mediante interruptor de hardware del dispositivo</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> @@ -4728,6 +4733,7 @@ <translation id="5449551289610225147">La contraseña no es válida</translation> <translation id="5449588825071916739">Añadir todas las pestañas a marcadores...</translation> <translation id="5449716055534515760">Cerrar &ventana</translation> +<translation id="545133051331995777">No hay conexión de red</translation> <translation id="5452446625764825792">Ahora puedes consultar las fotos, el contenido multimedia y las aplicaciones recientes de tu teléfono</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (funciona sin conexión)</translation> <translation id="5454166040603940656">con <ph name="PROVIDER" /></translation> @@ -4771,6 +4777,7 @@ <translation id="5487521232677179737">Borrar datos</translation> <translation id="5488093641312826914">Se ha copiado <ph name="COPIED_ITEM_NAME" /></translation> <translation id="5488508217173274228">Opciones de cifrado de sincronización</translation> +<translation id="5489077378642700219">No permitir las notificaciones de <ph name="WEBSITE" />, pero preguntar más adelante</translation> <translation id="5489435190927933437">Contraseñas guardadas de <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Desconectar dispositivo Bluetooth</translation> <translation id="5490798133083738649">Permitir a Linux acceder a tu micrófono</translation> @@ -5108,6 +5115,7 @@ <translation id="5805697420284793859">Administrador de ventanas</translation> <translation id="5806447147478173900">Almacenamiento total usado por sitios mostrados: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Predeterminado)</translation> +<translation id="5809835394668218762">Más acciones de <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled debe estar habilitado en chrome://flags</translation> <translation id="5810809306422959727">Esta cuenta no es apta para el control parental</translation> <translation id="5811614940486072060">Este archivo no se descarga habitualmente y puede ser peligroso.</translation> @@ -5122,6 +5130,7 @@ <translation id="5826395379250998812">Conecta tu <ph name="DEVICE_TYPE" /> al teléfono. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Semitransparente</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Mostrar sitios del mismo grupo</translation> <translation id="5827733057563115968">Sugerencia de siguiente palabra</translation> <translation id="5828545842856466741">Añadir perfil...</translation> <translation id="5828633471261496623">Imprimiendo...</translation> @@ -5237,6 +5246,7 @@ <translation id="5927232971138258197">Esta extensión puede leer y modificar <ph name="HOST" /></translation> <translation id="592740088639760830">Detener este contenedor</translation> <translation id="592880897588170157">Descargar archivos PDF en lugar de abrirlos automáticamente en Chrome</translation> +<translation id="5928969282301718193">Todo listo por ahora</translation> <translation id="592919310198008711">Cuando haga clic en la extensión</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> necesita que actualices tu <ph name="DEVICE_TYPE" /> de inmediato.</translation> <translation id="5932224571077948991">El sitio web muestra anuncios invasivos o engañosos</translation> @@ -5410,6 +5420,7 @@ <translation id="6087746524533454243">¿Buscas la página de información del navegador? Visita</translation> <translation id="6087960857463881712">Cara de emoción</translation> <translation id="608912389580139775">Para añadir esta página a tu lista de lectura, haz clic en el icono de marcadores</translation> +<translation id="6091116443517744502">comprueba tu conexión a Internet y vuelve a intentarlo</translation> <translation id="6091761513005122595">El recurso compartido se ha activado correctamente.</translation> <translation id="6093803049406781019">Eliminar perfil</translation> <translation id="6093888419484831006">Cancelando la actualización...</translation> @@ -6072,6 +6083,7 @@ <translation id="6736243959894955139">Dirección</translation> <translation id="6737393581255281855">¿Borrar datos mostrados?</translation> <translation id="6737663862851963468">Quitar ticket de Kerberos</translation> +<translation id="6738180164164974883">Permitir establecer cookies de terceros</translation> <translation id="6738430949033571771">Verificando cuenta...</translation> <translation id="6739923123728562974">Mostrar acceso directo del escritorio</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> en pausa</translation> @@ -6269,6 +6281,7 @@ <translation id="691106080621596509">Esta acción borrará todos los datos y las cookies guardados por <ph name="SITE_GROUP_NAME" />, por los sitios que contenga y por su aplicación instalada</translation> <translation id="6911734910326569517">Uso de memoria</translation> <translation id="6912007319859991306">PIN de la SIM del móvil</translation> +<translation id="6912380255120084882">Prueba con otro dispositivo</translation> <translation id="691289340230098384">Preferencias de subtítulos</translation> <translation id="6914783257214138813">Cualquier usuario que pueda ver el archivo exportado podrá ver tus contraseñas.</translation> <translation id="6916590542764765824">Gestionar extensiones</translation> @@ -6579,6 +6592,7 @@ <translation id="7222204278952406003">Chrome es tu navegador predeterminado</translation> <translation id="7222232353993864120">Dirección de correo electrónico</translation> <translation id="7222235798733126207">Limitación de lo que se comparte entre sitios</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 sitio en el grupo de <ph name="FPS_OWNER" />}other{{MEMBERS} sitios en el grupo de <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Usar Windows Hello al rellenar contraseñas</translation> <translation id="7225179976675429563">Falta el tipo de red.</translation> <translation id="7227458944009118910">Las aplicaciones que se indican abajo también pueden procesar enlaces de protocolo. Otras aplicaciones pedirán permiso.</translation> @@ -7091,6 +7105,7 @@ <translation id="7709152031285164251">Error: <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Enviar...</translation> <translation id="7711900714716399411">Usa un cable USB para conectar el teléfono al ordenador. Si el teléfono ya está conectado, desconéctalo y vuelve a conectarlo.</translation> +<translation id="7711968363685835633">Inhabilitar conversiones y sugerencias personalizadas, así como el diccionario del usuario</translation> <translation id="7712739869553853093">Cuadro de diálogo de la vista previa de impresión</translation> <translation id="7714307061282548371">Se han habilitado las cookies de <ph name="DOMAIN" /></translation> <translation id="7714464543167945231">Certificado</translation> @@ -7162,6 +7177,7 @@ <translation id="7768770796815395237">Cambiar</translation> <translation id="7768784765476638775">Enunciar selección</translation> <translation id="7769748505895274502">Ocultar cerradas recientemente</translation> +<translation id="7770072242481632881">Selector del panel lateral</translation> <translation id="7770406201819593386">Ejecuta pruebas diagnósticas de ChromeOS Flex.</translation> <translation id="7770450735129978837">Clic derecho del ratón</translation> <translation id="7770612696274572992">Imagen copiada desde otro dispositivo</translation> @@ -7798,6 +7814,7 @@ <translation id="8353683614194668312">Puede:</translation> <translation id="8354034204605718473">El PIN de tu hijo/a se ha añadido</translation> <translation id="8356197132883132838"><ph name="TITLE" />: <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Ya has registrado este dispositivo. No es necesario que lo registres de nuevo.</translation> <translation id="8357388086258943206">No se ha podido instalar Linux</translation> <translation id="8358685469073206162">¿Quieres restaurar las páginas?</translation> <translation id="8358912028636606457">Este dispositivo no permite enviar el audio de las pestañas.</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index e69c43f..9b0dcd6 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1248,6 +1248,7 @@ <translation id="2135787500304447609">&Taasta</translation> <translation id="2136372518715274136">Sisestage uus parool</translation> <translation id="2136476978468204130">Sisestatud parool on vale</translation> +<translation id="2137128126782078222">Ära luba märguandeid saidilt <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Heakskiidu ootel …</translation> <translation id="2139919072249842737">Seadistusnupp</translation> <translation id="2140788884185208305">Aku seisukord</translation> @@ -1900,6 +1901,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Administraator on jälgitavad kasutajad keelanud.</translation> <translation id="2722540561488096675">Seade lülitub välja <ph name="TIME_LEFT" /> pärast. Enne seadme uuesti sisselülitamist eemaldage USB-seade. Seejärel saate hakata seadet <ph name="DEVICE_OS" /> kasutama.</translation> +<translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC logid</translation> <translation id="272488616838512378">Ühikute teisendamine</translation> <translation id="2725200716980197196">Võrguühendus on taastatud</translation> @@ -2488,6 +2490,7 @@ <translation id="3281892622610078515">Karantiini pandavad failid ja programmid:</translation> <translation id="3282210178675490297">Vahelehte jagatakse rakendusega <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Uus &vaheleht</translation> +<translation id="3285500645985761267">Luba seotud saitidel näha minu tegevusi grupis</translation> <translation id="328571385944182268">Kas salvestada teie paroolid?</translation> <translation id="3288047731229977326">Arendaja režiimis töötavad laiendused võivad teie arvutit kahjustada. Kui te pole arendaja, peaksite turvalisuse säilitamiseks nende laienduste käitamise arendaja režiimis keelama.</translation> <translation id="3289668031376215426">Automaatne suurtähtede kasutamine</translation> @@ -2762,6 +2765,7 @@ <translation id="3541823293333232175">Määratud</translation> <translation id="3543393733900874979">Värskendamine ebaõnnestus (viga: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">X9.62 ECDSA allkiri SHA-512-ga</translation> +<translation id="3544058026430919413">Ettevõte saab määratleda saitide grupi, mis saavad kasutada küpsisefaile, et teie tegevusi grupis jagada. See on inkognito režiimis välja lülitatud.</translation> <translation id="3544879808695557954">Kasutajanimi (valikuline)</translation> <translation id="354602065659584722">Kahjulik tarkvara eemaldati</translation> <translation id="3547954654003013442">Puhverserveri seaded</translation> @@ -2901,6 +2905,7 @@ <translation id="3681548574519135185">Esiletõstu rõngas</translation> <translation id="3683524264665795342">Rakenduse <ph name="APP_NAME" /> ekraani jagamise taotlus</translation> <translation id="3685598397738512288">Linuxi USB eelistused</translation> +<translation id="3687598459967813435">Kuva alati märguanded veebisaidilt <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Ilmnes viga, kui proovisite kirjutada faili: <ph name="ERROR_TEXT" /></translation> <translation id="3688507211863392146">Failidesse ja kaustadesse kirjutamine, mille rakenduses avate</translation> <translation id="3688526734140524629">Vaheta kanalit</translation> @@ -3073,6 +3078,7 @@ <translation id="3828029223314399057">Otsi jäjehoidjaid</translation> <translation id="3828953470056652895">Olen <ph name="BEGIN_LINK1" />Google'i teenusetingimused<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Chrome'i ja Chrome OS-i lisateenusetingimused<ph name="END_LINK2" /> ning <ph name="BEGIN_LINK3" />Play teenusetingimused<ph name="END_LINK3" /> läbi lugenud ning nõustun nendega.</translation> <translation id="3829765597456725595">SMB-failide võrguhoidla</translation> +<translation id="3830268140528557982">saidil <ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Administraator lülitas 1 potentsiaalselt ohtliku laienduse uuesti sisse}other{Administraator lülitas {NUM_EXTENSIONS} potentsiaalselt ohtlikku laiendust uuesti sisse}}</translation> <translation id="3831436149286513437">Google Drive'i otsingusoovitused</translation> <translation id="3834728400518755610">Mikrofoni seadete muudatuse jõustumiseks tuleb Linux välja lülitada. Jätkamiseks lülitage Linux välja.</translation> @@ -4061,6 +4067,7 @@ <translation id="4779766576531456629">eSIM-i mobiilsidevõrgu ümbernimetamine</translation> <translation id="4780321648949301421">Salvesta leht &nimega...</translation> <translation id="4781443161433589743">Kasutate Chrome'i parimaid turbefunktsioone</translation> +<translation id="4781584184731045253">Kustuta andmed ja load</translation> <translation id="4782861709165039462">Kõik mikrofonid on seadmete riistvara lülitiga keelatud</translation> <translation id="4785719467058219317">Kasutate turvavõtit, mis ei ole sellel veebisaidil registreeritud</translation> <translation id="4785914069240823137">Kärpimisest loobumine</translation> @@ -4742,6 +4749,7 @@ <translation id="5449551289610225147">Vale parool</translation> <translation id="5449588825071916739">Kõikide vahelehtede järjehoidjatesse lisamine</translation> <translation id="5449716055534515760">Sule &aken</translation> +<translation id="545133051331995777">Võrguühendus puudub</translation> <translation id="5452446625764825792">Saate nüüd vaadata oma telefoni hiljutisi fotosid, meediat ja rakendusi</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (toimib võrguühenduseta)</translation> <translation id="5454166040603940656">teenusepakkujaga <ph name="PROVIDER" /></translation> @@ -4785,6 +4793,7 @@ <translation id="5487521232677179737">Kustuta andmed</translation> <translation id="5488093641312826914">„<ph name="COPIED_ITEM_NAME" />” on kopeeritud</translation> <translation id="5488508217173274228">Sünkroonitavate andmete krüpteerimise valikud</translation> +<translation id="5489077378642700219">Ära luba märguandeid veebisaidilt <ph name="WEBSITE" />, kuid küsi hiljem</translation> <translation id="5489435190927933437">Domeeni <ph name="DOMAIN" /> jaoks salvestatud paroolid</translation> <translation id="5490721031479690399">Bluetooth-seadmete eemaldamine</translation> <translation id="5490798133083738649">Andke Linuxile luba teie mikrofonile juurde pääseda</translation> @@ -5123,6 +5132,7 @@ <translation id="5805697420284793859">Aknahaldur</translation> <translation id="5806447147478173900">Kuvatud saitide kasutatav salvestusruum kokku: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (vaikeseade)</translation> +<translation id="5809835394668218762">Rohkem toiminguid: <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled peab olema jaotises chrome://flags lubatud</translation> <translation id="5810809306422959727">See konto pole vanemliku järelevalve kasutamiseks sobilik</translation> <translation id="5811614940486072060">Seda faili ei laadita tavaliselt alla ja see võib olla ohtlik</translation> @@ -5137,6 +5147,7 @@ <translation id="5826395379250998812">Ühendage seade <ph name="DEVICE_TYPE" /> oma telefoniga. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Poolläbipaistev</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Kuva samas grupis olevad saidid</translation> <translation id="5827733057563115968">Järgmise sõna ennustamine</translation> <translation id="5828545842856466741">Lisa profiil …</translation> <translation id="5828633471261496623">Printimine ...</translation> @@ -5208,6 +5219,7 @@ <translation id="5884474295213649357">See vaheleht on ühendatud USB-seadmega.</translation> <translation id="5885314688092915589">Teie organisatsioon haldab seda profiili</translation> <translation id="5886009770935151472">1. sõrm</translation> +<translation id="5886112770923972514">Läheduses olevate kiirsidumise funktsiooniga seadmete ühendamine ja kiirelt seadistamine</translation> <translation id="5886384907280980632">Lülita kohe välja</translation> <translation id="5889282057229379085">Vahe CA-de maksimaalne arv: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Eelistatud WiFi-võrgud</translation> @@ -5252,6 +5264,7 @@ <translation id="5927232971138258197">See laiendus saab saiti <ph name="HOST" /> lugeda ja muuta</translation> <translation id="592740088639760830">Peata see konteiner</translation> <translation id="592880897588170157">Laadige PDF-failid alla selle asemel, et need Chrome'is automaatselt avada</translation> +<translation id="5928969282301718193">Praeguseks on kõik tehtud</translation> <translation id="592919310198008711">Kui ma klõpsan laiendusel</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> nõuab, et värskendaksite kohe seadet <ph name="DEVICE_TYPE" />.</translation> <translation id="5932224571077948991">Sait kuvab sekkuvaid või eksitavaid reklaame</translation> @@ -5426,6 +5439,7 @@ <translation id="6087746524533454243">Kas otsite brauseri teabe lehte? Külastage saiti</translation> <translation id="6087960857463881712">Lahe nägu</translation> <translation id="608912389580139775">Selle lehe lisamiseks lugemisloendisse klõpsake järjehoidjaikoonil</translation> +<translation id="6091116443517744502">Kontrollige internetiühendust ja proovige uuesti.</translation> <translation id="6091761513005122595">Jagatava üksuse ühendamine õnnestus.</translation> <translation id="6093803049406781019">Profiili kustutamine</translation> <translation id="6093888419484831006">Värskenduse tühistamine ...</translation> @@ -6090,6 +6104,7 @@ <translation id="6736243959894955139">Aadress</translation> <translation id="6737393581255281855">Kas kustutada kuvatud andmed?</translation> <translation id="6737663862851963468">Kerberose pileti eemaldamine</translation> +<translation id="6738180164164974883">Luba määrata kolmanda osapoole küpsisefaile</translation> <translation id="6738430949033571771">Konto kinnitamine …</translation> <translation id="6739923123728562974">Kuva töölaua otsetee</translation> <translation id="6740234557573873150">Peatati fail <ph name="FILE_NAME" /></translation> @@ -6287,6 +6302,7 @@ <translation id="691106080621596509">See kustutab kõik saidigrupi <ph name="SITE_GROUP_NAME" />, selle alla kuuluvate saitide ning selle installitud rakenduse salvestatud andmed ja küpsisefailid</translation> <translation id="6911734910326569517">Mälu jalajälg</translation> <translation id="6912007319859991306">Mobiilsidevõrgu SIM-kaardi PIN-kood</translation> +<translation id="6912380255120084882">Proovige teist seadet</translation> <translation id="691289340230098384">Subtiitrite eelistused</translation> <translation id="6914783257214138813">Teie paroolid on nähtavad kõigile, kes saavad vaadata eksporditud faili.</translation> <translation id="6916590542764765824">Laienduste haldamine</translation> @@ -6599,6 +6615,7 @@ <translation id="7222204278952406003">Chrome on teie vaikebrauser</translation> <translation id="7222232353993864120">E-posti aadress</translation> <translation id="7222235798733126207">Piiratud jagamine saitide vahel</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 sait omaniku <ph name="FPS_OWNER" /> grupis}other{{MEMBERS} saiti omaniku <ph name="FPS_OWNER" /> grupis}}</translation> <translation id="7225082563376899794">Kasuta paroolide sisestamisel teenust Windows Hello</translation> <translation id="7225179976675429563">Võrgu tüüp puudub</translation> <translation id="7227458944009118910">All loetletud rakendused saavad samuti protokollide linke käsitleda. Muud rakendused küsivad luba.</translation> @@ -7112,6 +7129,7 @@ <translation id="7709152031285164251">Ebaõnnestus – <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Ülekandmine …</translation> <translation id="7711900714716399411">Ühendage oma telefon USB-kaabli abil arvutiga. Kui telefon on juba ühendatud, katkestage ühendus ja ühendage uuesti.</translation> +<translation id="7711968363685835633">Isikupärastatud konversioonide ja soovituste ning kasutaja sõnastiku keelamine</translation> <translation id="7712739869553853093">Printimise eelvaate dialoog</translation> <translation id="7714307061282548371">Domeeni <ph name="DOMAIN" /> küpsised on lubatud</translation> <translation id="7714464543167945231">Sertifikaat</translation> @@ -7184,6 +7202,7 @@ <translation id="7768770796815395237">Muuda</translation> <translation id="7768784765476638775">Vali ja kuula</translation> <translation id="7769748505895274502">Ahenda hiljuti suletud</translation> +<translation id="7770072242481632881">Külgpaneeli valija</translation> <translation id="7770406201819593386">Chrome OS Flexi diagnostikatestide käitamine.</translation> <translation id="7770450735129978837">Hiire paremklikk</translation> <translation id="7770612696274572992">Pilt kopeeriti teisest seadmest</translation> @@ -7807,6 +7826,7 @@ <translation id="8338952601723052325">Arendaja veebisait</translation> <translation id="833986336429795709">Valige lingi avamiseks rakendus</translation> <translation id="8340547030807793004">Rohkem toiminguid: <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Vaadake üle <ph name="BEGIN_BOLD" />1 sait<ph name="END_BOLD" />, mis saatis hiljuti palju märguandeid}other{Vaadake üle <ph name="BEGIN_BOLD" />{NUM_SITES} saiti<ph name="END_BOLD" />, mis saatsid hiljuti palju märguandeid}}</translation> <translation id="8342221978608739536">Ei proovinud</translation> <translation id="8342861492835240085">Kogu valimine</translation> <translation id="8345848587667658367">Saate nüüd vaadata oma telefoni hiljutisi fotosid, meediat, märguandeid ja rakendusi</translation> @@ -7820,6 +7840,7 @@ <translation id="8353683614194668312">Rakendus saab teha järgmist.</translation> <translation id="8354034204605718473">Teie lapse PIN-kood on lisatud</translation> <translation id="8356197132883132838"><ph name="TITLE" /> – <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Olete selle seadme juba registreerinud. Teil ei ole vaja seda uuesti registreerida.</translation> <translation id="8357388086258943206">Viga Linuxi installimisel</translation> <translation id="8358685469073206162">Kas taastada lehed?</translation> <translation id="8358912028636606457">Ülekandevahelehe heli selles seadmes ei toetata.</translation> @@ -8804,6 +8825,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Turvalise ühenduse loomine...</translation> <translation id="996803490569799917">Vaadake mälestusi oma lemmikinimestest ja muust</translation> +<translation id="997143476478634194">Saidid järgivad automaatselt seda seadet, kui neid külastate. Saidid saadavad tavaliselt märguandeid, et teavitada teid olulistest uudistest või vestlussõnumitest.</translation> <translation id="99731366405731005">WiFi sünkroonimise kasutamiseks lülitage sisse <ph name="LINK1_BEGIN" />Chrome'i sünkroonimine<ph name="LINK1_END" />. <ph name="LINK2_BEGIN" />Lisateave<ph name="LINK2_END" /></translation> <translation id="998747458861718449">I&nspekteeri</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index ec7e218..2fc4998 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1254,6 +1254,7 @@ <translation id="2135787500304447609">&ازسرگیری</translation> <translation id="2136372518715274136">گذرواژه جدید را وارد کنید</translation> <translation id="2136476978468204130">گذرعبارتی که وارد کردید نادرست است</translation> +<translation id="2137128126782078222">اعلانهای <ph name="WEBSITE" /> مجاز نباشد</translation> <translation id="2137891579555018930">درانتظار اجازه…</translation> <translation id="2139919072249842737">دکمه راهاندازی</translation> <translation id="2140788884185208305">سلامت باتری</translation> @@ -2495,6 +2496,7 @@ <translation id="3281892622610078515">فایلها و برنامههایی که قرنطینه میشود:</translation> <translation id="3282210178675490297">درحال همرسانی برگه با <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">&برگه جدید</translation> +<translation id="3285500645985761267">به سایتهای مرتبط اجازه دهید فعالیت شما را در گروه ببینند</translation> <translation id="328571385944182268">گذرواژه ذخیره شود؟</translation> <translation id="3288047731229977326">افزونههایی که در حالت برنامهنوبس اجرا میشوند میتوانند به رایانه شما آسیب برسانند. اگر برنامهنویس نیستید، باید این برنامههای افزودنی را که در حالت برنامهنویس اجرا میشوند غیرفعال کنید تا ایمن بمانید.</translation> <translation id="3289668031376215426">بزرگنویسی خودکار حروف اول</translation> @@ -2769,6 +2771,7 @@ <translation id="3541823293333232175">واگذارشده</translation> <translation id="3543393733900874979">بهروزرسانی انجام نشد (خطا: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">امضای X9.62 ECDSA با SHA-512</translation> +<translation id="3544058026430919413">شرکتها میتوانند گروهی از سایتها تعریف کنند که فعالیت شما را بااستفاده از کوکی در گروه همرسانی کنند. این ویژگی در «حالت ناشناس» خاموش است.</translation> <translation id="3544879808695557954">نام کاربری (اختیاری)</translation> <translation id="354602065659584722">نرمافزار مضر پاک شد</translation> <translation id="3547954654003013442">تنظیمات پروکسی</translation> @@ -2908,6 +2911,7 @@ <translation id="3681548574519135185">حلقه فوکوس</translation> <translation id="3683524264665795342">درخواست همرسانی صفحهنمایش <ph name="APP_NAME" /></translation> <translation id="3685598397738512288">اولویتهای USB در Linux</translation> +<translation id="3687598459967813435">اعلانهای <ph name="WEBSITE" /> همیشه مجاز باشد</translation> <translation id="368789413795732264">خطایی در حین نوشتن در این فایل وجود داشت: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">نوشتن بر روی فایلها و پوشههایی که در برنامه باز میکنید</translation> <translation id="3688526734140524629">تغییر کانال</translation> @@ -4070,6 +4074,7 @@ <translation id="4779766576531456629">تغییر دادن نام شبکه تلفن همراه سیمکارت داخلی</translation> <translation id="4780321648949301421">ذخیره صفحه بهعنوان...</translation> <translation id="4781443161433589743">از بالاترین سطح امنیت در Chrome برخوردار هستید</translation> +<translation id="4781584184731045253">پاک کردن دادهها و اجازهها</translation> <translation id="4782861709165039462">همه میکروفونها با کلید سختافزاری دستگاه غیرفعال شده است</translation> <translation id="4785719467058219317">شما از کلید امنیتی استفاده میکنید که در این وبسایت ثبت نشده است</translation> <translation id="4785914069240823137">لغو برش</translation> @@ -4751,6 +4756,7 @@ <translation id="5449551289610225147">گذرواژه نامعتبر است</translation> <translation id="5449588825071916739">نشانکگذاری همه برگهها...</translation> <translation id="5449716055534515760">بستن &پنجره</translation> +<translation id="545133051331995777">اتصال شبکه وجود ندارد</translation> <translation id="5452446625764825792">اکنون میتوانید عکسها، رسانهها، و برنامههای جدید تلفنتان را مشاهده کنید</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (آفلاین کار میکند)</translation> <translation id="5454166040603940656">با <ph name="PROVIDER" /></translation> @@ -4794,6 +4800,7 @@ <translation id="5487521232677179737">پاک کردن دادهها</translation> <translation id="5488093641312826914">«<ph name="COPIED_ITEM_NAME" />» کپی شد</translation> <translation id="5488508217173274228">گزینههای رمزگذاری همگامسازی</translation> +<translation id="5489077378642700219">اعلانهای <ph name="WEBSITE" /> مجاز نباشد اما بعداً سؤال شود</translation> <translation id="5489435190927933437">گذرواژههای ذخیرهشده برای <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">قطع اتصال دستگاه بلوتوث</translation> <translation id="5490798133083738649">اجازه دادن به Linux برای دسترسی به میکروفون</translation> @@ -5132,6 +5139,7 @@ <translation id="5805697420284793859">مدیر پنجره</translation> <translation id="5806447147478173900">مجموع فضای ذخیرهسازی که سایتهای نشاندادهشده استفاده کردهاند: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">۰ درجه (پیشفرض)</translation> +<translation id="5809835394668218762">کنشهای بیشتر برای <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled باید در chrome://flags فعال شود</translation> <translation id="5810809306422959727">این حساب برای کنترلهای والدین واجد شرایط نیست</translation> <translation id="5811614940486072060">این فایل معمولاً بارگیری نمیشود و ممکن است خطرناک باشد</translation> @@ -5146,6 +5154,7 @@ <translation id="5826395379250998812"><ph name="DEVICE_TYPE" /> را به تلفنتان متصل کنید. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="5826993284769733527">نیمه شفاف</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">نمایش سایتهای همگروه</translation> <translation id="5827733057563115968">پیشبینی کلمه بعد</translation> <translation id="5828545842856466741">افزودن نمایه…</translation> <translation id="5828633471261496623">در حال چاپ...</translation> @@ -5262,6 +5271,7 @@ <translation id="5927232971138258197">این افزونه میتواند <ph name="HOST" /> را بخواند و تغییر دهد</translation> <translation id="592740088639760830">توقف این محتوی</translation> <translation id="592880897588170157">بارگیری فایلهای PDF بهجای باز کردن خودکار آنها در Chrome</translation> +<translation id="5928969282301718193">فعلاً همه را بررسی کردهاید</translation> <translation id="592919310198008711">وقتی روی افزونه کلیک میکنم</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> از شما میخواهد فوراً <ph name="DEVICE_TYPE" /> را بهروزرسانی کنید.</translation> <translation id="5932224571077948991">سایتْ آگهیهای مزاحم یا گمراهکننده نشان میدهد</translation> @@ -5436,6 +5446,7 @@ <translation id="6087746524533454243">بهدنبال صفحه درباره مرورگر هستید؟ از این پیوند استفاده کنید:</translation> <translation id="6087960857463881712">چهره تأثیرگذار</translation> <translation id="608912389580139775">برای افزودن این صفحه به فهرست خواندن، روی نماد «نشانک» کلیک کنید</translation> +<translation id="6091116443517744502">لطفاً اتصال اینترنت را بررسی و دوباره امتحان کنید</translation> <translation id="6091761513005122595">دستگاه ذخیرهسازی متصل به شبکه با موفقیت نشانده شد.</translation> <translation id="6093803049406781019">حذف نمایه</translation> <translation id="6093888419484831006">در حال لغو بهروزرسانی...</translation> @@ -6102,6 +6113,7 @@ <translation id="6736243959894955139">آدرس</translation> <translation id="6737393581255281855">دادههای نشاندادهشده پاک شود؟</translation> <translation id="6737663862851963468">حذف کردن بلیت Kerberos</translation> +<translation id="6738180164164974883">مجاز کردن تنظیم کوکیهای شخص ثالث</translation> <translation id="6738430949033571771">درحال تأیید حساب…</translation> <translation id="6739923123728562974">نمایش میانبر میز کار</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> موقتاً متوقف شد</translation> @@ -6299,6 +6311,7 @@ <translation id="691106080621596509">با این کار همه دادهها و کوکیهایی که توسط <ph name="SITE_GROUP_NAME" />، سایتهای زیرمجموعه آن، و برنامه نصبشده آن ذخیره شدهاند پاک میشود</translation> <translation id="6911734910326569517">مصرف حافظه</translation> <translation id="6912007319859991306">پین سیمکارت شبکه تلفن همراه</translation> +<translation id="6912380255120084882">دستگاه دیگری را امتحان کنید</translation> <translation id="691289340230098384">اولویتهای زیرنویس ناشنوایان</translation> <translation id="6914783257214138813">گذرواژههای شما برای همه افرادی که میتوانند فایل صادرشده را ببینید، نمایان خواهند بود.</translation> <translation id="6916590542764765824">مدیریت افزونهها</translation> @@ -6611,6 +6624,7 @@ <translation id="7222204278952406003">Chrome مرورگر پیشفرض شما است</translation> <translation id="7222232353993864120">نشانی ایمیل</translation> <translation id="7222235798733126207">همرسانی محدود میان سایتها</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{۱ سایت در گروه <ph name="FPS_OWNER" /> است}one{{MEMBERS} سایت در گروه <ph name="FPS_OWNER" /> است}other{{MEMBERS} سایت در گروه <ph name="FPS_OWNER" /> است}}</translation> <translation id="7225082563376899794">استفاده از Windows Hello هنگام وارد کردن گذرواژهها</translation> <translation id="7225179976675429563">نوع شبکه موجود نیست</translation> <translation id="7227458944009118910">برنامههای فهرستشده در زیر نیز میتوانند پیوندهای پروتکل را مدیریت کنند. برنامههای دیگر اجازه درخواست خواهند کرد.</translation> @@ -7124,6 +7138,7 @@ <translation id="7709152031285164251">انجام نشد - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&ارسال محتوا…</translation> <translation id="7711900714716399411">برای اتصال تلفن به رایانه، از سیم USB استفاده کنید. اگر تلفن درحالحاضر متصل است، سیم را از رایانه جدا کنید و دوباره وارد کنید.</translation> +<translation id="7711968363685835633">غیرفعال کردن تبدیلهای شخصی و پیشنهادها و فرهنگ لغت کاربر</translation> <translation id="7712739869553853093">کادر گفتگوی پیشنمایش چاپ</translation> <translation id="7714307061282548371">کوکیهای <ph name="DOMAIN" /> مجاز است</translation> <translation id="7714464543167945231">گواهی</translation> @@ -7196,6 +7211,7 @@ <translation id="7768770796815395237">تغییر دادن</translation> <translation id="7768784765476638775">انتخاب برای شنیدن</translation> <translation id="7769748505895274502">جمع کردن موارد اخیراً بستهشده</translation> +<translation id="7770072242481632881">گزینشگر پانل کناری</translation> <translation id="7770406201819593386">اجرای آزمایشهای عیبیابی ChromeOS Flex.</translation> <translation id="7770450735129978837">کلیک سمت راست موشواره</translation> <translation id="7770612696274572992">تصویر از دستگاه دیگری کپی شده است</translation> @@ -7832,6 +7848,7 @@ <translation id="8353683614194668312">این میتواند:</translation> <translation id="8354034204605718473">پین فرزندتان اضافه شده است</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">قبلاً این دستگاه را ثبت کردهاید. لازم نیست آن را دوباره ثبت کنید.</translation> <translation id="8357388086258943206">خطا در نصب Linux</translation> <translation id="8358685469073206162">صفحهها بازیابی شوند؟</translation> <translation id="8358912028636606457">ارسال محتوای صوتی برگه در این دستگاه پشتیبانی نمیشود.</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 9f634f09..ef0d637 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1908,6 +1908,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Järjestelmänvalvoja on estänyt valvottujen käyttäjäprofiilien käytön.</translation> <translation id="2722540561488096675">Laite sammuu, kun <ph name="TIME_LEFT" /> on kulunut. Irrota USB-laite ennen kuin käynnistät laitteen uudelleen. Sen jälkeen <ph name="DEVICE_OS" /> on käytettävissä.</translation> +<translation id="2722547199758472013">Tunnus: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC-lokit</translation> <translation id="272488616838512378">Yksikkömuunnos</translation> <translation id="2725200716980197196">Verkkoyhteys palautettu</translation> @@ -3081,6 +3082,7 @@ <translation id="3828029223314399057">Hae kirjanmerkeistä</translation> <translation id="3828953470056652895">Olen lukenut ja hyväksyn <ph name="BEGIN_LINK1" />Googlen käyttöehdot<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Chromen ja ChromeOS:n lisäkäyttöehdot<ph name="END_LINK2" /> ja <ph name="BEGIN_LINK3" />Playn käyttöehdot<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">SMB-tiedostonjako</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Järjestelmänvalvoja laittoi 1 mahdollisesti haitallisen laajennuksen päälle}other{Järjestelmänvalvoja laittoi {NUM_EXTENSIONS} mahdollisesti haitallista laajennusta päälle}}</translation> <translation id="3831436149286513437">Google Drive ‑hakuehdotukset</translation> <translation id="3834728400518755610">Mikrofoniasetuksen muutos edellyttää Linuxin käynnistämistä uudelleen. Sammuta Linux jatkaaksesi.</translation> @@ -5214,6 +5216,7 @@ <translation id="5884474295213649357">Tämä välilehti on yhdistetty USB-laitteeseen.</translation> <translation id="5885314688092915589">Organisaatiosi ylläpitää tätä tiliä</translation> <translation id="5886009770935151472">Sormi 1</translation> +<translation id="5886112770923972514">Yhdistä ja ota lähellä olevia Pikapari-laitteita nopeasti käyttöön</translation> <translation id="5886384907280980632">Laita pois päältä</translation> <translation id="5889282057229379085">Keskitason varmenteiden myöntäjien enimmäismäärä: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Ensisijaiset Wi-Fi-verkot</translation> @@ -7812,6 +7815,7 @@ <translation id="8338952601723052325">Kehittäjän verkkosivusto</translation> <translation id="833986336429795709">Valitse sovellus tämän linkin avaamista varten</translation> <translation id="8340547030807793004"><ph name="DEVICE" />: lisää toimintoja</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Tarkista <ph name="BEGIN_BOLD" />1 sivusto<ph name="END_BOLD" />, jolta on lähetetty paljon ilmoituksia viime aikoina}other{Tarkista <ph name="BEGIN_BOLD" />{NUM_SITES} sivustoa<ph name="END_BOLD" />, joilta on lähetetty paljon ilmoituksia viime aikoina}}</translation> <translation id="8342221978608739536">En kokeillut</translation> <translation id="8342861492835240085">Valitse kokoelma</translation> <translation id="8345848587667658367">Voit nyt nähdä puhelimen viimeaikaiset kuvat, median, ilmoitukset ja sovellukset</translation> @@ -8809,6 +8813,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Muodostetaan suojattua yhteyttä...</translation> <translation id="996803490569799917">Katso muistoja läheisistä ihmisistä sekä muista</translation> +<translation id="997143476478634194">Avaamasi sivustot noudattavat tätä asetusta automaattisesti. Sivustoilta lähetetään yleensä ilmoituksia esimerkiksi tuoreista uutisista tai chat-viesteistä.</translation> <translation id="99731366405731005">Laita <ph name="LINK1_BEGIN" />Chromen synkronointi<ph name="LINK1_END" /> päälle, jotta voit käyttää Wi-Fin synkronointia <ph name="LINK2_BEGIN" />Lue lisää<ph name="LINK2_END" /></translation> <translation id="998747458861718449">&Tarkista</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index b817031f..29f7df2 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1259,6 +1259,7 @@ <translation id="2135787500304447609">&Magpatuloy</translation> <translation id="2136372518715274136">Ilagay ang bagong password</translation> <translation id="2136476978468204130">Mali ang inilagay mong passphrase</translation> +<translation id="2137128126782078222">Huwag payagan ang mga notification mula sa <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Naghihintay ng pahintulot...</translation> <translation id="2139919072249842737">Button na I-set up</translation> <translation id="2140788884185208305">Tagal ng Baterya</translation> @@ -2502,6 +2503,7 @@ <translation id="3281892622610078515">Mga file at program na iku-quarantine:</translation> <translation id="3282210178675490297">Nagbabahagi ng tab sa <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Bagong &Tab</translation> +<translation id="3285500645985761267">Payagan ang mga kaugnay na site na makita ang iyong aktibidad sa grupo</translation> <translation id="328571385944182268">I-save ang iyong mga password?</translation> <translation id="3288047731229977326">Ang mga extension na tumatakbo sa developer mode ay maaaring makapinsala sa iyong computer. Kung hindi ka isang developer, dapat mong i-disable ang mga extension na tumatakbo sa developer mode upang manatiling ligtas.</translation> <translation id="3289668031376215426">Auto-capitalization</translation> @@ -2776,6 +2778,7 @@ <translation id="3541823293333232175">Nakatalaga</translation> <translation id="3543393733900874979">Nabigo ang pag-update (error: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">X9.62 ECDSA Signature na may SHA-512</translation> +<translation id="3544058026430919413">Puwedeng tukuyin ng isang kumpanya ang grupo ng mga site na puwedeng gumamit ng cookies para i-share ang iyong aktibidad sa grupo. Naka-off ito sa Incognito.</translation> <translation id="3544879808695557954">Username (opsyonal)</translation> <translation id="354602065659584722">Naalis ang mapaminsalang software</translation> <translation id="3547954654003013442">Mga setting ng proxy</translation> @@ -2915,6 +2918,7 @@ <translation id="3681548574519135185">Focus ring</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> Kahilingan sa Pagbabahagi ng Screen</translation> <translation id="3685598397738512288">Mga kagustuhan sa USB ng Linux</translation> +<translation id="3687598459967813435">Palaging payagan ang mga notification mula sa <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Nagkaroon ng error habang sinusubukang isulat ang file: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Mag-write sa mga file at folder na iyong bubuksan sa application</translation> <translation id="3688526734140524629">Lumipat ng channel</translation> @@ -4077,6 +4081,7 @@ <translation id="4779766576531456629">I-rename ang Cellular network ng eSIM</translation> <translation id="4780321648949301421">I-save ang Page Bilang...</translation> <translation id="4781443161433589743">Ginagamit mo ang pinakamahusay na seguridad ng Chrome</translation> +<translation id="4781584184731045253">I-clear ang data at mga pahintulot</translation> <translation id="4782861709165039462">Na-disable ang lahat ng mikropono sa pamamagitan ng switch ng hardware ng mga device</translation> <translation id="4785719467058219317">Gumagamit ka ng security key na hindi nakarehistro sa website na ito</translation> <translation id="4785914069240823137">Kanselahin ang Pag-crop</translation> @@ -4759,6 +4764,7 @@ <translation id="5449551289610225147">Di-wastong password</translation> <translation id="5449588825071916739">I-bookmark ang Lahat ng Tab</translation> <translation id="5449716055534515760">Isara ang Win&dow</translation> +<translation id="545133051331995777">Walang koneksyon sa network</translation> <translation id="5452446625764825792">Puwede mo nang tingnan ang mga pinakabagong larawan, media, at app ng iyong telepono</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (gumagana offline)</translation> <translation id="5454166040603940656">sa <ph name="PROVIDER" /></translation> @@ -4802,6 +4808,7 @@ <translation id="5487521232677179737">I-clear ang data</translation> <translation id="5488093641312826914">Nakopya ang '<ph name="COPIED_ITEM_NAME" />'</translation> <translation id="5488508217173274228">I-sync ang mga opsyon sa pag-encrypt</translation> +<translation id="5489077378642700219">Huwag payagan ang mga notification mula sa <ph name="WEBSITE" /> pero magtanong sa ibang pagkakataon</translation> <translation id="5489435190927933437">Mga naka-save na password para sa <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Idiskonekta ang Bluetooth device</translation> <translation id="5490798133083738649">Payagan ang Linux na ma-access ang iyong mikropono</translation> @@ -5140,6 +5147,7 @@ <translation id="5805697420284793859">Window manager</translation> <translation id="5806447147478173900">Kabuuang storage na ginagamit ng mga naka-display na site: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Default)</translation> +<translation id="5809835394668218762">Higit pang pagkilos para sa <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">Dapat naka-enable ang #borealis-enabled sa chrome://flags</translation> <translation id="5810809306422959727">Hindi kwalipikado ang account na ito para sa parental controls</translation> <translation id="5811614940486072060">Hindi karaniwang dina-download ang app na ito at posibleng mapanganib ito.</translation> @@ -5154,6 +5162,7 @@ <translation id="5826395379250998812">Ikonekta ang iyong <ph name="DEVICE_TYPE" /> sa telepono mo. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Semi-transparent</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Ipakita ang mga site na nasa parehong grupo</translation> <translation id="5827733057563115968">Paghuhula sa susunod na salita</translation> <translation id="5828545842856466741">Magdagdag ng profile...</translation> <translation id="5828633471261496623">Nagpi-print...</translation> @@ -5270,6 +5279,7 @@ <translation id="5927232971138258197">Puwedeng basahin at baguhin ng extension na ito ang <ph name="HOST" /></translation> <translation id="592740088639760830">Ihinto ang container na ito</translation> <translation id="592880897588170157">I-download ang mga PDF file sa halip na awtomatikong buksan ang mga ito sa Chrome</translation> +<translation id="5928969282301718193">Tapos na sa ngayon</translation> <translation id="592919310198008711">Kapag na-click ko ang extension</translation> <translation id="5932209916647644605">Hinihiling sa iyo ng <ph name="MANAGER" /> na i-update kaagad ang <ph name="DEVICE_TYPE" /> mo.</translation> <translation id="5932224571077948991">Nagpapakita ang site ng mga nakakasagabal o nakakapanlinlang na ad</translation> @@ -5445,6 +5455,7 @@ <translation id="6087746524533454243">Hinahanap ang page na tungkol sa browser? Bisitahin ang</translation> <translation id="6087960857463881712">Astig na mukha</translation> <translation id="608912389580139775">Para idagdag ang page na ito sa iyong listahan ng babasahin, i-click ang icon ng Bookmark</translation> +<translation id="6091116443517744502">pakitingnan ang iyong koneksyon sa internet at subukan ulit</translation> <translation id="6091761513005122595">Matagumpay na na-mount ang share</translation> <translation id="6093803049406781019">Tanggalin ang profile</translation> <translation id="6093888419484831006">Kinakansela ang pag-update...</translation> @@ -6111,6 +6122,7 @@ <translation id="6736243959894955139">Address</translation> <translation id="6737393581255281855">I-clear ang data ng ipinapakitang site?</translation> <translation id="6737663862851963468">Alisin ang ticket ng Kerberos</translation> +<translation id="6738180164164974883">Payagang magtakda ng third-party na cookies</translation> <translation id="6738430949033571771">Vine-verify ang account...</translation> <translation id="6739923123728562974">Ipakita ang desktop shortcut</translation> <translation id="6740234557573873150">Na-pause ang <ph name="FILE_NAME" /></translation> @@ -6308,6 +6320,7 @@ <translation id="691106080621596509">Iki-clear nito ang lahat ng data at cookies na na-store ng <ph name="SITE_GROUP_NAME" />, anumang site na nasa ilalim nito, at mga na-install na app nito</translation> <translation id="6911734910326569517">Footprint ng memory</translation> <translation id="6912007319859991306">PIN ng Cellular SIM</translation> +<translation id="6912380255120084882">Sumubok ng ibang device</translation> <translation id="691289340230098384">Mga kagustuhan sa caption</translation> <translation id="6914783257214138813">Makikita ng sinumang makakatingin sa na-export na file ang iyong mga password.</translation> <translation id="6916590542764765824">Pamahalaan ang Mga Extension</translation> @@ -6620,6 +6633,7 @@ <translation id="7222204278952406003">Ang Chrome ay ang default mong browser</translation> <translation id="7222232353993864120">Email Address</translation> <translation id="7222235798733126207">Limitadong pagbabahagi sa pagitan ng mga site</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 site sa grupo ng <ph name="FPS_OWNER" />}one{{MEMBERS} site sa grupo ng <ph name="FPS_OWNER" />}other{{MEMBERS} na site sa grupo ng <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Gamitin ang Windows Hello kapag pinupunan ang mga password</translation> <translation id="7225179976675429563">Nawawala ang uri ng network</translation> <translation id="7227458944009118910">Puwede ring mangasiwa ng mga link ng protocol ang mga app na nakalista sa ibaba. Hihingi ng pahintulot ang iba pang app.</translation> @@ -7133,6 +7147,7 @@ <translation id="7709152031285164251">Nabigo - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Cast...</translation> <translation id="7711900714716399411">Gumamit ng USB cable para ikonekta ang iyong telepono sa computer mo. Kung nakakonekta na ang iyong telepono, bunutin ito sa saksakan at isaksak ulit.</translation> +<translation id="7711968363685835633">I-disable ang mga naka-personalize na conversion at suhestyon pati na rin ang diksyunaryo ng user</translation> <translation id="7712739869553853093">Dialog ng preview ng pag-print</translation> <translation id="7714307061282548371">Pinapayagan ang cookies mula sa <ph name="DOMAIN" /></translation> <translation id="7714464543167945231">Certificate</translation> @@ -7205,6 +7220,7 @@ <translation id="7768770796815395237">Baguhin</translation> <translation id="7768784765476638775">Select to Speak</translation> <translation id="7769748505895274502">I-collapse ang kamakailang isinara</translation> +<translation id="7770072242481632881">Selector ng Panel sa Gilid</translation> <translation id="7770406201819593386">Magpatakbo ng mga diagnostic test ng ChromeOS Flex.</translation> <translation id="7770450735129978837">Pag-click sa kanang mouse button</translation> <translation id="7770612696274572992">Nakopya ang larawan mula sa isa pang device</translation> @@ -7842,6 +7858,7 @@ <translation id="8353683614194668312">Maaari itong:</translation> <translation id="8354034204605718473">Naidagdag na ang PIN ng iyong anak</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Naiparehistro mo na ang device na ito. Hindi mo na ito kailangang iparehistro ulit.</translation> <translation id="8357388086258943206">Nagkaroon ng error sa pag-install ng Linux</translation> <translation id="8358685469073206162">Ipanumbalik ang mga page?</translation> <translation id="8358912028636606457">Hindi sinusuportahan sa device na ito ang pag-cast ng audio ng tab.</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 813cb83..a31188d 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -419,6 +419,7 @@ <translation id="1397594434718759194">Prijavljeni ste u Chrome na sljedećim uređajima, stoga ih možete upotrebljavati kao sigurnosne ključeve.</translation> <translation id="1398853756734560583">Maksimiziraj</translation> <translation id="139911022479327130">Otključajte telefon i potvrdite da ste to vi</translation> +<translation id="1401216725754314428">Saznajte više o povezanim web-lokacijama na novoj kartici</translation> <translation id="1401308693935339022">Upotreba lokacije. Aplikacijama i uslugama s dopuštenjem za lokaciju dopustite da upotrebljavaju lokaciju ovog uređaja. Google može povremeno prikupljati podatke o lokaciji i upotrebljavati ih na anoniman način kako bi poboljšao točnost lokacije i usluga temeljenih na lokaciji.</translation> <translation id="1403222014593521787">Povezivanje s proxyjem nije moguće</translation> <translation id="1405779994569073824">Srušilo se.</translation> @@ -7665,6 +7666,7 @@ <translation id="820568752112382238">Najposjećenije web-lokacije</translation> <translation id="8206745257863499010">Bluesy</translation> <translation id="8206859287963243715">Mobitel</translation> +<translation id="8208188204689616705">Ove su web-lokacije u grupi koju definira domena <ph name="FPS_OWNER" />. Web-lokacije u grupi mogu vidjeti vašu aktivnost u grupi.</translation> <translation id="8208216423136871611">Ne spremaj</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Nova obavijest}one{# nova obavijest}few{# nove obavijesti}other{# novih obavijesti}}</translation> <translation id="821119981794423735">Za uvoz zaporki u Google upravitelj zaporki za <ph name="USER_EMAIL" /> odaberite CSV datoteku</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 632408fb..d305507 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1254,6 +1254,7 @@ <translation id="2135787500304447609">&Lanjutkan</translation> <translation id="2136372518715274136">Masukkan sandi baru</translation> <translation id="2136476978468204130">Frasa sandi yang Anda masukkan salah</translation> +<translation id="2137128126782078222">Jangan izinkan notifikasi dari <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Menunggu izin ...</translation> <translation id="2139919072249842737">Tombol Siapkan</translation> <translation id="2140788884185208305">Kesehatan Baterai</translation> @@ -1904,6 +1905,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Pengguna yang dilindungi telah dinonaktifkan oleh administrator Anda.</translation> <translation id="2722540561488096675">Perangkat Anda akan dimatikan dalam <ph name="TIME_LEFT" />. Cabut USB sebelum menyalakan perangkat kembali. Lalu, Anda dapat mulai menggunakan <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">Log WebRTC</translation> <translation id="272488616838512378">Konversi Unit</translation> <translation id="2725200716980197196">Konektivitas jaringan dipulihkan</translation> @@ -2491,6 +2493,7 @@ <translation id="3281892622610078515">File dan program yang akan dikarantina:</translation> <translation id="3282210178675490297">Membagikan tab ke <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">&Tab Baru</translation> +<translation id="3285500645985761267">Izinkan situs terkait melihat aktivitas Anda di grup</translation> <translation id="328571385944182268">Simpan sandi Anda?</translation> <translation id="3288047731229977326">Ekstensi yang berjalan dalam mode pengembang dapat membahayakan komputer Anda. Jika Anda bukan pengembang, Anda sebaiknya menonaktifkan ekstensi yang berjalan dalam mode pengembang ini agar tetap aman.</translation> <translation id="3289668031376215426">Kapitalisasi otomatis</translation> @@ -2765,6 +2768,7 @@ <translation id="3541823293333232175">Ditetapkan</translation> <translation id="3543393733900874979">Gagal memperbarui (kesalahan: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">Tanda tangan X9.62 ECDSA dengan SHA-512</translation> +<translation id="3544058026430919413">Perusahaan dapat menentukan grup situs yang dapat menggunakan cookie untuk membagikan aktivitas Anda di grup tersebut. Ini nonaktif dalam mode Samaran.</translation> <translation id="3544879808695557954">Nama pengguna (opsional)</translation> <translation id="354602065659584722">Software berbahaya dihapus</translation> <translation id="3547954654003013442">Setelan proxy</translation> @@ -2903,6 +2907,7 @@ <translation id="3681548574519135185">Lingkaran fokus</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> Permintaan Berbagi Layar</translation> <translation id="3685598397738512288">Preferensi USB Linux</translation> +<translation id="3687598459967813435">Selalu izinkan notifikasi dari <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Terdapat kesalahan saat mencoba menulis file: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Menulis ke file dan folder yang Anda buka di aplikasi</translation> <translation id="3688526734140524629">Ubah saluran</translation> @@ -3075,6 +3080,7 @@ <translation id="3828029223314399057">Cari bookmark</translation> <translation id="3828953470056652895">Saya telah membaca dan menyetujui <ph name="BEGIN_LINK1" />Persyaratan Layanan Google<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Persyaratan Layanan Tambahan Chrome dan ChromeOS<ph name="END_LINK2" />, dan <ph name="BEGIN_LINK3" />Persyaratan Layanan Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">Berbagi file SMB</translation> +<translation id="3830268140528557982">di <ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Administrator Anda mengaktifkan kembali 1 ekstensi yang berpotensi berbahaya}other{Administrator Anda mengaktifkan kembali {NUM_EXTENSIONS} ekstensi yang berpotensi berbahaya}}</translation> <translation id="3831436149286513437">Saran penelusuran Google Drive</translation> <translation id="3834728400518755610">Perubahan pada setelan mikrofon mengharuskan Linux dimatikan. Matikan Linux untuk melanjutkan.</translation> @@ -4062,6 +4068,7 @@ <translation id="4779766576531456629">Ganti nama jaringan Seluler eSIM</translation> <translation id="4780321648949301421">Simpan Halaman Sebagai...</translation> <translation id="4781443161433589743">Anda memiliki perlindungan keamanan terkuat di Chrome</translation> +<translation id="4781584184731045253">Hapus data dan izin</translation> <translation id="4782861709165039462">Semua mikrofon dinonaktifkan oleh tombol hardware perangkat</translation> <translation id="4785719467058219317">Anda menggunakan kunci keamanan yang tidak terdaftar di situs ini</translation> <translation id="4785914069240823137">Batalkan Pemangkasan</translation> @@ -4742,6 +4749,7 @@ <translation id="5449551289610225147">Sandi tidak valid</translation> <translation id="5449588825071916739">Bookmark Semua Tab</translation> <translation id="5449716055534515760">Tutup Jen&dela</translation> +<translation id="545133051331995777">Tidak ada koneksi jaringan</translation> <translation id="5452446625764825792">Anda kini dapat melihat foto, media, dan aplikasi terbaru ponsel Anda</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (berfungsi secara offline)</translation> <translation id="5454166040603940656">dengan <ph name="PROVIDER" /></translation> @@ -4785,6 +4793,7 @@ <translation id="5487521232677179737">Hapus data</translation> <translation id="5488093641312826914">'<ph name="COPIED_ITEM_NAME" />' disalin</translation> <translation id="5488508217173274228">Opsi enkripsi sinkronisasi</translation> +<translation id="5489077378642700219">Jangan izinkan notifikasi dari <ph name="WEBSITE" />, tetapi tanyakan nanti</translation> <translation id="5489435190927933437">Sandi yang tersimpan untuk <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Putuskan hubungan perangkat Bluetooth</translation> <translation id="5490798133083738649">Izinkan Linux mengakses mikrofon Anda</translation> @@ -5122,6 +5131,7 @@ <translation id="5805697420284793859">Window manager</translation> <translation id="5806447147478173900">Total penyimpanan yang digunakan oleh situs yang ditampilkan: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Default)</translation> +<translation id="5809835394668218762">Tindakan lainnya untuk <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled harus diaktifkan di chrome://flags</translation> <translation id="5810809306422959727">Akun ini tidak memenuhi syarat kontrol orang tua</translation> <translation id="5811614940486072060">File ini tidak biasa didownload dan mungkin berbahaya</translation> @@ -5136,6 +5146,7 @@ <translation id="5826395379250998812">Hubungkan <ph name="DEVICE_TYPE" /> Anda dengan ponsel. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Semitransparan</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Tampilkan situs dalam grup yang sama</translation> <translation id="5827733057563115968">Prediksi kata berikutnya</translation> <translation id="5828545842856466741">Tambahkan profil ...</translation> <translation id="5828633471261496623">Mencetak...</translation> @@ -5206,6 +5217,7 @@ <translation id="5884474295213649357">Tab ini terhubung dengan perangkat USB.</translation> <translation id="5885314688092915589">Organisasi Anda akan mengelola profil ini</translation> <translation id="5886009770935151472">Jari 1</translation> +<translation id="5886112770923972514">Hubungkan dan siapkan perangkat Sambungan Cepat di dekat Anda dengan cepat</translation> <translation id="5886384907280980632">Nonaktifkan sekarang</translation> <translation id="5889282057229379085">Jumlah maksimum CA perantara: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Jaringan Wi-Fi pilihan</translation> @@ -5250,6 +5262,7 @@ <translation id="5927232971138258197">Ekstensi ini dapat membaca & mengubah <ph name="HOST" /></translation> <translation id="592740088639760830">Hentikan penampung ini</translation> <translation id="592880897588170157">Download file PDF tanpa otomatis membukanya di Chrome</translation> +<translation id="5928969282301718193">Semua sudah selesai</translation> <translation id="592919310198008711">Saat saya mengklik ekstensi</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> mengharuskan Anda segera mengupdate <ph name="DEVICE_TYPE" />.</translation> <translation id="5932224571077948991">Situs menampilkan iklan yang mengganggu atau menyesatkan</translation> @@ -5423,6 +5436,7 @@ <translation id="6087746524533454243">Mencari halaman tentang browser? Buka</translation> <translation id="6087960857463881712">Wajah keren</translation> <translation id="608912389580139775">Untuk menambahkan halaman ini ke daftar bacaan, klik ikon Bookmark</translation> +<translation id="6091116443517744502">Periksa koneksi internet Anda, lalu coba lagi</translation> <translation id="6091761513005122595">URL berbagi berhasil dipasang.</translation> <translation id="6093803049406781019">Hapus profil</translation> <translation id="6093888419484831006">Membatalkan pembaruan...</translation> @@ -6085,6 +6099,7 @@ <translation id="6736243959894955139">Alamat</translation> <translation id="6737393581255281855">Hapus data situs yang ditampilkan?</translation> <translation id="6737663862851963468">Hapus tiket Kerberos</translation> +<translation id="6738180164164974883">Izinkan untuk menyetel cookie pihak ketiga</translation> <translation id="6738430949033571771">Memverifikasi akun ...</translation> <translation id="6739923123728562974">Tampilkan pintasan desktop</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> dijeda</translation> @@ -6282,6 +6297,7 @@ <translation id="691106080621596509">Ini akan menghapus semua data dan cookie yang disimpan oleh <ph name="SITE_GROUP_NAME" />, semua situs dalam grup tersebut, dan aplikasi yang terinstal di dalamnya</translation> <translation id="6911734910326569517">Jejak memori</translation> <translation id="6912007319859991306">PIN SIM Seluler</translation> +<translation id="6912380255120084882">Coba perangkat lain</translation> <translation id="691289340230098384">Preferensi teks</translation> <translation id="6914783257214138813">Sandi akan terlihat oleh orang yang dapat melihat file yang diekspor.</translation> <translation id="6916590542764765824">Kelola Ekstensi</translation> @@ -6592,6 +6608,7 @@ <translation id="7222204278952406003">Chrome adalah browser default Anda</translation> <translation id="7222232353993864120">Alamat Email</translation> <translation id="7222235798733126207">Berbagi antar-situs dibatasi</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 situs di grup <ph name="FPS_OWNER" />}other{{MEMBERS} situs di grup <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Gunakan Windows Hello saat mengisi sandi</translation> <translation id="7225179976675429563">Jenis jaringan hilang</translation> <translation id="7227458944009118910">Aplikasi yang tercantum di bawah ini juga dapat menangani link protokol. Aplikasi lainnya akan meminta izin.</translation> @@ -7104,6 +7121,7 @@ <translation id="7709152031285164251">Gagal - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Cast...</translation> <translation id="7711900714716399411">Gunakan kabel USB untuk menghubungkan ponsel ke komputer. Jika ponsel sudah terhubung, cabut kabel USB, lalu colokkan kembali.</translation> +<translation id="7711968363685835633">Nonaktifkan konversi dan saran serta kamus pengguna yang dipersonalisasi</translation> <translation id="7712739869553853093">Dialog pratinjau cetak</translation> <translation id="7714307061282548371">Cookie dari <ph name="DOMAIN" /> diizinkan</translation> <translation id="7714464543167945231">Sertifikat</translation> @@ -7175,6 +7193,7 @@ <translation id="7768770796815395237">Ubah</translation> <translation id="7768784765476638775">Klik untuk diucapkan</translation> <translation id="7769748505895274502">Ciutkan yang baru saja ditutup</translation> +<translation id="7770072242481632881">Pemilih Panel Samping</translation> <translation id="7770406201819593386">Menjalankan pengujian diagnostik ChromeOS Flex.</translation> <translation id="7770450735129978837">Klik kanan mouse</translation> <translation id="7770612696274572992">Gambar disalin dari perangkat lain</translation> @@ -7797,6 +7816,7 @@ <translation id="8338952601723052325">Situs web pengembang</translation> <translation id="833986336429795709">Untuk membuka link ini, pilih aplikasi</translation> <translation id="8340547030807793004">Tindakan lainnya untuk <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Tinjau <ph name="BEGIN_BOLD" />1 situs<ph name="END_BOLD" /> yang baru-baru ini mengirim banyak notifikasi}other{Tinjau <ph name="BEGIN_BOLD" />{NUM_SITES} situs<ph name="END_BOLD" /> yang baru-baru ini mengirim banyak notifikasi}}</translation> <translation id="8342221978608739536">Tidak mencoba</translation> <translation id="8342861492835240085">Pilih koleksi</translation> <translation id="8345848587667658367">Anda kini dapat melihat foto, media, notifikasi, dan aplikasi terbaru ponsel Anda</translation> @@ -7810,6 +7830,7 @@ <translation id="8353683614194668312">Aplikasi/ekstensi dapat:</translation> <translation id="8354034204605718473">PIN anak Anda telah ditambahkan</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Anda sudah mendaftarkan perangkat ini. Anda tidak perlu mendaftarkannya lagi.</translation> <translation id="8357388086258943206">Error saat menginstal Linux</translation> <translation id="8358685469073206162">Pulihkan halaman?</translation> <translation id="8358912028636606457">Mentransmisikan audio tab tidak didukung di perangkat ini.</translation> @@ -8792,6 +8813,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Membuat koneksi aman...</translation> <translation id="996803490569799917">Lihat kenangan orang-orang favorit Anda dan banyak lagi</translation> +<translation id="997143476478634194">Situs akan otomatis mengikuti setelan ini saat Anda membukanya. Situs biasanya mengirim notifikasi untuk memberi tahu Anda tentang berita terbaru atau pesan chat.</translation> <translation id="99731366405731005">Aktifkan <ph name="LINK1_BEGIN" />Sinkronisasi Chrome<ph name="LINK1_END" /> untuk menggunakan Wi-Fi Sync. <ph name="LINK2_BEGIN" />Pelajari lebih lanjut<ph name="LINK2_END" /></translation> <translation id="998747458861718449">I&nspeksi</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index cbe999c1..9d2fc3df 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">Búið til</translation> <translation id="1067661089446014701">Til að auka öryggi geturðu dulkóðað aðgangsorð í tækinu þínu áður en þau eru vistuð á Google reikningnum þínum</translation> <translation id="1067922213147265141">Önnur Google þjónusta</translation> +<translation id="1069104208554708737">Þessi aðgangslykill verður aðeins vistaður í þessu tæki</translation> <translation id="1069355737714877171">Fjarlægja eSIM-prófílinn <ph name="PROFILE_NAME" /></translation> <translation id="1069814191880976658">Veldu annan skjá</translation> <translation id="1070377999570795893">Annað forrit í tölvunni þinni bætti við viðbót sem gæti breytt því hvernig Chrome virkar. @@ -350,6 +351,7 @@ <translation id="1324106254079708331">Verndar Google reikninga einstaklinga þar sem hætta er á miðuðum árásum</translation> <translation id="1327272175893960498">Kerberos-miðar</translation> <translation id="1327495825214193325">Til að kveikja á ADB-villuleit þarf að endurræsa þetta <ph name="DEVICE_TYPE" /> tæki. Ef slökkt er á henni þarf að núllstilla tækið.</translation> +<translation id="1327527584824210101">Notaðu aðgangslykilinn þinn</translation> <translation id="1327794256477341646">Eiginleikar sem þurfa staðsetningu þína munu ekki virka</translation> <translation id="1331977651797684645">Þetta var ég.</translation> <translation id="1333489022424033687">Sumir eiginleikar á <ph name="ORIGIN" /> virka hugsanlega ekki þar til þú hreinsar gögn sem önnur vefsvæði hafa vistað í tækinu þínu</translation> @@ -410,6 +412,7 @@ <translation id="139013308650923562">Mega nota leturgerðir sem eru uppsettar í tækinu þínu</translation> <translation id="1390548061267426325">Opna sem venjulegan flipa</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> hefur ekki heimild til að prenta út með <ph name="PRINTER_NAME" />. Hafðu samband við kerfisstjórann.</translation> +<translation id="1392047138650695757">Orðabækur notanda</translation> <translation id="1393283411312835250">Sól og ský</translation> <translation id="1395730723686586365">Uppfærsla hafin</translation> <translation id="1395832189806039783">Yfirstrika atriði með lyklaborðsfókus</translation> @@ -1531,6 +1534,7 @@ <translation id="2356070529366658676">Spyrja</translation> <translation id="2357330829548294574">Fjarlægja <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Vefsvæði geta notað JavaScript</translation> +<translation id="2358703245148663432">Annað tæki</translation> <translation id="2358777858338503863">Smelltu til að leyfa á <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux-forrit gætu hætt að virka.</translation> <translation id="2359345697448000899">Stjórnaðu viðbótunum þínum með því að smella á Viðbætur í valmyndinni Verkfæri.</translation> @@ -1891,6 +1895,7 @@ <translation id="271033894570825754">Nýtt</translation> <translation id="2711073837061989559">Prufuútgáfur</translation> <translation id="2712173769900027643">Biðja um leyfi</translation> +<translation id="2712207122921938368">Búðu til aðgangslykil í öðru tæki</translation> <translation id="2713106313042589954">Slökkva á myndavél</translation> <translation id="2713444072780614174">Hvítur</translation> <translation id="2714393097308983682">Google Play Store</translation> @@ -2402,6 +2407,7 @@ <translation id="3182749001423093222">Villuleit</translation> <translation id="3183139917765991655">Innflutningur prófíla</translation> <translation id="3183143381919926261">Farsímagagnanet</translation> +<translation id="3183613134231754987">Þessi aðgangslykill verður aðeins vistaður í Windows Hello. Hann verður áfram í þessu tæki eftir að þú lokar öllum huliðsgluggum.</translation> <translation id="3183944777708523606">Uppsetning skjás</translation> <translation id="3184536091884214176">Setja upp eða hafa umsjón með CUPS-prenturum. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{Þetta forrit er á bannlista}one{Sum forrit eru á bannlista}other{Sum forrit eru á bannlista}}</translation> @@ -2881,6 +2887,7 @@ <translation id="3654045516529121250">Lesa aðgengisstillingar</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Það hefur varanlegan aðgang að einni skrá.}one{Það hefur varanlegan aðgang að # skrá.}other{Það hefur varanlegan aðgang að # skrám.}}</translation> <translation id="3658871634334445293">TrackPoint-hröðun</translation> +<translation id="3659550105763988702">Notaðu aðgangslykilinn þinn fyrir <ph name="APP_NAME" /></translation> <translation id="3659929705630080526">Þú hefur slegið of oft inn rangan aðgangskóða. Reyndu aftur síðar</translation> <translation id="3660234220361471169">Ótraust</translation> <translation id="3664511988987167893">Tákn viðbótar</translation> @@ -3153,6 +3160,7 @@ <translation id="3898327728850887246"><ph name="SITE_NAME" /> vill: <ph name="FIRST_PERMISSION" /> og <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">Velja lyklaborð</translation> <translation id="3900966090527141178">Flytja út aðgangsorð</translation> +<translation id="3902789559055749153">Veldu hvernig þú vilt búa til aðgangslykil fyrir <ph name="APP_NAME" /></translation> <translation id="3903187154317825986">Innbyggt lyklaborð</translation> <translation id="3904326018476041253">Staðsetningarþjónusta</translation> <translation id="3904849010307028014">Í samræmi við notkun þína á vefsvæði, til dæmis þegar þú skráir þig reglulega inn á reikning, getur viðkomandi vefsvæði úthlutað vafranum þínum traustum lykli. Þegar önnur vefsvæði sem þú opnar síðar leita að og finna gildan traustan lykil er líklegra að viðkomandi vefsvæði skilgreini þig sem manneskju en spjallara.</translation> @@ -3482,6 +3490,7 @@ <translation id="4218081191298393750">Smelltu á hátalaratáknið til að slökkva á hljóði þessa flipa</translation> <translation id="4219558185499589032">Box</translation> <translation id="4220648711404560261">Villa kom upp við virkjun.</translation> +<translation id="4223845867739585293">Búa til aðgangslykil</translation> <translation id="4225397296022057997">Á öllum vefsvæðum</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Þessi viðbót er bönnuð}one{Sumar viðbætur eru bannaðar}other{Sumar viðbætur eru bannaðar}}</translation> <translation id="4231095370974836764">Settu upp forrit og leiki af Google Play í <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> @@ -4124,6 +4133,7 @@ <translation id="4838907349371614303">Aðgangsorð uppfært</translation> <translation id="4838958829619609362">Val er ekki stillt á <ph name="LANGUAGE" /></translation> <translation id="4839303808932127586">&Vista myndskeið sem...</translation> +<translation id="4839910546484524995">Skoðaðu tækið þitt</translation> <translation id="4840096453115567876">Viltu samt loka huliðsstillingu?</translation> <translation id="4841741146571978176">Áskilin sýndarvél er ekki til staðar. Reyndu að setja upp <ph name="VM_TYPE" /> til að halda áfram</translation> <translation id="4842976633412754305">Þessi síða er að reyna að hlaða skriftur af óstaðfestum uppruna.</translation> @@ -5041,6 +5051,7 @@ <translation id="5729712731028706266">Skoða</translation> <translation id="5731247495086897348">Líma og opna</translation> <translation id="5732392974455271431">Foreldrar þínir geta opnað fyrir þetta</translation> +<translation id="5733109311583381874">Bættu eigin orðum við orðabækur notanda til að sérsníða tillögur í samtölum.</translation> <translation id="5733866499231170760">Ógilt auðkenni. Sniðið sem þú færðir inn er rangt. Skoðaðu leiðbeiningarnar sem þú fékkst til að ganga úr skugga um að þú hafir fært inn auðkenni á réttu sniði. Ef þér tekst ekki að leysa úr vandamálinu skaltu skilja reitinn eftir auðan og halda áfram með uppsetninguna.</translation> <translation id="5734362860645681824">Samskipti</translation> <translation id="5734697361979786483">Bæta samnýttri skráageymslu við</translation> @@ -5150,6 +5161,7 @@ <translation id="583431638776747">Vefsvæði var ekki tiltækt</translation> <translation id="5834581999798853053">Um <ph name="TIME" /> mínútur eftir</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – upptaka á myndavél eða hljóðnema</translation> +<translation id="5835625581856809102">Skannaðu þennan QR-kóða með tækinu þar sem þú vilt búa til aðgangslykil fyrir <ph name="APP_NAME" /></translation> <translation id="583673505367439042">Vefsvæði geta beðið um leyfi til að breyta skrám og möppum í tækinu þínu</translation> <translation id="5836999627049108525">Tungumál sem á að þýða úr</translation> <translation id="583756221537636748">Hulstur</translation> @@ -5388,6 +5400,7 @@ <translation id="6059276912018042191">Nýlegir Chrome flipar</translation> <translation id="6059652578941944813">Stigveldi vottorða</translation> <translation id="6059925163896151826">USB-tæki</translation> +<translation id="6061408389284235459">Tilkynning var send á <ph name="DEVICE_NAME" /></translation> <translation id="6063284707309177505">Búa til QR-kóða</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />Athugaðu:<ph name="END_BOLD" /> Einhver með svipaða rödd eða upptöku gæti fengið aðgang að sérsniðnum niðurstöðum <ph name="SUPERVISED_USER_NAME" />. Þú getur valið í stillingum Hjálpara <ph name="SUPERVISED_USER_NAME" /> að kveikja eingöngu á „Ok, Google“ þegar þetta tæki er tengt við aflgjafa til að spara rafhlöðuna.</translation> <translation id="6064217302520318294">Skjálás</translation> @@ -5515,6 +5528,7 @@ <translation id="6178664161104547336">Veldu vottorð</translation> <translation id="6178682841350631965">Innskráningargögnin þín voru uppfærð</translation> <translation id="6180510783007738939">Línuverkfæri</translation> +<translation id="6180550893222597997">Hvaða aðgangslykil viltu nota fyrir <ph name="APP_NAME" />?</translation> <translation id="6181431612547969857">Niðurhal útilokað</translation> <translation id="6184099524311454384">Leita í flipum</translation> <translation id="6185132558746749656">Staðsetning tækis</translation> @@ -5952,6 +5966,7 @@ <translation id="6596816719288285829">IP-tala</translation> <translation id="6597017209724497268">Dæmi</translation> <translation id="6597331566371766302">Kerfisstjórinn setti eftirfarandi atriði á bannlista:</translation> +<translation id="6601262427770154296">Stjórna orðabókum notanda</translation> <translation id="6601612474695404578">Sum vefsvæði nota fótspor þriðju aðila til að hlaða síður. Ef vefsvæði virkar ekki geturðu prófað að leyfa fótspor.</translation> <translation id="6602937173026466876">Aðgangur að prenturunum þínum</translation> <translation id="6602956230557165253">Notaðu vinstri og hægri örvatakkana til að fletta.</translation> @@ -6315,6 +6330,7 @@ <translation id="6943060957016121200">Virkja skynditjóðrun</translation> <translation id="6943176775188458830">Hætta við prentun</translation> <translation id="6943939122536910181">Aftengt <ph name="DEVICE" /></translation> +<translation id="6944708469742828051">Þessi aðgangslykill verður aðeins vistaður í Windows Hello</translation> <translation id="6945221475159498467">Velja</translation> <translation id="694592694773692225">Lokað á framsendingu á þessari síðu.</translation> <translation id="6947015141909171112">Hér eru tillögur að uppskriftum sem byggjast á nýlegri leit þinni að uppskriftum. @@ -6567,6 +6583,7 @@ <translation id="7193051357671784796">Fyrirtækið þitt bætti þessu forriti við. Endurræstu forritið til að ljúka uppsetningu þess.</translation> <translation id="7193374945610105795">Engin aðgangsorð hafa verið vistuð fyrir <ph name="ORIGIN" /></translation> <translation id="7194873994243265344">Fyrirtækið þitt lokaði á þessa skrá því hún er dulkóðuð. Biddu eiganda hennar um að afkóða hana.</translation> +<translation id="7196272782924897510">Nota aðgangslykil úr öðru tæki?</translation> <translation id="7196913789568937443">Vistaðu öryggisafrit á Google Drive. Endurheimtu gögnin þín eða skiptu um tæki hvenær sem er. Öryggisafritunin felur í sér forritsgögn. Öryggisafritunum þínum er hlaðið inn á Google og þau dulkóðuð með aðgangsorði Google reikningsins. <ph name="BEGIN_LINK1" />Frekari upplýsingar<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Fáðu Google leit og Google snjalltækni í hvert skipti sem þú vafrar</translation> <translation id="719791532916917144">Flýtilykill</translation> @@ -7064,6 +7081,7 @@ <translation id="7670483791111801022">Skjátexti</translation> <translation id="7671130400130574146">Nota titilrönd og ramma kerfis</translation> <translation id="767127784612208024">Snertu til að staðfesta endurstillingu</translation> +<translation id="7672504401554182757">Veldu hvaða tæki er með aðgangslykil fyrir <ph name="APP_NAME" /></translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, á <ph name="PAGE_TITLE" />.</translation> <translation id="7674416868315480713">Gera framsendingu allra gátta óvirka í Linux</translation> <translation id="7674537509496907005"><ph name="APP_COUNT" /> forrit</translation> @@ -7173,6 +7191,7 @@ <translation id="7766807826975222231">Skoða kynningu</translation> <translation id="7766838926148951335">Samþykkja heimildir</translation> <translation id="7767554953520855281">Upplýsingar eru faldar á meðan þú deilir skjánum</translation> +<translation id="7767972280546034736">Búa til aðgangslykil fyrir <ph name="APP_NAME" /></translation> <translation id="7768507955883790804">Síður fylgja þessari stillingu sjálfkrafa þegar þú opnar þær</translation> <translation id="7768526219335215384"><ph name="ORIGIN" /> mun geta skoðað skrár í <ph name="FOLDERNAME" /></translation> <translation id="7768770796815395237">Breyta</translation> @@ -7660,6 +7679,7 @@ <translation id="820568752112382238">Mest heimsóttu vefsvæðin</translation> <translation id="8206745257863499010">Blúsaður</translation> <translation id="8206859287963243715">Farsímakerfi</translation> +<translation id="8207404892907560325">Veldu aðgangslykil</translation> <translation id="8208216423136871611">Ekki vista</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Ný tilkynning}one{# ný tilkynning}other{# nýjar tilkynningar}}</translation> <translation id="821119981794423735">Veldu CVS-skrá til að flytja aðgangsorð inn í Google aðgangsorðastjórnun fyrir <ph name="USER_EMAIL" /></translation> @@ -7831,6 +7851,7 @@ <translation id="8376137163494131156">Lýstu upplifun þinni af Google Cast.</translation> <translation id="8376384591331888629">Hafa fótspor þriðju aðila á þessu vefsvæði með</translation> <translation id="8376451933628734023">Þú ættir að fjarlægja þetta vefforrit ef það reynir að plata þig með því að þykjast vera eitthvert annað forrit.</translation> +<translation id="8377625247046155446">Þessi aðgangslykill verður aðeins vistaður í þessu tæki. Hann verður áfram í þessu tæki eftir að þú lokar öllum huliðsgluggum.</translation> <translation id="8378714024927312812">Stjórnað af fyrirtækinu þínu</translation> <translation id="8379156816349755485">Við innskráningu verður einkvæmt auðkenningarmerki geymt og notað fyrir allt gjaldgengt niðurhal í framtíðinni.</translation> <translation id="8379878387931047019">Þetta tæki styður ekki þá gerð öryggislykils sem vefsíðan óskar eftir</translation> @@ -8662,6 +8683,7 @@ <ph name="LIST_ITEM" />Keyra tengingargreiningu Chrome <ph name="END_LIST" /></translation> <translation id="916607977885256133">Mynd í mynd</translation> +<translation id="9166253503936244008">Skannaðu þennan QR-kóða með tækinu sem er með aðgangslykilinn sem þú vilt nota fyrir <ph name="APP_NAME" /></translation> <translation id="9167063903968449027">Sýna leslista</translation> <translation id="9167450455589251456">Prófíllinn er ekki studdur</translation> <translation id="9168436347345867845">Gera þetta seinna</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index a0c9a70c..b421091 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1875,6 +1875,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">監視対象ユーザーは管理者によって無効にされています。</translation> <translation id="2722540561488096675">デバイスは、<ph name="TIME_LEFT" /> 後にシャットダウンします。デバイスが再起動する前に USB を取り外してください。再起動すると、<ph name="DEVICE_OS" /> のご利用を開始できます。</translation> +<translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC ログ</translation> <translation id="272488616838512378">単位変換</translation> <translation id="2725200716980197196">ネットワーク接続を復元しました</translation> @@ -3041,6 +3042,7 @@ <translation id="3828029223314399057">ブックマークを検索</translation> <translation id="3828953470056652895"><ph name="BEGIN_LINK1" />Google 利用規約<ph name="END_LINK1" />、<ph name="BEGIN_LINK2" />Chrome および Chrome OS 追加利用規約<ph name="END_LINK2" />、<ph name="BEGIN_LINK3" />Play 利用規約<ph name="END_LINK3" />を確認し、内容に同意します。</translation> <translation id="3829765597456725595">SMB ファイル共有</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{管理者が 1 個の有害な可能性がある拡張機能を再度有効にしました}other{管理者が {NUM_EXTENSIONS} 個の有害な可能性がある拡張機能を再度有効にしました}}</translation> <translation id="3831436149286513437">Google ドライブのファイル候補</translation> <translation id="3834728400518755610">マイクの設定を変更するには、Linux をシャットダウンする必要があります。続行するには Linux をシャットダウンしてください。</translation> @@ -5155,6 +5157,7 @@ <translation id="5884474295213649357">このタブは USB デバイスに接続されています。</translation> <translation id="5885314688092915589">このプロフィールは組織によって管理されます</translation> <translation id="5886009770935151472">指 1</translation> +<translation id="5886112770923972514">近くにあるファスト ペアリング デバイスを接続して、すばやくセットアップする</translation> <translation id="5886384907280980632">今すぐオフにする</translation> <translation id="5889282057229379085">中間認証局の最大数: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">優先 Wi-Fi ネットワーク</translation> @@ -7730,6 +7733,7 @@ <translation id="8338952601723052325">デベロッパーのウェブサイト</translation> <translation id="833986336429795709">このリンクを開くにはアプリを選択します</translation> <translation id="8340547030807793004"><ph name="DEVICE" /> に対するその他の操作</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{最近、通知を多数受け取った <ph name="BEGIN_BOLD" />1 件のサイト<ph name="END_BOLD" />を確認する}other{最近、通知を多数受け取った <ph name="BEGIN_BOLD" />{NUM_SITES} 件のサイト<ph name="END_BOLD" />を確認する}}</translation> <translation id="8342221978608739536">試していない</translation> <translation id="8342861492835240085">コレクションを選択</translation> <translation id="8345848587667658367">スマートフォンの最近の写真、メディア、通知、アプリを表示できるようになりました</translation> @@ -8722,6 +8726,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">安全な接続を確立しています...</translation> <translation id="996803490569799917">大好きな人たちとの思い出などを見る</translation> +<translation id="997143476478634194">サイトにアクセスしたときにこの設定の動作を自動的に行います。多くのサイトは、最新情報やチャット メッセージなどを知らせる目的で通知を送信します。</translation> <translation id="99731366405731005">Wi-Fi 同期を使用するには <ph name="LINK1_BEGIN" />Chrome 同期<ph name="LINK1_END" />をオンにしてください。<ph name="LINK2_BEGIN" />詳細<ph name="LINK2_END" /></translation> <translation id="998747458861718449">検証(&I)</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 7b15c62c..f604367 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -274,6 +274,7 @@ <translation id="1244303850296295656">გაფართოების შეცდომა</translation> <translation id="1245628370644070008">ადგილობრივი მონაცემების აღდგენა</translation> <translation id="1246863218384630739"><ph name="VM_NAME" />-ის ინსტალაცია ვერ მოხერხდა: სურათის URL-მა დააბრუნა შეცდომის კოდი <ph name="HTTP_ERROR" />. მიმართეთ თქვენს ადმინისტრატორს.</translation> +<translation id="1249818027270187058">{NUM_SITES,plural, =1{შეტყობინებების გამოგზავნა არ არის დაშვებული 1 საიტისთვის}other{შეტყობინებების გამოგზავნა არ არის დაშვებული {NUM_SITES} საიტისთვის}}</translation> <translation id="1251366534849411931">მოსალოდნელი იყო გამხსნელი ფიგურული ფრჩხილი: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">ამ მოქმედებით გასუფთავდება საიტებისა და დაინსტალირებული აპების მიერ შენახული მონაცემების <ph name="TOTAL_USAGE" /></translation> <translation id="1251578593170406502">მიმდინარეობს მობილური ინტერნეტის ქსელების სკანირება...</translation> @@ -1245,6 +1246,7 @@ <translation id="2135787500304447609">&გაგრძელება</translation> <translation id="2136372518715274136">შეიყვანეთ ახალი პაროლი</translation> <translation id="2136476978468204130">თქვენ მიერ შეყვანილი საიდუმლო ფრაზა არასწორია</translation> +<translation id="2137128126782078222"><ph name="WEBSITE" />-ისგან შეტყობინებების მიღების აკრძალვა</translation> <translation id="2137891579555018930">ნებართვის მოლოდინში...</translation> <translation id="2139919072249842737">დაყენების ღილაკი</translation> <translation id="2140788884185208305">ბატარეის მდგომარეობა</translation> @@ -1640,6 +1642,7 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" />-ის დეინსტალაციისთვის გამორთეთ Windows.</translation> <translation id="2477065602824695373">ვინაიდან რამდენიმე გადამრთველი დააყენეთ, ავტომატური სკანირება გამოირთო.</translation> <translation id="2478176599153288112">მედია ფაილის ნებართვები „<ph name="EXTENSION" />“-თვის</translation> +<translation id="24786041351753425">ჩართეთ მონაცემთა აღდგენის სერვისი.</translation> <translation id="2480868415629598489">თქვენ მიერ კოპირებული და ჩასმული მონაცემების შეცვლა</translation> <translation id="2482878487686419369">შეტყობინებები</translation> <translation id="2482895651873876648">ჩანართი გადატანილია ჯგუფში <ph name="GROUP_NAME" /> — <ph name="GROUP_CONTENTS" /></translation> @@ -2255,6 +2258,7 @@ <translation id="3024374909719388945">24-საათიანი ფორმატის გამოყენება</translation> <translation id="3027296729579831126">მახლობლად გაზიარების ჩართვა</translation> <translation id="3029466929721441205">სტილუსის ხელსაწყოების ჩვენება თაროზე</translation> +<translation id="3029808567601324798">ჩაკეტვის დროა</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> დღესვე ითხოვს განახლების ჩამოტვირთვას. განახლება ავტომატურად ჩამოიტვირთება, როცა ინტერნეტს დაუკავშირდებით.}other{<ph name="MANAGER" /> ითხოვს განახლების ჩამოტვირთვას ბოლო ვადამდე. განახლება ავტომატურად ჩამოიტვირთება, როცა ინტერნეტს დაუკავშირდებით.}}</translation> <translation id="3030967311408872958">მზის ჩასვლიდან ამოსვლამდე</translation> <translation id="3031417829280473749">აგენტი X</translation> @@ -2483,6 +2487,7 @@ <translation id="3281892622610078515">კარანტინში მოსათავსებელი ფაილები და პროგრამები:</translation> <translation id="3282210178675490297">მიმდინარეობს ჩანართის გაზიარება <ph name="APP_NAME" />-თან</translation> <translation id="3285322247471302225">ახალი ჩ&ანართი</translation> +<translation id="3285500645985761267">საიტებისთვის ჯგუფში თქვენი აქტივობის ნახვის დაშვება</translation> <translation id="328571385944182268">გსურთ თქვენი პაროლების შენახვა?</translation> <translation id="3288047731229977326">დეველოპერის რეჟიმში გაშვებულმა გაფართოებებმა შეიძლება დააზიანოს თქვენი კომპიუტერი. თუ თქვენ არ ხართ დეველოპერი, უსაფრთხოების შენარჩუნებისათვის თქვენ უნდა გამორთოთ დეველოპერულ რეჟიმში გაშვებული გაფართოებები.</translation> <translation id="3289668031376215426">ავტომატური გამთავრულება</translation> @@ -2757,6 +2762,7 @@ <translation id="3541823293333232175">მიმაგრებულია</translation> <translation id="3543393733900874979">განახლება ვერ მოხერხდა (შეცდომა: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">X9.62 ECDSA ხელმოწერა SHA-512-ით</translation> +<translation id="3544058026430919413">კომპანიას შეუძლია საიტების იმ ჯგუფის განსაზღვრა, რომელსაც საშუალება აქვს, ქუქი-ჩანაწერების მეშვეობით გააზიაროთ თქვენი აქტივობა ჯგუფში. აღნიშნული გამორთულია ინკოგნიტო რეჟიმში.</translation> <translation id="3544879808695557954">მომხმარებლის სახელი (არასავალდებულო)</translation> <translation id="354602065659584722">საზიანო პროგრამული უზრუნველყოფა ამოიშალა</translation> <translation id="3547954654003013442">პროქსის პარამეტრები</translation> @@ -2896,6 +2902,7 @@ <translation id="3681548574519135185">ფოკუსის წრე</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> ეკრანის გაზიარების მოთხოვნა</translation> <translation id="3685598397738512288">Linux-ის USB-ის პარამეტრები</translation> +<translation id="3687598459967813435"><ph name="WEBSITE" />-ისგან შეტყობინებების მიღების ყოველთვის დაშვება</translation> <translation id="368789413795732264">ფაილის ჩაწერისას შეცდომა მოხდა: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">პროგრამაში გახსნილ ფაილებში და საქაღალდეებში ჩაწერა</translation> <translation id="3688526734140524629">არხის შეცვლა</translation> @@ -4057,6 +4064,7 @@ <translation id="4779766576531456629">eSIM ფიჭური ქსელის გადარქმევა</translation> <translation id="4780321648949301421">გვერდის შენახვა, როგორც…</translation> <translation id="4781443161433589743">თქვენ Chrome-ის უძლიერესი დაცვა გაქვთ ჩართული</translation> +<translation id="4781584184731045253">მონაცემებისა და ნებართვების გასუფთავება</translation> <translation id="4782861709165039462">ყველა მიკროფონი გათიშულია მოწყობილობების აპარატული გადამრთველით</translation> <translation id="4785719467058219317">თქვენ მიერ გამოყენებული უსაფრთხოების გასაღები არ არის რეგისტრირებული ამ ვებსაიტზე</translation> <translation id="4785914069240823137">ჩამოჭრის გაუქმება</translation> @@ -4198,6 +4206,7 @@ <translation id="4901154724271753917">ბოლო დროს დახურულის გაფართოება</translation> <translation id="4901309472892185668">აირჩიეთ მდგომარეობა ექსპერიმენტისთვის „<ph name="EXPERIMENT_NAME" />“.</translation> <translation id="49027928311173603">სერვერზე გადმოწერილი პოლიტიკა არასწორია: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4903967893652864401">ეს ფუნქცია ახანგრძლივებს ბატარეის მუშაობას ვიზუალური ეფექტებისა (მაგალითად, ლივლივა გადაადგილების) და ფონური აქტივობის შეზღუდვის გზით.</translation> <translation id="4906490889887219338">ქსელში ფაილების გაზიარების დაყენება ან მართვა. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="4907129260985716018">აირჩიეთ, როდის შეძლოთ ამ გაფართოებამ თქვენი საიტების მონაცემების წაკითხვა და შეცვლა</translation> <translation id="4907161631261076876">ამ ფაილის ჩამოტვირთვა ხშირად არ ხორციელდება ხოლმე და ის შეიძლება სახიფათო იყოს.</translation> @@ -4738,6 +4747,7 @@ <translation id="5449551289610225147">პაროლი არასწორია</translation> <translation id="5449588825071916739">ყველა ჩანართის სანიშნეებში დამატება</translation> <translation id="5449716055534515760">ფან&ჯრის დახურვა</translation> +<translation id="545133051331995777">ქსელთან კავშირი არ არის</translation> <translation id="5452446625764825792">ამიერიდან შეგიძლიათ ნახოთ თქვენი ტელეფონის ბოლოდროინდელი ფოტოები, მედიაფაილები და აპები</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (მუშაობს ხაზგარეშე)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" />-ით</translation> @@ -4781,6 +4791,7 @@ <translation id="5487521232677179737">მონაცემების წაშლა</translation> <translation id="5488093641312826914">„<ph name="COPIED_ITEM_NAME" />“ დაკოპირდა</translation> <translation id="5488508217173274228">დაშიფვრის ვარიანტების სინქრონიზაცია</translation> +<translation id="5489077378642700219"><ph name="WEBSITE" />-ისგან შეტყობინებების მიღების აკრძალვა, თუმცა მოგვიანებით კითხვის კვლავ დასმა</translation> <translation id="5489435190927933437"><ph name="DOMAIN" />-ისთვის შენახული პაროლები</translation> <translation id="5490721031479690399">Bluetooth მოწყობილობის გათიშვა</translation> <translation id="5490798133083738649">Linux-ისთვის თქვენს მიკროფონზე წვდომის დაშვება</translation> @@ -5119,6 +5130,7 @@ <translation id="5805697420284793859">ფანჯრების მმართველი</translation> <translation id="5806447147478173900">ნაჩვენები საიტების მიერ გამოყენებული მეხსიერების საერთო მოცულობა: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (ნაგულისხმევი)</translation> +<translation id="5809835394668218762">სხვა ქმედებები <ph name="WEBSITE" />-ისთვის</translation> <translation id="5810603387504252966">#borealis-enabled ჩართული უნდა იყოს chrome://flags-ში</translation> <translation id="5810809306422959727">ამ ანგარიშისთვის მშობელთა მიერ კონტროლის დამატება ვერ მოხერხდება</translation> <translation id="5811614940486072060">ამ ფაილის ჩამოტვირთვა ხშირად არ ხორციელდება ხოლმე და ის შეიძლება სახიფათო იყოს</translation> @@ -5133,6 +5145,7 @@ <translation id="5826395379250998812">დაუკავშირეთ <ph name="DEVICE_TYPE" /> თქვენს ტელეფონს. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="5826993284769733527">ნახევრადგამჭვირვალე</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">საიტების ჩვენება იმავე ჯგუფიდან</translation> <translation id="5827733057563115968">შემდეგი სიტყვის ამოცნობა</translation> <translation id="5828545842856466741">პროფილის დამატება…</translation> <translation id="5828633471261496623">ბეჭდვა…</translation> @@ -5249,6 +5262,7 @@ <translation id="5927232971138258197">ამ გაფართოებას შეუძლია <ph name="HOST" />-ის წაკითხვა და შეცვლა</translation> <translation id="592740088639760830">ამ კონტეინერის მუშაობის შეწყვეტა</translation> <translation id="592880897588170157">PDF-ფაილების ჩამოტვირთვა, Chrome-ში მათი ავტომატურად გახსნის ნაცვლად</translation> +<translation id="5928969282301718193">ამ დროისთვის ყველაფერი მზად არის</translation> <translation id="592919310198008711">გაფართოებაზე დაწკაპუნებისას</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> საჭიროებს <ph name="DEVICE_TYPE" />-ის დაუყოვნებლივ განახლებას.</translation> <translation id="5932224571077948991">საიტზე ნაჩვენებია მომაბეზრებელი ან შეცდომაში შემყვანი რეკლამა</translation> @@ -5299,6 +5313,7 @@ <translation id="5971037678316050792">Bluetooth ადაპტერის მდგომარეობის და დაწყვილების კონტროლი</translation> <translation id="597235323114979258">დანიშნულების სხვა ადგილების ნახვა</translation> <translation id="5972543790327947908">ზოგიერთი მხარდაჭერილი ბმული კვლავ გაიხსნება <ph name="APP_NAME" />-ში, <ph name="APP_NAME_2" />-ში ან <ph name="APP_NAME_3" />-ში.</translation> +<translation id="5972559880616357748">სხვა ქმედებები <ph name="SITE_GROUP" />-ისთვის</translation> <translation id="5972666587303800813">ფიქტიური სერვისი</translation> <translation id="5972708806901999743">თავში გადატანა</translation> <translation id="5972826969634861500"><ph name="PRODUCT_NAME" />-ის გაშვება</translation> @@ -5423,6 +5438,7 @@ <translation id="6087746524533454243">ბრაუზერის ინფორმაციის გვერდს ეძებთ? მოინახულეთ</translation> <translation id="6087960857463881712">არაჩვეულებრივი სახე</translation> <translation id="608912389580139775">ეს გვერდი საკითხავ სიას რომ დაამატოთ, დააწკაპუნეთ სანიშნეს ხატულაზე</translation> +<translation id="6091116443517744502">შეამოწმეთ კავშირი ინტერნეტთან და ცადოთ ხელახლა</translation> <translation id="6091761513005122595">გაზიარება მიერთებულია წარმატებით.</translation> <translation id="6093803049406781019">პროფილის წაშლა</translation> <translation id="6093888419484831006">განახლების გაუქმება…</translation> @@ -6087,6 +6103,7 @@ <translation id="6736243959894955139">მისამართი</translation> <translation id="6737393581255281855">გსურთ ნაჩვენები მონაცემების გასუფთავება?</translation> <translation id="6737663862851963468">Kerberos ბილეთის ამოშლა</translation> +<translation id="6738180164164974883">მესამე მხარის ქუქი-ჩანაწერების განსაზღვრის დაშვება</translation> <translation id="6738430949033571771">მიმდინარეობს ანგარიშის დადასტურება...</translation> <translation id="6739923123728562974">დესკტოპზე მალსახმობის ჩვენება</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> დაპაუზებულია</translation> @@ -6284,6 +6301,7 @@ <translation id="691106080621596509">ეს მოქმედება გაასუფთავებს <ph name="SITE_GROUP_NAME" />-ის, ქვესაიტებისა და მისი დაინსტალირებული აპის მიერ შენახულ ყველა მონაცემსა და ქუქი-ჩანაწერს</translation> <translation id="6911734910326569517">მეხსიერების მოხმარება</translation> <translation id="6912007319859991306">SIM ბარათის დაბლოკვა PIN-კოდით ფიჭური ქსელის მეშვეობით</translation> +<translation id="6912380255120084882">ცადეთ სხვა მოწყობილობა</translation> <translation id="691289340230098384">სუბტიტრების პარამეტრები</translation> <translation id="6914783257214138813">თქვენს პაროლებს დაინახავს ნებისმიერი, ვისაც ექნება წვდომა ექსპორტირებულ ფაილზე.</translation> <translation id="6916590542764765824">პროგრამული გაფართოებები</translation> @@ -6596,6 +6614,7 @@ <translation id="7222204278952406003">Chrome თქვენი ნაგულისხმევი ბრაუზერია</translation> <translation id="7222232353993864120">ელფოსტის მისამართი</translation> <translation id="7222235798733126207">საიტებს შორის შეზღუდული გაზიარება</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 საიტი <ph name="FPS_OWNER" />-ის ჯგუფში}other{{MEMBERS} საიტი <ph name="FPS_OWNER" />-ის ჯგუფში}}</translation> <translation id="7225082563376899794">პაროლების შევსებისას Windows Hello-ს გამოყენება</translation> <translation id="7225179976675429563">ქსელის ტიპი არ არის მითითებული</translation> <translation id="7227458944009118910">ქვემოთ ჩამოთვლილი აპები თავსებადია პროტოკოლურ ბმულებთანაც. სხვა აპები ნებართვას მოითხოვს.</translation> @@ -7109,6 +7128,7 @@ <translation id="7709152031285164251">ვერ მოხერხდა - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&ტრანსლირება…</translation> <translation id="7711900714716399411">ტელეფონის თქვენს კომპიუტერთან დასაკავშირებლად გამოიყენეთ USB კაბელი. თუ თქვენი ტელეფონი უკვე დაკავშირებულია, გამოაერთეთ და ხელახლა მიაერთეთ.</translation> +<translation id="7711968363685835633">პერსონალიზებული საუბრებისა და შემოთავაზებების, ასევე, მომხმარებლის ლექსიკონის გათიშვა</translation> <translation id="7712739869553853093">ბეჭდვის გადახედვის დიალოგი</translation> <translation id="7714307061282548371">ქუქი-ჩანაწერები <ph name="DOMAIN" />-დან დაშვებულია</translation> <translation id="7714464543167945231">სერტიფიკატი</translation> @@ -7181,6 +7201,7 @@ <translation id="7768770796815395237">შეცვლა</translation> <translation id="7768784765476638775">მონიშვნა წარმოსათქმელად</translation> <translation id="7769748505895274502">ბოლო დროს დახურულის ჩაკეცვა</translation> +<translation id="7770072242481632881">გვერდითი პანელის ამომრჩევი</translation> <translation id="7770406201819593386">ChromeOS Flex-ის დიაგნოსტიკური ტესტების გაშვება.</translation> <translation id="7770450735129978837">მაუსზე მარჯვენა დაწკაპუნება</translation> <translation id="7770612696274572992">სხვა მოწყობილობიდან დაკოპირდა სურათი</translation> @@ -7817,6 +7838,7 @@ <translation id="8353683614194668312">მას შეუძლია:</translation> <translation id="8354034204605718473">თქვენი ბავშვის PIN-კოდი დამატებულია</translation> <translation id="8356197132883132838"><ph name="TITLE" /> — <ph name="COUNT" /></translation> +<translation id="8356409598322585307">ეს მოწყობილობა უკვე დაარეგისტრირეთ. მისი ხელახლა რეგისტრაცია არ არის აუცილებელი.</translation> <translation id="8357388086258943206">შეცდომა Linux-ის ინსტალაციისას</translation> <translation id="8358685469073206162">აღვადგინოთ გვერდები?</translation> <translation id="8358912028636606457">ჩანართის აუდიოს ტრანსლირება ამ მოწყობილობაზე მხარდაუჭერელია.</translation> @@ -8476,6 +8498,7 @@ <translation id="8987927404178983737">თვე</translation> <translation id="8989359959810288806">ტეტერინგის სტატუსის განახლება</translation> <translation id="8991520179165052608">საიტს შეუძლია თქვენი მიკროფონის გამოყენება</translation> +<translation id="8993059306046735527">თუ თქვენი <ph name="DEVICE_TYPE" />-ის პაროლი დაგავიწყდებათ, ადგილობრივი მონაცემების აღდგენის საშუალება მაინც გექნებათ. დაგჭირდებათ თქვენს Google ანგარიშში შესვლა ან ანგარიშის აღდგენის პროცედურის გავლა.</translation> <translation id="899384117894244799">გსურთ შეზღუდული მომხმარებლის წაშლა?</translation> <translation id="899403249577094719">Netscape სერტიფიკატის ბაზის URL</translation> <translation id="899657321862108550">თქვენი Chrome ნებისმიერ ადგილას</translation> @@ -8575,6 +8598,7 @@ <translation id="9078316009970372699">მყისიერი ტეტერინგის გათიშვა</translation> <translation id="9078842827190780028">იხილეთ ძიების მეტი შედეგი გვერდით პანელზე</translation> <translation id="9079267182985899251">ეს ვარიანტი მალე აღარ იქნება მხარდაჭერილი. ჩანართის პრეზენტირებისთვის გამოიყენეთ <ph name="GOOGLE_MEET" />.</translation> +<translation id="9080175821499742274">მეხსიერების დამზოგი ათავისუფლეს მეხსიერებას არააქტიური ჩანართებიდან, რომ ის ხელმისაწვდომი იყოს აქტიური ჩანართებისა და სხვა აპებისთვის.</translation> <translation id="9080971985541434310">პროგნოზირებს თქვენს ინტერესებს — Chrome-ს შეუძლია თქვენი ინტერესების პროგნოზირება</translation> <translation id="9081543426177426948">თქვენ მიერ მონახულებული საიტები არ ინახება ინკოგნიტო რეჟიმში</translation> <translation id="9084064520949870008">გახსნა ფანჯარაში</translation> @@ -8764,6 +8788,7 @@ <translation id="964790508619473209">ეკრანის მოწყობა</translation> <translation id="965211523698323809">გაგზავნეთ და მიიღეთ ტექსტური შეტყობინებები თქვენს <ph name="DEVICE_TYPE" />-ზე. <ph name="LINK_BEGIN" />შეიტყვეთ მეტი<ph name="LINK_END" /></translation> <translation id="96535553604365597">Google Cast-ის შესახებ შეტყობინება</translation> +<translation id="965470117154635268">{NUM_SITES,plural, =1{შეამოწმეთ 1 საიტი, რომელმაც ზედმეტად ბევრი შეტყობინება გამოგზავნა ახლახან}other{შეამოწმეთ {NUM_SITES} საიტი, რომლებმაც ზედმეტად ბევრი შეტყობინება გამოგზავნა ახლახან}}</translation> <translation id="967398046773905967">საიტებისთვის HID მოწყობილობებზე წვდომის აკრძალვა</translation> <translation id="967624055006145463">შენახული მონაცემები</translation> <translation id="96774243435178359">მართული პრინტერები</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 3f85a2f..2dcc04ba 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1254,6 +1254,7 @@ <translation id="2135787500304447609">다시 시작(&R)</translation> <translation id="2136372518715274136">새 비밀번호 입력</translation> <translation id="2136476978468204130">입력한 암호가 잘못되었습니다.</translation> +<translation id="2137128126782078222"><ph name="WEBSITE" />의 알림 허용 안함</translation> <translation id="2137891579555018930">권한을 기다리는 중…</translation> <translation id="2139919072249842737">설정 버튼</translation> <translation id="2140788884185208305">배터리 상태</translation> @@ -1905,6 +1906,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">관리자가 관리 대상 사용자를 사용 중지했습니다.</translation> <translation id="2722540561488096675"><ph name="TIME_LEFT" /> 후 기기가 종료됩니다. 기기 전원을 다시 켜기 전에 USB를 제거하세요. 그런 다음 <ph name="DEVICE_OS" /> 사용을 시작할 수 있습니다</translation> +<translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC 로그</translation> <translation id="272488616838512378">단위 변환</translation> <translation id="2725200716980197196">네트워크 연결 복원</translation> @@ -2492,6 +2494,7 @@ <translation id="3281892622610078515">스팸 격리 저장소에 보관할 파일 및 프로그램:</translation> <translation id="3282210178675490297"><ph name="APP_NAME" /> 앱과 탭을 공유하는 중</translation> <translation id="3285322247471302225">새 탭(&T)</translation> +<translation id="3285500645985761267">관련 사이트에서 내 그룹 활동을 볼 수 있도록 허용</translation> <translation id="328571385944182268">비밀번호를 저장하시겠습니까?</translation> <translation id="3288047731229977326">개발자 모드로 실행 중인 확장 프로그램은 컴퓨터에 해를 줄 수 있습니다. 개발자가 아닌 경우 컴퓨터를 안전하게 사용하려면 개발자 모드로 실행 중인 확장 프로그램을 사용 중지해야 합니다.</translation> <translation id="3289668031376215426">자동 대문자화</translation> @@ -2766,6 +2769,7 @@ <translation id="3541823293333232175">할당됨</translation> <translation id="3543393733900874979">업데이트 실패(오류: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">SHA-512를 포함한 X9.62 ECDSA 서명</translation> +<translation id="3544058026430919413">회사는 쿠키를 사용하여 내 그룹 활동을 공유하는 사이트 그룹을 정의할 수 있습니다. 시크릿 모드에서는 이 기능이 사용 중지되어 있습니다.</translation> <translation id="3544879808695557954">사용자 이름(선택사항)</translation> <translation id="354602065659584722">유해한 소프트웨어가 삭제됨</translation> <translation id="3547954654003013442">프록시 설정</translation> @@ -2904,6 +2908,7 @@ <translation id="3681548574519135185">포커스 링</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> 화면 공유 요청</translation> <translation id="3685598397738512288">Linux USB 환경설정</translation> +<translation id="3687598459967813435"><ph name="WEBSITE" />의 알림 항상 허용</translation> <translation id="368789413795732264">파일 쓰기를 시도하는 동안 다음 오류가 발생했습니다. <ph name="ERROR_TEXT" /></translation> <translation id="3688507211863392146">애플리케이션에서 연 파일 및 폴더에 쓰기</translation> <translation id="3688526734140524629">채널 변경</translation> @@ -3076,6 +3081,7 @@ <translation id="3828029223314399057">북마크 검색</translation> <translation id="3828953470056652895"><ph name="BEGIN_LINK1" />Google 서비스 약관<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Chrome 및 ChromeOS 추가 서비스 약관<ph name="END_LINK2" />, <ph name="BEGIN_LINK3" />Play 서비스 약관<ph name="END_LINK3" />을 읽었으며 이에 동의합니다.</translation> <translation id="3829765597456725595">SMB 파일 공유</translation> +<translation id="3830268140528557982">위치: <ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{관리자가 1개의 잠재적으로 위험한 확장 프로그램을 다시 설정했습니다.}other{관리자가 {NUM_EXTENSIONS}개의 잠재적으로 위험한 확장 프로그램을 다시 설정했습니다.}}</translation> <translation id="3831436149286513437">Google Drive 검색 추천어</translation> <translation id="3834728400518755610">마이크 설정을 변경하려면 Linux를 종료해야 합니다. 계속하려면 Linux를 종료하세요.</translation> @@ -4061,6 +4067,7 @@ <translation id="4779766576531456629">eSIM 셀룰러 네트워크 이름 바꾸기</translation> <translation id="4780321648949301421">페이지를 다른 이름으로 저장...</translation> <translation id="4781443161433589743">Chrome의 가장 강력한 보안 기능으로 보호되고 있습니다.</translation> +<translation id="4781584184731045253">데이터 및 권한 지우기</translation> <translation id="4782861709165039462">기기 하드웨어 스위치로 인해 모든 마이크가 사용 중지됨</translation> <translation id="4785719467058219317">이 웹사이트에 등록되지 않은 보안 키를 사용하고 있습니다.</translation> <translation id="4785914069240823137">자르기 취소</translation> @@ -4741,6 +4748,7 @@ <translation id="5449551289610225147">비밀번호가 잘못되었습니다.</translation> <translation id="5449588825071916739">모든 탭 북마크</translation> <translation id="5449716055534515760">창 닫기(&D)</translation> +<translation id="545133051331995777">네트워크에 연결되지 않음</translation> <translation id="5452446625764825792">이제 휴대전화의 최근 사진, 미디어, 앱을 확인할 수 있습니다.</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" />(오프라인에서 사용 가능)</translation> <translation id="5454166040603940656">제공업체: <ph name="PROVIDER" /></translation> @@ -4784,6 +4792,7 @@ <translation id="5487521232677179737">인터넷 사용 기록 삭제</translation> <translation id="5488093641312826914">'<ph name="COPIED_ITEM_NAME" />'이(가) 복사됨</translation> <translation id="5488508217173274228">동기화된 데이터 암호화 옵션</translation> +<translation id="5489077378642700219"><ph name="WEBSITE" />의 알림을 허용하지 않고 나중에 묻기</translation> <translation id="5489435190927933437"><ph name="DOMAIN" />에 저장된 비밀번호</translation> <translation id="5490721031479690399">블루투스 기기 연결 해제</translation> <translation id="5490798133083738649">Linux에서 마이크에 액세스하도록 허용</translation> @@ -5121,6 +5130,7 @@ <translation id="5805697420284793859">창 관리자</translation> <translation id="5806447147478173900">표시된 사이트에서 사용 중인 총 저장용량: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0°(기본값)</translation> +<translation id="5809835394668218762"><ph name="WEBSITE" />의 작업 더보기</translation> <translation id="5810603387504252966">chrome://flags에서 #borealis-enabled를 사용 설정해야 합니다.</translation> <translation id="5810809306422959727">자녀 보호 기능을 사용할 수 없는 계정</translation> <translation id="5811614940486072060">일반적으로 다운로드하지 않는 파일이며 위험할 수 있습니다</translation> @@ -5135,6 +5145,7 @@ <translation id="5826395379250998812">휴대전화와 <ph name="DEVICE_TYPE" />을(를) 연결하세요. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="5826993284769733527">반투명</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">동일한 그룹의 사이트 표시</translation> <translation id="5827733057563115968">다음 예상 단어</translation> <translation id="5828545842856466741">프로필 추가...</translation> <translation id="5828633471261496623">인쇄 중...</translation> @@ -5205,6 +5216,7 @@ <translation id="5884474295213649357">이 탭이 USB 기기에 연결되었습니다.</translation> <translation id="5885314688092915589">이 프로필은 조직에서 관리합니다</translation> <translation id="5886009770935151472">지문 1</translation> +<translation id="5886112770923972514">근처의 빠른 페어링 기기를 연결하고 간단히 설정합니다</translation> <translation id="5886384907280980632">지금 끄기</translation> <translation id="5889282057229379085">중간 인증기관(CA)의 최대 개수: <ph name="NUM_INTERMEDIATE_CA" />개</translation> <translation id="5891688036610113830">선호하는 Wi-Fi 네트워크</translation> @@ -5249,6 +5261,7 @@ <translation id="5927232971138258197">이 확장 프로그램은 <ph name="HOST" />을 읽고 변경할 수 있습니다.</translation> <translation id="592740088639760830">컨테이너 중단</translation> <translation id="592880897588170157">Chrome에서 PDF 파일을 자동으로 여는 대신 다운로드</translation> +<translation id="5928969282301718193">모두 완료됨</translation> <translation id="592919310198008711">확장 프로그램을 클릭할 경우</translation> <translation id="5932209916647644605"><ph name="MANAGER" />에서 <ph name="DEVICE_TYPE" /> 기기를 즉시 업데이트할 것을 요청합니다.</translation> <translation id="5932224571077948991">사이트에서 방해가 되거나 사용자를 현혹하는 광고를 표시함</translation> @@ -5422,6 +5435,7 @@ <translation id="6087746524533454243">브라우저의 정보 페이지를 찾는다면 다음으로 이동하세요.</translation> <translation id="6087960857463881712">멋진 얼굴</translation> <translation id="608912389580139775">읽기 목록에 이 페이지를 추가하려면 북마크 아이콘을 클릭하세요.</translation> +<translation id="6091116443517744502">인터넷 연결을 확인하고 다시 시도하세요.</translation> <translation id="6091761513005122595">공유가 성공적으로 마운트되었습니다.</translation> <translation id="6093803049406781019">프로필 삭제</translation> <translation id="6093888419484831006">업데이트를 취소하는 중...</translation> @@ -6084,6 +6098,7 @@ <translation id="6736243959894955139">주소</translation> <translation id="6737393581255281855">표시된 데이터를 삭제하시겠습니까?</translation> <translation id="6737663862851963468">Kerberos 티켓 삭제</translation> +<translation id="6738180164164974883">서드 파티 쿠키 설정 허용</translation> <translation id="6738430949033571771">계정 확인 중...</translation> <translation id="6739923123728562974">바탕화면 바로가기 표시</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> 일시중지됨</translation> @@ -6281,6 +6296,7 @@ <translation id="691106080621596509"><ph name="SITE_GROUP_NAME" />, 모든 하위 사이트, 설치된 앱에서 저장한 데이터와 쿠키가 모두 삭제됩니다.</translation> <translation id="6911734910326569517">메모리 사용량</translation> <translation id="6912007319859991306">셀룰러 SIM PIN</translation> +<translation id="6912380255120084882">다른 기기 사용</translation> <translation id="691289340230098384">자막 환경설정</translation> <translation id="6914783257214138813">내보낸 파일을 볼 수 있는 모든 사용자에게 비밀번호가 표시됩니다.</translation> <translation id="6916590542764765824">확장 프로그램 관리</translation> @@ -6591,6 +6607,7 @@ <translation id="7222204278952406003">Chrome이 기본 브라우저로 설정되어 있습니다.</translation> <translation id="7222232353993864120">이메일 주소</translation> <translation id="7222235798733126207">사이트 간 공유 제한</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{<ph name="FPS_OWNER" />의 그룹에 사이트 1개 있음}other{<ph name="FPS_OWNER" />의 그룹에 사이트 {MEMBERS}개 있음}}</translation> <translation id="7225082563376899794">Windows Hello를 사용하여 비밀번호 입력</translation> <translation id="7225179976675429563">네트워크 유형이 없습니다.</translation> <translation id="7227458944009118910">아래에 나열된 앱은 프로토콜 링크도 처리할 수 있습니다. 목록에 없는 앱은 권한을 요청합니다.</translation> @@ -7103,6 +7120,7 @@ <translation id="7709152031285164251">실패 - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">전송(&C)...</translation> <translation id="7711900714716399411">USB 케이블로 휴대전화와 컴퓨터를 연결하세요. 휴대전화가 이미 연결되어 있다면 분리했다가 다시 연결하세요.</translation> +<translation id="7711968363685835633">맞춤 변환, 추천 및 사용자 사전 사용 중지</translation> <translation id="7712739869553853093">인쇄 미리보기 대화상자</translation> <translation id="7714307061282548371"><ph name="DOMAIN" />의 쿠키를 허용함</translation> <translation id="7714464543167945231">인증서</translation> @@ -7174,6 +7192,7 @@ <translation id="7768770796815395237">변경</translation> <translation id="7768784765476638775">텍스트 읽어주기</translation> <translation id="7769748505895274502">최근에 닫은 탭 접기</translation> +<translation id="7770072242481632881">측면 패널 선택기</translation> <translation id="7770406201819593386">ChromeOS Flex 진단 테스트를 실행합니다.</translation> <translation id="7770450735129978837">마우스 오른쪽 버튼 클릭</translation> <translation id="7770612696274572992">다른 기기에서 이미지가 복사됨</translation> @@ -7797,6 +7816,7 @@ <translation id="8338952601723052325">개발자 웹사이트</translation> <translation id="833986336429795709">이 링크를 열려면 앱을 선택하세요.</translation> <translation id="8340547030807793004"><ph name="DEVICE" />의 작업 메뉴 더보기</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{최근에 알림을 많이 보낸 <ph name="BEGIN_BOLD" />사이트 1개<ph name="END_BOLD" />를 검토합니다.}other{최근에 알림을 많이 보낸 <ph name="BEGIN_BOLD" />사이트 {NUM_SITES}개<ph name="END_BOLD" />를 검토합니다.}}</translation> <translation id="8342221978608739536">사용해 보지 않음</translation> <translation id="8342861492835240085">컬렉션 선택</translation> <translation id="8345848587667658367">이제 휴대전화의 최근 사진, 미디어, 알림, 앱을 확인할 수 있습니다.</translation> @@ -7810,6 +7830,7 @@ <translation id="8353683614194668312">앱의 권한:</translation> <translation id="8354034204605718473">자녀의 PIN 추가됨</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" />개</translation> +<translation id="8356409598322585307">이미 등록한 기기입니다. 다시 등록하지 않아도 됩니다.</translation> <translation id="8357388086258943206">Linux 설치 오류</translation> <translation id="8358685469073206162">페이지를 복원하시겠습니까?</translation> <translation id="8358912028636606457">이 기기에서는 탭 오디오 전송이 지원되지 않습니다.</translation> @@ -8792,6 +8813,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">안전한 연결 설정 중...</translation> <translation id="996803490569799917">좋아하는 인물과 남긴 추억 보기</translation> +<translation id="997143476478634194">사이트를 방문할 때 사이트에서 자동으로 이 설정을 따릅니다. 사이트에서는 보통 속보 또는 채팅 메시지에 관한 알림을 전송합니다.</translation> <translation id="99731366405731005">Wi-Fi 동기화를 사용하려면 <ph name="LINK1_BEGIN" />Chrome 동기화<ph name="LINK1_END" />를 사용 설정하세요. <ph name="LINK2_BEGIN" />자세히 알아보기<ph name="LINK2_END" /></translation> <translation id="998747458861718449">검사(&N)</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index bafe4b5a..a98c0de 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1909,6 +1909,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Администраторуңуз бул функцияны көзөмөлдөнгөн колдонуучулар үчүн өчүрүп койгон.</translation> <translation id="2722540561488096675">Түзмөгүңүз <ph name="TIME_LEFT" /> кийин өчөт. Түзмөктү кайра күйгүзгөнгө чейин USB'ни сууруп салыңыз. Андан кийин <ph name="DEVICE_OS" /> түзмөгүн колдонуп баштасаңыз болот.</translation> +<translation id="2722547199758472013">Идентификатор: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC таржымалдары</translation> <translation id="272488616838512378">Бирдик которуу</translation> <translation id="2725200716980197196">Тармактын туташуу жөндөмдүүлүгү калыбына келтирилди</translation> @@ -3082,6 +3083,7 @@ <translation id="3828029223314399057">Кыстармаларды издөө</translation> <translation id="3828953470056652895"><ph name="BEGIN_LINK1" />Google'дун Тейлөө шарттарын<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Chrome жана ChromeOS кошумча Тейлөө шарттарын<ph name="END_LINK2" /> жана <ph name="BEGIN_LINK3" />Play Тейлөө шарттарын<ph name="END_LINK3" /> окудум жана аларга макулмун.</translation> <translation id="3829765597456725595">SMB'дагы жалпы файлдар</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Администраторуңуз 1 мүмкүн болгон кооптуу кеңейтүүнү кайра күйгүзүп койду}other{Администраторуңуз {NUM_EXTENSIONS} мүмкүн болгон кооптуу кеңейтүүнү кайра күйгүзүп койду}}</translation> <translation id="3831436149286513437">Google Drive'тагы издөө сунуштары</translation> <translation id="3834728400518755610">Микрофондун жөндөөлөрүнө өзгөртүүлөр киргизилгендиктен Linux'ту жабуу керек. Улантуу үчүн Linux'ту жабыңыз.</translation> @@ -5218,6 +5220,7 @@ <translation id="5884474295213649357">Бул өтмөк USB түзмөгүнө туташтырылган.</translation> <translation id="5885314688092915589">Бул профилди уюмуңуз башкарат</translation> <translation id="5886009770935151472">1-манжа</translation> +<translation id="5886112770923972514">Жакын жердеги Ыкчам туташуу түзмөктөрүн туташтырып, ылдам тууралайсыз</translation> <translation id="5886384907280980632">Азыр өчүрүү</translation> <translation id="5889282057229379085">Ортодогу Тастыктама борборлорунун эң көп саны: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Тандалган Wi-Fi тармактары</translation> @@ -7816,6 +7819,7 @@ <translation id="8338952601723052325">Иштеп чыгуучунун вебсайты</translation> <translation id="833986336429795709">Бул шилтемени ачуудан мурда колдонмону тандаңыз</translation> <translation id="8340547030807793004"><ph name="DEVICE" /> боюнча башка аракеттер</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Жакында өтө көп билдирмелерди жөнөткөн <ph name="BEGIN_BOLD" />1 сайтты<ph name="END_BOLD" /> карап чыгуу}other{Жакында өтө көп билдирмелерди жөнөткөн <ph name="BEGIN_BOLD" />{NUM_SITES} сайтты<ph name="END_BOLD" /> карап чыгуу}}</translation> <translation id="8342221978608739536">Колдонуп көргөн жокмун</translation> <translation id="8342861492835240085">Жыйнакты тандаңыз</translation> <translation id="8345848587667658367">Телефонуңуздагы акыркы сүрөттөрдү, медиа файлдарды, билдирмелерди жана колдонмолорду көрө аласыз</translation> @@ -8813,6 +8817,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Коопсуз туташуу орнотулууда…</translation> <translation id="996803490569799917">Сүйүктүү адамдарыңыз жана башкалар жөнүндө эстен кеткис көз ирмемдерди көрүңүз</translation> +<translation id="997143476478634194">Сайттарга киргениңизде, ушул параметр автоматтык түрдө колдонулат. Адатта сайттар соңку жаңылыктар же чаттагы билдирүүлөр жөнүндө билдирмелерди жөнөтүшөт.</translation> <translation id="99731366405731005">Wi-Fi Sync функциясын колдонуу үчүн <ph name="LINK1_BEGIN" />Chrome шайкештирүүнү<ph name="LINK1_END" /> күйгүзүңүз. <ph name="LINK2_BEGIN" />Кеңири маалымат<ph name="LINK2_END" /></translation> <translation id="998747458861718449">И&зилдөө</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 7027551..6993d11 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">ສ້າງຂຶ້ນແລ້ວ</translation> <translation id="1067661089446014701">ເພື່ອຄວາມປອດໄພທີ່ເພີ່ມຂຶ້ນ, ທ່ານສາມາດເຂົ້າລະຫັດຜ່ານຢູ່ອຸປະກອນຂອງທ່ານໄດ້ກ່ອນທີ່ພວກມັນຈະໄດ້ຮັບການບັນທຶກໃສ່ບັນຊີ Google ຂອງທ່ານ</translation> <translation id="1067922213147265141">ການບໍລິການອື່ນຂອງ Google</translation> +<translation id="1069104208554708737">ກະແຈຜ່ານນີ້ຈະຖືກບັນທຶກໄວ້ຢູ່ອຸປະກອນນີ້ເທົ່ານັ້ນ</translation> <translation id="1069355737714877171">ລຶບໂປຣໄຟລ໌ eSIM ຊື່ <ph name="PROFILE_NAME" /> ອອກແລ້ວ</translation> <translation id="1069814191880976658">ເລືອກໜ້າຈໍອື່ນ</translation> <translation id="1070377999570795893">ໂປຣແກຣມອື່ນຢູ່ໃນຄອມພິວເຕີຂອງທ່{ານໄດ້ເພີ່ມສ່ວນຂະຫຍາຍທີ່ອາດຈະປ່ຽນແປງວິທີການເຮັດວຽກຂອງ Chrome ແລ້ວ. @@ -349,6 +350,7 @@ <translation id="1324106254079708331">ປົກປ້ອງບັນຊີ Google ສ່ວນຕົວຂອງທຸກຄົນທີ່ມີຄວາມສ່ຽງຕໍ່ກັບການໂຈມຕີແບບມີເປົ້າໝາຍ</translation> <translation id="1327272175893960498">ປີ້ Kerberos</translation> <translation id="1327495825214193325">ເພື່ອເປີດນຳໃຊ້ການດີບັກ ADB, ຈຳເປັນຕ້ອງຣີສະຕາດ <ph name="DEVICE_TYPE" /> ນີ້. ການປິດນຳໃຊ້ມັນຈຳເປັນຕ້ອງຣີເຊັດເປັນການຕັ້ງຄ່າຈາກໂຮງງານ.</translation> +<translation id="1327527584824210101">ໃຊ້ກະແຈຜ່ານຂອງທ່ານ</translation> <translation id="1327794256477341646">ຄຸນສົມບັດທີ່ຕ້ອງການໃຊ້ສະຖານທີ່ຈະໃຊ້ບໍ່ໄດ້</translation> <translation id="1331977651797684645">ນີ້ແມ່ນຂ້ອຍ.</translation> <translation id="1333489022424033687">ບາງຄຸນສົມບັດໃນ <ph name="ORIGIN" /> ອາດຈະບໍ່ເຮັດວຽກຈົນກວ່າວ່າທ່ານລຶບຂໍ້ມູນທີ່ເວັບໄຊອື່ນເກັບໄວ້ໃນອຸປະກອນຂອງທ່ານ</translation> @@ -409,6 +411,7 @@ <translation id="139013308650923562">ອະນຸຍາດໃຫ້ໃຊ້ຟອນທີ່ຕິດຕັ້ງຢູ່ອຸປະກອນຂອງທ່ານໄດ້</translation> <translation id="1390548061267426325">ເປີດເປັນແຖບທໍາມະດາ</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> ບໍ່ໄດ້ຮັບອະນຸຍາດໃຫ້ພິມຫາ <ph name="PRINTER_NAME" />. ກະລຸນາຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ.</translation> +<translation id="1392047138650695757">ວັດຈະນານຸກົມຜູ້ໃຊ້</translation> <translation id="1393283411312835250">ແສງແດດ ແລະ ເມກເຝື້ອ</translation> <translation id="1395730723686586365">ຕົວອັບເດດເລີ່ມຕົ້ນແລ້ວ</translation> <translation id="1395832189806039783">ໄຮໄລ້ລາຍການດ້ວຍໂຟກັສແປ້ນພິມ</translation> @@ -1529,6 +1532,7 @@ <translation id="2356070529366658676">ຖາມ</translation> <translation id="2357330829548294574">ລຶບ <ph name="USER_NAME" /> ອອກ</translation> <translation id="2358561147588818967">ເວັບໄຊສາມາດໃຊ້ JavaScript ໄດ້</translation> +<translation id="2358703245148663432">ອຸປະກອນອື່ນ</translation> <translation id="2358777858338503863">ຄລິກອະນຸຍາດຢູ່ <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">ແອັບ Linux ອາດບໍ່ຕອບສະໜອງ.</translation> <translation id="2359345697448000899">ຈັດການສ່ວນຂະຫຍາຍຂອງທ່ານໂດຍການຄລິກສ່ວນຂະຫຍາຍຢູ່ໃນເມນູເຄື່ອງມື.</translation> @@ -1889,6 +1893,7 @@ <translation id="271033894570825754">ໃຫມ່</translation> <translation id="2711073837061989559">ການທົດລອງໃຊ້</translation> <translation id="2712173769900027643">ຂໍການອະນຸຍາດ</translation> +<translation id="2712207122921938368">ສ້າງກະແຈຜ່ານຢູ່ອຸປະກອນອື່ນ</translation> <translation id="2713106313042589954">ປິດກ້ອງຖ່າຍຮູບ</translation> <translation id="2713444072780614174">ສີຂາວ</translation> <translation id="2714393097308983682">ຮ້ານຄ້າ Google Play</translation> @@ -2400,6 +2405,7 @@ <translation id="3182749001423093222">ກວດການສະກົດຄຳ</translation> <translation id="3183139917765991655">ຕົວນຳເຂົ້າໂປຣໄຟລ໌</translation> <translation id="3183143381919926261">ເຄືອຂ່າຍອິນເຕີເນັດມືຖື</translation> +<translation id="3183613134231754987">ກະແຈຜ່ານນີ້ຈະຖືກບັນທຶກໄວ້ໃນ Windows Hello ເທົ່ານັ້ນ. ມັນຈະຍັງຄົງຢູ່ອຸປະກອນນີ້ຫຼັງຈາກທີ່ທ່ານປິດໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນທັງໝົດແລ້ວ.</translation> <translation id="3183944777708523606">ການຈັດວາງໜ້າຈໍ</translation> <translation id="3184536091884214176">ຕັ້ງຄ່າ ຫຼື ຈັດການເຄື່ອງພິມ CUPS. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{ແອັບນີ້ຖືກບລັອກໄວ້}other{ບາງແອັບຖືກບລັອກໄວ້}}</translation> @@ -2879,6 +2885,7 @@ <translation id="3654045516529121250">ອ່ານການຕັ້ງຄ່າຄວາມສາມາດເຂົ້າຫາ</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{ມັນມີການເຂົ້າຫາໜຶ່ງໄຟລ໌ຖາວອນ.}other{ມັນມີການເຂົ້າຫາ # ໄຟລ໌ຖາວອນ.}}</translation> <translation id="3658871634334445293">ການເລັ່ງຄວາມໄວ TrackPoint</translation> +<translation id="3659550105763988702">ໃຊ້ກະແຈຜ່ານຂອງທ່ານສຳລັບ <ph name="APP_NAME" /></translation> <translation id="3659929705630080526">ທ່ານໃສ່ລະຫັດການເຂົ້າຫາບໍ່ຖືກຕ້ອງຫຼາຍເທື່ອເກີນໄປ. ກະລຸນາລອງໃໝ່ໃນພາຍຫຼັງ</translation> <translation id="3660234220361471169">ບໍ່ເຊື່ອຖືໄດ້</translation> <translation id="3664511988987167893">ໄອຄອນສ່ວນຂະຫຍາຍ</translation> @@ -3151,6 +3158,7 @@ <translation id="3898327728850887246"><ph name="SITE_NAME" /> ຕ້ອງການ: <ph name="FIRST_PERMISSION" /> ແລະ <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">ເລືອກແປ້ນພິມ</translation> <translation id="3900966090527141178">ສົ່ງລະຫັດຜ່ານອອກ</translation> +<translation id="3902789559055749153">ເລືອກວິທີທີ່ທ່ານຕ້ອງການສ້າງກະແຈຜ່ານສຳລັບ <ph name="APP_NAME" /></translation> <translation id="3903187154317825986">ແປ້ນພິມໃນຕົວ</translation> <translation id="3904326018476041253">ການບໍລິການສະຖານທີ່</translation> <translation id="3904849010307028014">ໂດຍອ້າງອີງໃສ່ການໂຕ້ຕອບຂອງທ່ານກັບເວັບໄຊໃດໜຶ່ງ, ເຊັ່ນ: ການເຂົ້າສູ່ລະບົບຫາບັນຊີຕາມປົກກະຕິ, ເວັບໄຊນັ້ນສາມາດອອກໂທເຄນຄວາມເຊື່ອຖືໄປໃຫ້ໂປຣແກຣມທ່ອງເວັບຂອງທ່ານໄດ້. ໃນພາຍຫຼັງ, ຫາກເວັບໄຊອື່ນໆທີ່ທ່ານເຂົ້າເບິ່ງມີການກວດຫາ ແລະ ພົບໂທເຄນຄວາມເຊື່ອຖືທີ່ຖືກຕ້ອງ, ກໍມີໂອກາດທີ່ພວກມັນຈະປະຕິບັດກັບທ່ານວ່າເປັນຄົນ ແລະ ບໍ່ແມ່ນບັອດ.</translation> @@ -3480,6 +3488,7 @@ <translation id="4218081191298393750">ຄລິກໃສ່ໄອຄອນລຳໂພງເພື່ອປິດສຽງແຖບນີ້</translation> <translation id="4219558185499589032">Box</translation> <translation id="4220648711404560261">ເກີດຄວາມຜິດພາດໃນລະຫວ່າງການເປີດນຳໃຊ້.</translation> +<translation id="4223845867739585293">ສ້າງກະແຈຜ່ານ</translation> <translation id="4225397296022057997">ໃນທຸກເວັບໄຊ</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{ບໍ່ອະນຸຍາດສ່ວນຂະຫຍາຍນີ້}other{ບໍ່ອະນຸຍາດສ່ວນຂະຫຍາຍບາງອັນ}}</translation> <translation id="4231095370974836764">ຕິດຕັ້ງແອັບ ແລະ ເກມຈາກ Google Play ໃນ <ph name="DEVICE_TYPE" /> ຂອງທ່ານ. <ph name="LINK_BEGIN" />ສຶກສາເພີ່ມເຕີມ<ph name="LINK_END" /></translation> @@ -4122,6 +4131,7 @@ <translation id="4838907349371614303">ອັບເດດລະຫັດຜ່ານແລ້ວ</translation> <translation id="4838958829619609362">ພາສາທີ່ເລືອກບໍ່ແມ່ນ <ph name="LANGUAGE" /></translation> <translation id="4839303808932127586">ບັນທຶກວິດີໂອເປັນ...</translation> +<translation id="4839910546484524995">ກວດເບິ່ງອຸປະກອນຂອງທ່ານ</translation> <translation id="4840096453115567876">ຢືນຢັນການອອກຈາກໂໝດບໍ່ເປີດເຜີຍຕົວຕົນບໍ?</translation> <translation id="4841741146571978176">ບໍ່ມີເຄື່ອງສະເໝືອນທີ່ຕ້ອງການ. ກະລຸນາລອງຕັ້ງ <ph name="VM_TYPE" /> ເພື່ອສືບຕໍ່</translation> <translation id="4842976633412754305">ໜ້ານີ້ພະຍາຍາມໂຫຼດໜັງສືຂຽນຈາກແຫຼ່ງທີ່ບໍ່ໄດ້ຮັບຮອງ.</translation> @@ -5038,6 +5048,7 @@ <translation id="5729712731028706266">ເບິ່ງ</translation> <translation id="5731247495086897348">ແປະໃສ່ ແລະຄົ້ນຫາ</translation> <translation id="5732392974455271431">ພໍ່ແມ່ຂອງທ່ານສາມາດຍົກເລີກການບລັອກມັນໃຫ້ທ່ານໄດ້</translation> +<translation id="5733109311583381874">ເພີ່ມຄຳສັບຂອງທ່ານໄປໃສ່ວັດຈະນານຸກົມຜູ້ໃຊ້ເພື່ອປັບແຕ່ງຕົວເລືອກການປ່ຽນຄ່າ.</translation> <translation id="5733866499231170760">ID ບໍ່ຖືກຕ້ອງ. ຮູບແບບທີ່ທ່ານລະບຸນັ້ນບໍ່ຖືກຕ້ອງ. ກະລຸນາກວດສອບຄຳແນະນຳທີ່ທ່ານໄດ້ຮັບເພື່ອກວດສອບວ່າທ່ານລະບຸ ID ໃນຮູບແບບທີ່ຖືກຕ້ອງແລ້ວ. ຫາກທ່ານບໍ່ສາມາດແກ້ໄຂບັນຫານີ້ໄດ້, ກະລຸນາເວັ້ນຫວ່າງຊ່ອງຂໍ້ມູນ ແລະ ສືບຕໍ່ການຕິດຕັ້ງ.</translation> <translation id="5734362860645681824">ການສື່ສານ</translation> <translation id="5734697361979786483">ເພີ່ມການແບ່ງປັນໄຟລ໌</translation> @@ -5147,6 +5158,7 @@ <translation id="583431638776747">ບໍ່ສາມາດໃຊ້ເວັບໄຊໄດ້</translation> <translation id="5834581999798853053">ຍັງເຫຼືອປະມານ <ph name="TIME" /> ນາທີ</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ການບັນທຶກກ້ອງຖ່າຍຮູບ ຫຼື ໄມໂຄຣໂຟນ</translation> +<translation id="5835625581856809102">ສະແກນລະຫັດ QR ນີ້ດ້ວຍອຸປະກອນທີ່ທ່ານຕ້ອງການສ້າງກະແຈຜ່ານສຳລັບ <ph name="APP_NAME" /></translation> <translation id="583673505367439042">ເວັບໄຊສາມາດຂໍແກ້ໄຂໄຟລ໌ ແລະ ໂຟນເດີໃນອຸປະກອນຂອງທ່ານໄດ້</translation> <translation id="5836999627049108525">ພາສາທີ່ຕ້ອງການແປ</translation> <translation id="583756221537636748">ເຄສ</translation> @@ -5385,6 +5397,7 @@ <translation id="6059276912018042191">ແຖບ Chrome ຫຼ້າສຸດ</translation> <translation id="6059652578941944813">ລໍາດັບໃບຮັບຮອງ</translation> <translation id="6059925163896151826">ອຸປະກອນ USB</translation> +<translation id="6061408389284235459">ສົ່ງການແຈ້ງເຕືອນໄປຫາ <ph name="DEVICE_NAME" /> ແລ້ວ</translation> <translation id="6063284707309177505">ສ້າງລະຫັດ QR</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />ໝາຍເຫດ:<ph name="END_BOLD" /> ສຽງເວົ້າ ຫຼື ການບັນທຶກທີ່ຄ້າຍກັນອາດສາມາດເຂົ້າເຖິງຜົນການຊອກຫາສ່ວນຕົວຂອງ <ph name="SUPERVISED_USER_NAME" /> ໄດ້. ເພື່ອປະຢັດແບັດເຕີຣີ, ທ່ານສາມາດເລືອກໃນການຕັ້ງຄ່າຜູ້ຊ່ວຍຂອງ <ph name="SUPERVISED_USER_NAME" /> ໃຫ້ເປີດ “Ok Google” ສະເພາະເມື່ອອຸປະກອນນີ້ເຊື່ອມຕໍ່ຫາແຫຼ່ງໄຟເທົ່ານັ້ນໄດ້.</translation> <translation id="6064217302520318294">ການລັອກໜ້າຈໍ</translation> @@ -5512,6 +5525,7 @@ <translation id="6178664161104547336">ເລືອກໃບຢັ້ງຢືນ</translation> <translation id="6178682841350631965">ອັບເດດຂໍ້ມູນການເຂົ້າສູ່ລະບົບຂອງທ່ານແລ້ວ</translation> <translation id="6180510783007738939">ເຄື່ອງມືເສັ້ນ</translation> +<translation id="6180550893222597997">ທ່ານຕ້ອງການໃຊ້ກະແຈຜ່ານໃດສຳລັບ <ph name="APP_NAME" />?</translation> <translation id="6181431612547969857">ບລັອກດາວໂຫຼດແລ້ວ</translation> <translation id="6184099524311454384">ຊອກຫາແຖບ</translation> <translation id="6185132558746749656">ທີ່ຕັ້ງອຸປະກອນ</translation> @@ -5947,6 +5961,7 @@ <translation id="6596816719288285829">ທີ່ຢູ່ IP</translation> <translation id="6597017209724497268">ຕົວຢ່າງ</translation> <translation id="6597331566371766302">ສ່ວນຂະຫຍາຍຕໍ່ໄປນີ້ຖືກບລັອກໄວ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ:</translation> +<translation id="6601262427770154296">ຈັດການວັດຈະນານຸກົມຜູ້ໃຊ້</translation> <translation id="6601612474695404578">ບາງເວັບໄຊໃຊ້ຄຸກກີ້ພາກສ່ວນທີສາມເພື່ອໂຫຼດໜ້າເວັບຂອງເຂົາເຈົ້າ. ຖ້າເວັບໄຊບໍ່ເຮັດວຽກ, ທ່ານສາມາດລອງອະນຸຍາດຄຸກກີ້.</translation> <translation id="6602937173026466876">ເຂົ້າເຖິງເຄື່ອງພິມຂອງທ່ານ</translation> <translation id="6602956230557165253">ໃຊ້ປຸ່ມລູກສອນຊ້າຍ ແລະຂວາ ເພື່ອກໍານົດທິດທາງ.</translation> @@ -6310,6 +6325,7 @@ <translation id="6943060957016121200">ເປີດການນຳໃຊ້ການປ່ອຍສັນຍານທັນທີ</translation> <translation id="6943176775188458830">ຍົກເລີກການພິມ</translation> <translation id="6943939122536910181">ຕັດການເຊື່ອມຕໍ່ຈາກ <ph name="DEVICE" /> ແລ້ວ</translation> +<translation id="6944708469742828051">ກະແຈຜ່ານຈະຖືກບັນທຶກໃນ Windows Hello ເທົ່ານັ້ນ</translation> <translation id="6945221475159498467">ເລືອກ</translation> <translation id="694592694773692225">ບລັອກການປ່ຽນເສັ້ນທາງໃນໜ້ານີ້ແລ້ວ.</translation> <translation id="6947015141909171112">ທ່ານກຳລັງເບິ່ງສູດໂດຍອ້າງອີງຈາກການເຄື່ອນໄຫວການຊອກຫາຫຼ້າສຸດຂອງທ່ານສຳລັບສູດ. @@ -6562,6 +6578,7 @@ <translation id="7193051357671784796">ແອັບນີ້ຖືກເພີ່ມເຂົ້າໂດຍອົງການຂອງທ່ານ. ປິດເປີດແອັບຄືນໃໝ່ເພື່ອສຳເລັດການຕິດຕັ້ງມັນ.</translation> <translation id="7193374945610105795">ບໍ່ມີລະຫັດຜ່ານທີ່ບັນທຶກໄວ້ສຳລັບ <ph name="ORIGIN" /></translation> <translation id="7194873994243265344">ອົງການຂອງທ່ານບລັອກໄຟລ໌ນີ້ໄວ້ເນື່ອງຈາກມັນຖືກເຂົ້າລະຫັດ. ກະລຸນາຂໍໃຫ້ເຈົ້າຂອງມັນຖອດລະຫັດ.</translation> +<translation id="7196272782924897510">ໃຊ້ກະແຈຜ່ານຈາກອຸປະກອນອື່ນບໍ?</translation> <translation id="7196913789568937443">ສຳຮອງຂໍ້ມູນໄວ້ໃນ Google Drive. ກູ້ຄືນຂໍ້ມູນຂອງທ່ານໄດ້ຢ່າງງ່າຍດາຍ ຫຼື ປ່ຽນອຸປະກອນໄດ້ທຸກເວລາ. ຂໍ້ມູນທີ່ສຳຮອງໄວ້ຂອງທ່ານຮວມເອົາຂໍ້ມູນແອັບ. ຂໍ້ມູນທີ່ສຳຮອງໄວ້ຂອງທ່ານຖືກອັບໂຫຼດໄວ້ໃນ Google ແລະ ເຂົ້າລະຫັດໄວ້ໂດຍໃຊ້ລະຫັດຜ່ານບັນຊີ Google ຂອງທ່ານ. <ph name="BEGIN_LINK1" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">ໃຊ້ Google ຊອກຫາ ແລະ Google ອັດສະລິຍະທຸກຄັ້ງທີ່ທ່ານທ່ອງເວັບ</translation> <translation id="719791532916917144">ຄີລັດ</translation> @@ -7059,6 +7076,7 @@ <translation id="7670483791111801022">ຄຳແປ</translation> <translation id="7671130400130574146">ໃຊ້ແຖບຫົວຂໍ້ລະບົບ ແລະເຂດແດນ</translation> <translation id="767127784612208024">ສຳຜັດເພື່ອຢືນຢັນການຣີເຊັດ</translation> +<translation id="7672504401554182757">ເລືອກວ່າອຸປະກອນໃດມີກະແຈຜ່ານສຳລັບ <ph name="APP_NAME" /></translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, ໃນ <ph name="PAGE_TITLE" />.</translation> <translation id="7674416868315480713">ປິດນຳໃຊ້ຜອດທັງໝົດທີ່ຖືກສົ່ງຕໍ່ໃນ Linux</translation> <translation id="7674537509496907005"><ph name="APP_COUNT" /> ແອັບ</translation> @@ -7168,6 +7186,7 @@ <translation id="7766807826975222231">ທ່ອງເບິ່ງ</translation> <translation id="7766838926148951335">ຍອມຮັບການອະນຸຍາດ</translation> <translation id="7767554953520855281">ເຊື່ອງລາຍລະອຽດໃນຂະນະທີ່ທ່ານແບ່ງປັນໜ້າຈໍຂອງທ່ານ</translation> +<translation id="7767972280546034736">ສ້າງກະແຈຜ່ານສຳລັບ <ph name="APP_NAME" /></translation> <translation id="7768507955883790804">ເວັບໄຊຈະປະຕິບັດຕາມການຕັ້ງຄ່ານີ້ໂດຍອັດຕະໂນມັດເມື່ອທ່ານເຂົ້າເບິ່ງພວກມັນ</translation> <translation id="7768526219335215384"><ph name="ORIGIN" /> ຈະສາມາດເບິ່ງໄຟລ໌ໃນ <ph name="FOLDERNAME" /> ໄດ້</translation> <translation id="7768770796815395237">ປ່ຽນ</translation> @@ -7654,6 +7673,7 @@ <translation id="820568752112382238">ເວັບໄຊທີ່ເຂົ້າເບິ່ງຫຼາຍທີ່ສຸດ</translation> <translation id="8206745257863499010">ບລູຊີ</translation> <translation id="8206859287963243715">ເຊວລູລາ</translation> +<translation id="8207404892907560325">ເລືອກກະແຈຜ່ານ</translation> <translation id="8208216423136871611">ຢ່າບັນທຶກ</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{ການແຈ້ງເຕືອນໃໝ່}other{ການແຈ້ງເຕືອນໃໝ່ # ລາຍການ}}</translation> <translation id="821119981794423735">ເພື່ອນຳເຂົ້າລະຫັດຜ່ານໄປໃສ່ຕົວຈັດການລະຫັດຜ່ານ Google ສຳລັບ <ph name="USER_EMAIL" />, ໃຫ້ເລືອກໄຟລ໌ CSV</translation> @@ -7825,6 +7845,7 @@ <translation id="8376137163494131156">ບອກພວກເຮົາວ່າກຳລັງເກີດຫຍັງຂຶ້ນກັບ Google Cast.</translation> <translation id="8376384591331888629">ຮວມທັງຄຸກກີ້ພາກສ່ວນທີສາມໃນເວັບໄຊນີ້</translation> <translation id="8376451933628734023">ຫາກເວັບແອັບນີ້ພະຍາຍາມຫຼອກລໍ້ໃຫ້ທ່ານຄິດວ່າມັນເປັນແອັບອື່ນ, ໃຫ້ຖອນການຕິດຕັ້ງມັນອອກ.</translation> +<translation id="8377625247046155446">ກະແຈຜ່ານນີ້ຈະຖືກບັນທຶກໄວ້ຢູ່ອຸປະກອນນີ້ເທົ່ານັ້ນ. ມັນຈະຍັງຄົງຢູ່ອຸປະກອນນີ້ຫຼັງຈາກທີ່ທ່ານປິດໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນທັງໝົດແລ້ວ.</translation> <translation id="8378714024927312812">ຈັດການໂດຍອົງການຂອງທ່ານ</translation> <translation id="8379156816349755485">ໃນເວລາເຂົ້າສູ່ລະບົບ, ໂທເຄນການພິສູດຢືນຢັນທີ່ບໍ່ຊ້ຳກັນຈະຖືກຈັດເກັບ ແລະ ຖືກໃຊ້ສຳລັບການດາວໂຫຼດທີ່ມີສິດໃນອະນາຄົດທັງໝົດ.</translation> <translation id="8379878387931047019">ອຸປະກອນນີ້ບໍ່ຮອງຮັບປະເພດກະແຈຄວາມປອດໄພທີ່ເວັບໄຊນີ້ຂໍເອົາ</translation> @@ -8655,6 +8676,7 @@ <ph name="LIST_ITEM" />ກຳລັງເອີ້ນໃຊ້ການວິເຄາະການເຊື່ອມຕໍ່ Chrome <ph name="END_LIST" /></translation> <translation id="916607977885256133">ສະແດງຜົນຫຼາຍຢ່າງພ້ອມກັນ</translation> +<translation id="9166253503936244008">ສະແກນລະຫັດ QR ນີ້ດ້ວຍອຸປະກອນທີ່ມີກະແຈຜ່ານທີ່ທ່ານຕ້ອງການໃຊ້ສຳລັບ <ph name="APP_NAME" /></translation> <translation id="9167063903968449027">ສະແດງລາຍຊື່ການອ່ານ</translation> <translation id="9167450455589251456">ບໍ່ຮອງຮັບໂປຣໄຟລ໌</translation> <translation id="9168436347345867845">ເຮັດໃນພາຍຫຼັງ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index 187ee7f..a600ffb 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1908,6 +1908,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Jūsų administratorius neleido naudoti prižiūrimo naudotojo profilio.</translation> <translation id="2722540561488096675">Jūsų įrenginys išsijungs po <ph name="TIME_LEFT" />. Atjunkite USB prieš vėl įjungdami įrenginį. Tada galėsite pradėti naudoti „<ph name="DEVICE_OS" />“.</translation> +<translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">„WebRTC“ žurnalai</translation> <translation id="272488616838512378">Matavimo vienetų konvertavimas</translation> <translation id="2725200716980197196">Tinklo ryšys atkurtas</translation> @@ -3082,6 +3083,7 @@ <translation id="3828029223314399057">Ieškoti žymėse</translation> <translation id="3828953470056652895">Perskaičiau <ph name="BEGIN_LINK1" />„Google“ paslaugų teikimo sąlygas<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />papildomas „Chrome“ ir „Chrome“ OS paslaugų teikimo sąlygas<ph name="END_LINK2" />, <ph name="BEGIN_LINK3" />„Play“ paslaugų teikimo sąlygas<ph name="END_LINK3" /> ir su jomis sutinku.</translation> <translation id="3829765597456725595">SMB failų bendrinimas</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Administratorius vėl įjungė 1 potencialiai žalingą plėtinį}one{Administratorius vėl įjungė {NUM_EXTENSIONS} potencialiai žalingą plėtinį}few{Administratorius vėl įjungė {NUM_EXTENSIONS} potencialiai žalingus plėtinius}many{Administratorius vėl įjungė {NUM_EXTENSIONS} potencialiai žalingo plėtinio}other{Administratorius vėl įjungė {NUM_EXTENSIONS} potencialiai žalingų plėtinių}}</translation> <translation id="3831436149286513437">„Google“ disko paieškos pasiūlymai</translation> <translation id="3834728400518755610">Norint pritaikyti mikrofono nustatymų pakeitimą, reikia išjungti „Linux“. Išjunkite „Linux“, jei norite tęsti.</translation> @@ -5219,6 +5221,7 @@ <translation id="5884474295213649357">Šis skirtukas susietas su USB įrenginiu.</translation> <translation id="5885314688092915589">Šį profilį tvarkys jūsų organizacija</translation> <translation id="5886009770935151472">Pirmas pirštas</translation> +<translation id="5886112770923972514">Prisijunkite ir greitai nustatykite sparčiojo susiejimo įrenginius netoliese</translation> <translation id="5886384907280980632">Išjungti dabar</translation> <translation id="5889282057229379085">Didžiausias tarpinių CA skaičius: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Pageidaujami „Wi-Fi“ tinklai</translation> @@ -7823,6 +7826,7 @@ <translation id="8338952601723052325">Kūrėjo svetainė</translation> <translation id="833986336429795709">Kad atidarytumėte šią nuorodą, pasirinkite programą</translation> <translation id="8340547030807793004">Daugiau veiksmų (<ph name="DEVICE" />)</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Peržiūrėkite <ph name="BEGIN_BOLD" />1 svetainę<ph name="END_BOLD" />, kuri neseniai išsiuntė daug pranešimų}one{Peržiūrėkite <ph name="BEGIN_BOLD" />{NUM_SITES} svetainę<ph name="END_BOLD" />, kurios neseniai išsiuntė daug pranešimų}few{Peržiūrėkite <ph name="BEGIN_BOLD" />{NUM_SITES} svetaines<ph name="END_BOLD" />, kurios neseniai išsiuntė daug pranešimų}many{Peržiūrėkite <ph name="BEGIN_BOLD" />{NUM_SITES} svetainės<ph name="END_BOLD" />, kurios neseniai išsiuntė daug pranešimų}other{Peržiūrėkite <ph name="BEGIN_BOLD" />{NUM_SITES} svetainių<ph name="END_BOLD" />, kurios neseniai išsiuntė daug pranešimų}}</translation> <translation id="8342221978608739536">Nebandžiau</translation> <translation id="8342861492835240085">Pasirinkti kolekciją</translation> <translation id="8345848587667658367">Dabar galite peržiūrėti naujausias telefono nuotraukas, mediją, pranešimus ir programas</translation> @@ -8822,6 +8826,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Kuriamas saugus ryšys...</translation> <translation id="996803490569799917">Mėgstamiausių žmonių ir kitų prisiminimų peržiūra</translation> +<translation id="997143476478634194">Šis nustatymas automatiškai pritaikomas svetainėms, kai jose apsilankote. Svetainės paprastai siunčia pranešimus informuodamos apie karščiausias naujienas ar pokalbių pranešimus.</translation> <translation id="99731366405731005">Norėdami naudoti „Wi-Fi“ sinchronizavimą, įjunkite <ph name="LINK1_BEGIN" />„Chrome“ sinchronizavimo funkciją<ph name="LINK1_END" />. <ph name="LINK2_BEGIN" />Sužinokite daugiau<ph name="LINK2_END" /></translation> <translation id="998747458861718449">A&pžiūrėti</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index bb45b2e..cb5b0e65 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -277,6 +277,7 @@ <translation id="1244303850296295656">Грешка на наставка</translation> <translation id="1245628370644070008">Враќање на локалните податоци</translation> <translation id="1246863218384630739">Не можеше да се инсталира <ph name="VM_NAME" />: се појави грешка со код <ph name="HTTP_ERROR" /> за URL на сликата. Контактирајте со администраторот.</translation> +<translation id="1249818027270187058">{NUM_SITES,plural, =1{Известувањата не се дозволени за 1 сајт}one{Известувањата не се дозволени за {NUM_SITES} сајт}other{Известувањата не се дозволени за {NUM_SITES} сајтови}}</translation> <translation id="1251366534849411931">Се очекува лева голема заграда: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">Ова ќе ги избрише податоците (<ph name="TOTAL_USAGE" />) складирани од сајтовите и инсталираните апликации</translation> <translation id="1251578593170406502">Се скенираат мрежи за мобилен интернет…</translation> @@ -1657,6 +1658,7 @@ <translation id="2476974672882258506">Исклучете го Windows за да се деинсталира <ph name="PARALLELS_DESKTOP" />.</translation> <translation id="2477065602824695373">Автоматското скенирање е исклучено бидејќи доделивте повеќе прекинувачи.</translation> <translation id="2478176599153288112">Дозволи на медиумски датотеки за „<ph name="EXTENSION" />“</translation> +<translation id="24786041351753425">Овозможете услуга за враќање податоци.</translation> <translation id="2480868415629598489">Измена на податоците што ги копирате</translation> <translation id="2482878487686419369">Известувања</translation> <translation id="2482895651873876648">Картичката е преместена во групата <ph name="GROUP_NAME" /> - <ph name="GROUP_CONTENTS" /></translation> @@ -2272,6 +2274,7 @@ <translation id="3024374909719388945">Користи 24-часовен часовник</translation> <translation id="3027296729579831126">Вклучете „Споделување во близина“</translation> <translation id="3029466929721441205">Прикажи ја алатката пенкало на полицата</translation> +<translation id="3029808567601324798">Време до заклучување</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> бара да преземете ажурирање денес. Ажурирањето ќе се преземе автоматски кога ќе се поврзете на интернет.}one{<ph name="MANAGER" /> бара да преземете ажурирање пред крајниот рок. Ажурирањето ќе се преземе автоматски кога ќе се поврзете на интернет.}other{<ph name="MANAGER" /> бара да преземете ажурирање пред крајниот рок. Ажурирањето ќе се преземе автоматски кога ќе се поврзете на интернет.}}</translation> <translation id="3030967311408872958">Од зајдисонце до изгрејсонце</translation> <translation id="3031417829280473749">Агентката X</translation> @@ -4220,6 +4223,7 @@ <translation id="4901154724271753917">Проширете ги неодамна затворените</translation> <translation id="4901309472892185668">Изберете состојба на експериментот за <ph name="EXPERIMENT_NAME" />.</translation> <translation id="49027928311173603">Правилото преземено од серверот е неважечко: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4903967893652864401">Ова го продолжува траењето на батеријата со ограничување на активностите во заднина и визуелните ефекти, како што е непреченото лизгање.</translation> <translation id="4906490889887219338">Поставете ги или управувајте со мрежните споделувања. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="4907129260985716018">Изберете кога екстензијава може да ги чита и изменува податоците од сајтот</translation> <translation id="4907161631261076876">Датотекава обично не се презема и може да биде опасна.</translation> @@ -5326,6 +5330,7 @@ <translation id="5971037678316050792">Контрола на состојбата и спарувањето на адаптерот за Bluetooth</translation> <translation id="597235323114979258">Видете повеќе дестинации</translation> <translation id="5972543790327947908">Некои поддржани линкови сѐ уште ќе се отвораат во <ph name="APP_NAME" />, <ph name="APP_NAME_2" /> или <ph name="APP_NAME_3" />.</translation> +<translation id="5972559880616357748">Повеќе дејства за <ph name="SITE_GROUP" /></translation> <translation id="5972666587303800813">Услугата не работи</translation> <translation id="5972708806901999743">Премести на врвот</translation> <translation id="5972826969634861500">Стартувај <ph name="PRODUCT_NAME" /></translation> @@ -8516,6 +8521,7 @@ <translation id="8987927404178983737">Месец</translation> <translation id="8989359959810288806">Освежи го статусот на интернет преку мобилен</translation> <translation id="8991520179165052608">Сајтот може да го користи микрофонот</translation> +<translation id="8993059306046735527">Ако ја заборавите лозинката за <ph name="DEVICE_TYPE" />, сепак ќе може да ги вратите локалните податоци. Ќе треба да се најавите на сметката на Google или да користите враќање сметка.</translation> <translation id="899384117894244799">Отстрани ограничен корисник</translation> <translation id="899403249577094719">Основен URL за сертификат на Netscape</translation> <translation id="899657321862108550">Вашиот Chrome, насекаде</translation> @@ -8615,6 +8621,7 @@ <translation id="9078316009970372699">Оневозможување инстант врзување</translation> <translation id="9078842827190780028">Гледајте повеќе резултати од пребарување на страничната табла</translation> <translation id="9079267182985899251">Наскоро опцијава веќе нема да се поддржува. Користете <ph name="GOOGLE_MEET" /> за презентација на картичка.</translation> +<translation id="9080175821499742274">„Штедачот на меморија“ ја ослободува меморијата од неактивните картички за да може да ја користат активните картички и други апликации.</translation> <translation id="9080971985541434310">ги проценува вашите интереси - Chrome може да ги процени вашите интереси</translation> <translation id="9081543426177426948">Сајтовите што ги посетувате не се зачувуваат во режимот „Инкогнито“</translation> <translation id="9084064520949870008">Отвори како прозорец</translation> @@ -8804,6 +8811,7 @@ <translation id="964790508619473209">Подредување на екранот</translation> <translation id="965211523698323809">Испраќајте и примајте SMS-пораки од вашиот <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Дознајте повеќе<ph name="LINK_END" /></translation> <translation id="96535553604365597">Пријавете проблем во Google Cast</translation> +<translation id="965470117154635268">{NUM_SITES,plural, =1{Прегледајте 1 сајт што неодамна испрати многу известувања}one{Прегледајте {NUM_SITES} сајт што неодамна испратија многу известувања}other{Прегледајте {NUM_SITES} сајтови што неодамна испратија многу известувања}}</translation> <translation id="967398046773905967">Не дозволувај ниту еден сајт да пристапува до HID-уредите</translation> <translation id="967624055006145463">Складирани податоци</translation> <translation id="96774243435178359">Управувани печатачи</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 49d2f6e..0b832f9 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1253,6 +1253,7 @@ <translation id="2135787500304447609">& Сэргээн үргэлжүүлэх</translation> <translation id="2136372518715274136">Шинэ нууц үг оруулна уу</translation> <translation id="2136476978468204130">Таны оруулсан нэвтрэх үг буруу байна</translation> +<translation id="2137128126782078222"><ph name="WEBSITE" />-н мэдэгдлийг бүү зөвшөөр</translation> <translation id="2137891579555018930">Зөвшөөрөл хүлээж байна...</translation> <translation id="2139919072249842737">Тохируулах товчлуур</translation> <translation id="2140788884185208305">Батарейн барилт</translation> @@ -2494,6 +2495,7 @@ <translation id="3281892622610078515">Тусгаарлах файл болон программ:</translation> <translation id="3282210178675490297">Табыг <ph name="APP_NAME" />-тай хуваалцаж байна</translation> <translation id="3285322247471302225">Шинэ &Цонх</translation> +<translation id="3285500645985761267">Холбоотой сайтуудад таны бүлэг дэх үйл ажиллагааг харахыг зөвшөөрнө үү</translation> <translation id="328571385944182268">Таны нууц үгийг хадгалах уу?</translation> <translation id="3288047731229977326">Хөгжүүлэгч горим дээр ачаалж буй өргөтгөл нь таны компьютерийг гэмтээж болзошгүй байна. Хэрэв та хөгжүүлэгч биш бол аюулгүй байдлаа хангах үүднээс хөгжүүлэгч горим дээр ачаалж буй өргөтгөлийг идэвхгүй болгоно уу.</translation> <translation id="3289668031376215426">Автоматаар томруулах</translation> @@ -2768,6 +2770,7 @@ <translation id="3541823293333232175">Оноосон</translation> <translation id="3543393733900874979">Шинэчлэл хийгдэж явцад алдаа гарсан байна (Алдаа: <ph name="ERROR_NUMBER" /> )</translation> <translation id="3543597750097719865">X9.62 ECDSA SHA-512-тэй гарын үсэг</translation> +<translation id="3544058026430919413">Таны үйл ажиллагааг бүлэгт хуваалцахын тулд күүки ашиглах боломжтой сайтуудын бүлгийг компаниас тодорхойлох боломжтой. Энэ нь Нууцлалтай горимд унтраалттай.</translation> <translation id="3544879808695557954">Хэрэглэгчийн нэр (сонголтот)</translation> <translation id="354602065659584722">Аюултай программыг устгасан</translation> <translation id="3547954654003013442">Прокси тохиргоо</translation> @@ -2907,6 +2910,7 @@ <translation id="3681548574519135185">Гарыг фокуслах</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> Дэлгэцийг хуваалцах хүсэлт</translation> <translation id="3685598397738512288">Linux-н USB сонголт</translation> +<translation id="3687598459967813435"><ph name="WEBSITE" />-н мэдэгдлийг үргэлж зөвшөөрөх</translation> <translation id="368789413795732264">Файлыг бичиж авахыг оролдож байх үед алдаа гарлаа <ph name="ERROR_TEXT" /> .</translation> <translation id="3688507211863392146">Аппликейшн дотор өөрийн нээсэн файл болон хавтас бичнэ үү.</translation> <translation id="3688526734140524629">Сувгийг өөрчлөх</translation> @@ -4068,6 +4072,7 @@ <translation id="4779766576531456629">eSIM-н үүрэн холбооны сүлжээний нэрийг өөрчлөх</translation> <translation id="4780321648949301421">Хуудсыг... хэлбэрээр хадгалах</translation> <translation id="4781443161433589743">Та Chrome-н хамгийн найдвартай хамгаалалтад байна</translation> +<translation id="4781584184731045253">Өгөгдөл болон зөвшөөрөл арилгах</translation> <translation id="4782861709165039462">Бүх микрофоныг төхөөрөмжүүдийн техник хангамжийн сэлгүүрээр идэвхгүй болгосон</translation> <translation id="4785719467058219317">Та энэ веб сайтад бүртгүүлээгүй аюулгүй байдлын түлхүүрийг ашиглаж байна</translation> <translation id="4785914069240823137">Тайралтыг цуцална уу</translation> @@ -4749,6 +4754,7 @@ <translation id="5449551289610225147">Буруу нууц үг</translation> <translation id="5449588825071916739">Бүх цонхнуудыг хадгалах</translation> <translation id="5449716055534515760">Цонхыг хаах</translation> +<translation id="545133051331995777">Сүлжээний холболт алга</translation> <translation id="5452446625764825792">Та одоо утасныхаа саяны зургууд, медиа болон аппуудыг харах боломжтой</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (офлайн үед ажиллана)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" />-тэй</translation> @@ -4792,6 +4798,7 @@ <translation id="5487521232677179737">Өгөгдлийг устгах</translation> <translation id="5488093641312826914">'<ph name="COPIED_ITEM_NAME" />'-г хуулсан</translation> <translation id="5488508217173274228">Шифрлэлтийн сонголтуудыг синк хийх</translation> +<translation id="5489077378642700219"><ph name="WEBSITE" />-н мэдэгдлийг бүү зөвшөөр, гэхдээ дараа асуу</translation> <translation id="5489435190927933437"><ph name="DOMAIN" />-д хадгалсан нууц үг</translation> <translation id="5490721031479690399">Bluetooth төхөөрөмжийг салгах</translation> <translation id="5490798133083738649">Linux-д таны микрофонд хандахыг зөвшөөрнө үү</translation> @@ -5131,6 +5138,7 @@ <translation id="5805697420284793859">Цонхны менежер</translation> <translation id="5806447147478173900">Үзүүлсэн сайтуудын хадгалах сангийн ашиглалтын нийт хэмжээ: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (өгөгдмөл)</translation> +<translation id="5809835394668218762"><ph name="WEBSITE" />-н бусад үйлдэл</translation> <translation id="5810603387504252966">chrome://flags-д #borealis-enabled-г идэвхжүүлсэн байх ёстой</translation> <translation id="5810809306422959727">Энэ бүртгэл эцэг эхийн хяналтын эрхгүй</translation> <translation id="5811614940486072060">Энэ файлыг ихэвчлэн татдаггүй бөгөөд аюултай байж магадгүй</translation> @@ -5145,6 +5153,7 @@ <translation id="5826395379250998812"><ph name="DEVICE_TYPE" />-г утастайгаа холбоно уу. <ph name="LINK_BEGIN" />Нэмэлт мэдээлэл авах<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Хагас тунгалаг</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Сайтуудыг ижил бүлэгт харуулах</translation> <translation id="5827733057563115968">Дараагийн үг тааварлалт</translation> <translation id="5828545842856466741">Профайл нэмэх...</translation> <translation id="5828633471261496623">Хэвлэж байна...</translation> @@ -5260,6 +5269,7 @@ <translation id="5927232971138258197">Энэ өргөтгөл нь <ph name="HOST" />-г унших, өөрчлөх боломжтой</translation> <translation id="592740088639760830">Энэ контейнерыг зогсоох</translation> <translation id="592880897588170157">PDF файлыг автоматаар Chrome-д нээхийн оронд татна уу</translation> +<translation id="5928969282301718193">Одоогоор дууссан байна</translation> <translation id="592919310198008711">Намайг өргөтгөлийг товших үед</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> таныг өөрийн <ph name="DEVICE_TYPE" />-г нэн даруй шинэчлэхийг шаардаж байна.</translation> <translation id="5932224571077948991">Сайт төвөгтэй эсвэл хуурамч зар харуулдаг</translation> @@ -5434,6 +5444,7 @@ <translation id="6087746524533454243">Хөтчийн талаарх хуудсыг хайж байна уу? Зочлох</translation> <translation id="6087960857463881712">Гайхалтай нүүр</translation> <translation id="608912389580139775">Энэ хуудсыг унших жагсаалтдаа нэмэхийн тулд Хавчуурганы дүрс тэмдгийг товшино уу</translation> +<translation id="6091116443517744502">интернэт холболтоо шалгаад, дахин оролдоно уу</translation> <translation id="6091761513005122595">Хуваалцлыг амжилттай салгасан.</translation> <translation id="6093803049406781019">Профайл устгах</translation> <translation id="6093888419484831006">Шинэчлэлтийг устгаж байна...</translation> @@ -6098,6 +6109,7 @@ <translation id="6736243959894955139">Хаяг</translation> <translation id="6737393581255281855">Үзүүлсэн өгөгдлийг арилгах уу?</translation> <translation id="6737663862851963468">Kerberos тасалбарыг хасах</translation> +<translation id="6738180164164974883">Гуравдагч талын күүки тохируулахыг зөвшөөрөх</translation> <translation id="6738430949033571771">Бүртгэлийг баталгаажуулж байна...</translation> <translation id="6739923123728562974">Дэлгэцийн товчлолыг харуулах</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" />-г түр зогсоосон</translation> @@ -6295,6 +6307,7 @@ <translation id="691106080621596509">Энэ нь <ph name="SITE_GROUP_NAME" /> болон үүний доорх аливаа сайт, суулгасан аппын хадгалсан бүх өгөгдөл, күүкийг арилгана</translation> <translation id="6911734910326569517">Санах ойн ул мөр</translation> <translation id="6912007319859991306">Үүрэн холбооны SIM-н ПИН</translation> +<translation id="6912380255120084882">Өөр төхөөрөмж туршина уу</translation> <translation id="691289340230098384">Хадмалын тохируулга</translation> <translation id="6914783257214138813">Экспорт хийсэн файлыг харах боломжтой хүн бүрд таны нууц үг харагдана.</translation> <translation id="6916590542764765824">Удирдлаганд байдаг өргөтгөлүүд</translation> @@ -6607,6 +6620,7 @@ <translation id="7222204278952406003">Chrome таны өгөгдмөл хөтөч боллоо</translation> <translation id="7222232353993864120">И-мэйл хаяг</translation> <translation id="7222235798733126207">Сайт хооронд хуваалцахыг хязгаарлаарай</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 сайт <ph name="FPS_OWNER" />-н бүлэгт байна}other{{MEMBERS} сайт <ph name="FPS_OWNER" />-н бүлэгт байна}}</translation> <translation id="7225082563376899794">Нууц үг оруулахдаа Windows Hello ашиглана уу</translation> <translation id="7225179976675429563">Сүлжээний төрөл алга байна</translation> <translation id="7227458944009118910">Доор жагсаасан аппууд мөн протоколын холбоосыг зохицуулах боломжтой. Бусад апп зөвшөөрөл хүснэ.</translation> @@ -7120,6 +7134,7 @@ <translation id="7709152031285164251">Амжилтгүй боллоо - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Дамжуулах...</translation> <translation id="7711900714716399411">Та утсаа компьютертоо холбохын тулд USB кабель ашиглана уу. Хэрэв таны утас аль хэдийн холбогдсон бол салгаад, буцааж залгана уу.</translation> +<translation id="7711968363685835633">Хувийн болгосон хувиралт болон зөвлөмжөөс гадна хэрэглэгчийн толийг идэвхгүй болгох</translation> <translation id="7712739869553853093">Урьдчилан үзэх харилцах цонхыг хэвлэх</translation> <translation id="7714307061282548371"><ph name="DOMAIN" />-н күүкиг зөвшөөрсөн</translation> <translation id="7714464543167945231">Сертификат</translation> @@ -7192,6 +7207,7 @@ <translation id="7768770796815395237">Өөрчлөх</translation> <translation id="7768784765476638775">Ярихаар-сонгох</translation> <translation id="7769748505895274502">Саяхан хаагдсан табуудыг хураах</translation> +<translation id="7770072242481632881">Хажуугийн самбар сонгогч</translation> <translation id="7770406201819593386">ChromeOS Flex-н оношилгооны туршилтыг ажиллуулах</translation> <translation id="7770450735129978837">Хулганын баруун талыг товших</translation> <translation id="7770612696274572992">Өөр төхөөрөмжөөс хуулсан зураг</translation> @@ -7826,6 +7842,7 @@ <translation id="8353683614194668312">Энэ нь:</translation> <translation id="8354034204605718473">Таны хүүхдийн ПИН-г нэмсэн байна</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Та энэ төхөөрөмжийг аль хэдийн бүртгүүлсэн. Та үүнийг дахин бүртгүүлэх шаардлагагүй.</translation> <translation id="8357388086258943206">Linux-г суулгахад алдаа гарлаа</translation> <translation id="8358685469073206162">Хуудсуудыг сэргээх үү?</translation> <translation id="8358912028636606457">Энэ төхөөрөмж табын аудио дамжуулахыг дэмждэггүй.</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 783176d..7ebbb67 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1256,6 +1256,7 @@ <translation id="2135787500304447609">&पुन्हा करा</translation> <translation id="2136372518715274136">नवीन पासवर्ड एंटर करा</translation> <translation id="2136476978468204130">एंटर केलेला सांकेतिक पासफ्रेझ चुकीचा आहे</translation> +<translation id="2137128126782078222"><ph name="WEBSITE" /> वरील सूचनांना अनुमती देऊ नका</translation> <translation id="2137891579555018930">परवानगीची प्रतीक्षा करत आहे...</translation> <translation id="2139919072249842737">बटण सेट करा</translation> <translation id="2140788884185208305">बॅटरीची स्थिती</translation> @@ -2496,6 +2497,7 @@ <translation id="3281892622610078515">क्वारंटाइन करण्यासाठी फाइल आणि प्रोग्राम:</translation> <translation id="3282210178675490297"><ph name="APP_NAME" /> वर टॅब शेअर करत आहे</translation> <translation id="3285322247471302225">नवीन &टॅब</translation> +<translation id="3285500645985761267">संबंधित साइटना गटामधील तुमच्या अॅक्टिव्हिटी पाहण्याची अनुमती द्या</translation> <translation id="328571385944182268">तुमचे पासवर्ड सेव्ह करायचे आहेत का?</translation> <translation id="3288047731229977326">डेव्हलपर मोडमध्ये चालणारे विस्तार तुमच्या कॉंप्युटरास हानी पोहचवू शकतात. तुम्ही डेव्हलपर नसल्यास, सुरक्षित राहाण्यासाठी डेव्हलपर मोडमध्ये चालणारे हे विस्तार तुम्ही अक्षम करावे.</translation> <translation id="3289668031376215426">ऑटो-कॅपिटलायझेशन</translation> @@ -2770,6 +2772,7 @@ <translation id="3541823293333232175">असाइन केला</translation> <translation id="3543393733900874979">अपडेट अयशस्वी (एरर: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">SHA-1 सह X9.62 ECDSA स्वाक्षरी</translation> +<translation id="3544058026430919413">गटामध्ये तुमच्या अॅक्टिव्हिटी शेअर करण्यासाठी कुकीज वापरू शकणार्या साइटचा गट कंपनी नमूद करू शकते. हे गुप्त मोड मध्ये बंद आहे.</translation> <translation id="3544879808695557954">वापरकर्ता नाव (पर्यायी)</translation> <translation id="354602065659584722">धोकादायक सॉफ्टवेअर काढले</translation> <translation id="3547954654003013442">प्रॉक्सी सेटिंग्ज</translation> @@ -2909,6 +2912,7 @@ <translation id="3681548574519135185">रिंग फोकस करा</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> स्क्रीन शेअर विनंती</translation> <translation id="3685598397738512288">Linux ची USB प्राधान्ये</translation> +<translation id="3687598459967813435"><ph name="WEBSITE" /> वरील सूचनांना नेहमी अनुमती द्या</translation> <translation id="368789413795732264">ही फाइल राइट करण्याचा प्रयत्न करताना एरर आली:<ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">तुम्ही ॲप्समध्ये उघडता त्या फायलींमध्ये आणि फोल्डरमध्ये लिहा</translation> <translation id="3688526734140524629">चॅनल बदला</translation> @@ -4068,6 +4072,7 @@ <translation id="4779766576531456629">eSIM मोबाइल नेटवर्कचे नाव बदला</translation> <translation id="4780321648949301421">पेज या फॉरमॅटमध्ये सेव्ह करा...</translation> <translation id="4781443161433589743">तुम्ही Chrome ची सर्वात मजबूत सुरक्षा वापरत आहात</translation> +<translation id="4781584184731045253">डेटा आणि परवानग्या साफ करा</translation> <translation id="4782861709165039462">डिव्हाइसच्या हार्डवेअर स्विचद्वारे सर्व मायक्रोफोन बंद केले आहेत</translation> <translation id="4785719467058219317">तुम्ही या वेबसाइटवर नोंदणीकृत नसलेली सिक्युरिटी की वापरत आहात</translation> <translation id="4785914069240823137">क्रॉप रद्द करा</translation> @@ -4749,6 +4754,7 @@ <translation id="5449551289610225147">चुकीचा पासवर्ड</translation> <translation id="5449588825071916739">सर्व टॅब बुकमार्क करा</translation> <translation id="5449716055534515760">विं&डो बंद करा</translation> +<translation id="545133051331995777">कोणतेही नेटवर्क कनेक्शन नाही</translation> <translation id="5452446625764825792">तुम्ही आता तुमच्या फोनमधील अलीकडील फोटो, मीडिया आणि ॲप्स पाहू शकता</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (ऑफलाइन काम करते)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" /> सह</translation> @@ -4792,6 +4798,7 @@ <translation id="5487521232677179737">डेटा साफ करा</translation> <translation id="5488093641312826914">'<ph name="COPIED_ITEM_NAME" />' कॉपी केला</translation> <translation id="5488508217173274228">सिंक एंक्रिप्शन पर्याय</translation> +<translation id="5489077378642700219"><ph name="WEBSITE" /> वरील सूचनांना अनुमती देऊ नका, पण नंतर विचारा</translation> <translation id="5489435190927933437"><ph name="DOMAIN" /> साठी सेव्ह केलेले पासवर्ड</translation> <translation id="5490721031479690399">ब्लूटूथ डिव्हाइस डिस्कनेक्ट करा</translation> <translation id="5490798133083738649">Linux ला तुमचा मायक्रोफोन अॅक्सेस करण्याची परवानगी द्या</translation> @@ -5130,6 +5137,7 @@ <translation id="5805697420284793859">विंडो व्यवस्थापक</translation> <translation id="5806447147478173900">दाखवलेल्या साइटनी वापरलेले एकूण स्टोरेज: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">०° (डीफॉल्ट)</translation> +<translation id="5809835394668218762"><ph name="WEBSITE" /> साठी आणखी कृती</translation> <translation id="5810603387504252966">#borealis-enabled हे chrome://flags मध्ये सुरू करणे आवश्यक आहे</translation> <translation id="5810809306422959727">हे खाते पालक नियंत्रणांसाठी पात्र नाही</translation> <translation id="5811614940486072060">ही फाइल सामान्यतः डाउनलोड केली जात नाही आणि ती धोकादायक असू शकते</translation> @@ -5144,6 +5152,7 @@ <translation id="5826395379250998812">तुमचे <ph name="DEVICE_TYPE" /> तुमच्या फोनसह कनेक्ट करा. <ph name="LINK_BEGIN" />अधिक जाणून घ्या<ph name="LINK_END" /></translation> <translation id="5826993284769733527">अर्धपारदर्शक</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">एकाच गटामध्ये साइट दाखवा</translation> <translation id="5827733057563115968">पुढील शब्दांचा अंदाज</translation> <translation id="5828545842856466741">प्रोफाइल जोडा…</translation> <translation id="5828633471261496623">प्रिंट करत आहे...</translation> @@ -5260,6 +5269,7 @@ <translation id="5927232971138258197">हे एक्स्टेंशन <ph name="HOST" /> रीड करू शकते आणि बदलू शकते</translation> <translation id="592740088639760830">हा कंटेनर थांबवा</translation> <translation id="592880897588170157">पीडीएफ फाइल Chromeमध्ये आपोआप उघडण्यापेक्षा त्या डाउनलोड करा</translation> +<translation id="5928969282301718193">आता सर्व झाले आहे</translation> <translation id="592919310198008711">मी एक्स्टेंशनवर क्लिक करतो/करते तेव्हा</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> नुसार तुम्ही तुमचे <ph name="DEVICE_TYPE" /> त्वरित अपडेट करणे आवश्यक आहे.</translation> <translation id="5932224571077948991">साइट अनाहूत किंवा दिशाभूल करणाऱ्या जाहिराती दाखवते</translation> @@ -5434,6 +5444,7 @@ <translation id="6087746524533454243">ब्राउझरच्या पेजविषयी माहिती शोधत आहात का? भेट द्या</translation> <translation id="6087960857463881712">छान चेहरा</translation> <translation id="608912389580139775">हे पेज तुमच्या वाचन सूचीमध्ये जोडण्यासाठी, बुकमार्क आयकनवर क्लिक करा</translation> +<translation id="6091116443517744502">कृपया तुमचे इंटरनेट कनेक्शन तपासा आणि पुन्हा प्रयत्न करा</translation> <translation id="6091761513005122595">शेअर यशस्वीरीत्या माउंट केले आहे.</translation> <translation id="6093803049406781019">प्रोफाइल हटवा</translation> <translation id="6093888419484831006">अपडेट रद्द करत आहे...</translation> @@ -6098,6 +6109,7 @@ <translation id="6736243959894955139">पत्ता</translation> <translation id="6737393581255281855">प्रदर्शित केलेला डेटा साफ करायचा आहे का?</translation> <translation id="6737663862851963468">Kerberos तिकीट काढा</translation> +<translation id="6738180164164974883">तृतीय पक्ष कुकी सेट करण्याची अनुमती द्या</translation> <translation id="6738430949033571771">खात्याची पडताळणी करत आहे...</translation> <translation id="6739923123728562974">डेस्कटॉप शॉर्टकट दर्शवा</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> ला विराम दिला</translation> @@ -6295,6 +6307,7 @@ <translation id="691106080621596509">हे <ph name="SITE_GROUP_NAME" /> ने स्टोअर केलेला सर्व डेटा आणि कुकी, त्याअंतर्गत येणाऱ्या कोणत्याही साइट आणि तिने इंस्टॉल केलेले अॅप साफ करेल</translation> <translation id="6911734910326569517">मेमरी फुटप्रिंट</translation> <translation id="6912007319859991306">मोबाइल सिम पिन</translation> +<translation id="6912380255120084882">वेगळे डिव्हाइस वापरून पहा</translation> <translation id="691289340230098384">कॅप्शन प्राधान्ये</translation> <translation id="6914783257214138813">एक्सपोर्ट करण्यात आलेली फाइल दिसणार्या प्रत्येकाला, तुमचा पासवर्ड दिसेल.</translation> <translation id="6916590542764765824">विस्तार व्यवस्थापित करा</translation> @@ -6607,6 +6620,7 @@ <translation id="7222204278952406003">तुमचे डीफॉल्ट ब्राउझर Chrome आहे</translation> <translation id="7222232353993864120">ईमेल ॲड्रेस</translation> <translation id="7222235798733126207">साइटदरम्यान मर्यादित शेअरिंग</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{<ph name="FPS_OWNER" /> च्या गटामध्ये एक साइट}other{<ph name="FPS_OWNER" /> च्या गटामध्ये {MEMBERS} साइट}}</translation> <translation id="7225082563376899794">पासवर्ड एंटर करताना Windows Hello वापरा</translation> <translation id="7225179976675429563">नेटवर्क प्रकार गहाळ</translation> <translation id="7227458944009118910">खाली सूचीबद्ध केलेली ॲप्स ही प्रोटोकॉल लिंकदेखील हाताळू शकतात. इतर ॲप्स परवानगीची विनंती करतील.</translation> @@ -7120,6 +7134,7 @@ <translation id="7709152031285164251">अयशस्वी - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">कास्ट करा...</translation> <translation id="7711900714716399411">तुमचा फोन तुमच्या कॉंप्युटरशी कनेक्ट करण्यासाठी USB केबल वापरा. तुमचा फोन आधीपासून कनेक्ट केलेला असल्यास, तो अनप्लग करा आणि तो पुन्हा प्लग इन करा.</translation> +<translation id="7711968363685835633">पर्सनलाइझ केलेली रूपांतरणे आणि सूचना, तसेच वापरकर्ता शब्दकोश बंद करा</translation> <translation id="7712739869553853093">प्रिंट पूर्वावलोकन डायलॉग</translation> <translation id="7714307061282548371"><ph name="DOMAIN" /> वरील कुकीजना अनुमती आहे</translation> <translation id="7714464543167945231">सर्टिफिकेट</translation> @@ -7192,6 +7207,7 @@ <translation id="7768770796815395237">बदला</translation> <translation id="7768784765476638775">बोलण्यासाठी निवडा</translation> <translation id="7769748505895274502">अलीकडे बंद केलेले हे कोलॅप्स करा</translation> +<translation id="7770072242481632881">साइड पॅनल सिलेक्टर</translation> <translation id="7770406201819593386">ChromeOS Flex शी संबंधित निदान चाचण्या रन करा.</translation> <translation id="7770450735129978837">माउसचे उजवे क्लिक</translation> <translation id="7770612696274572992">दुसर्या डिव्हाइसवरून कॉपी केलेली इमेज</translation> @@ -7826,6 +7842,7 @@ <translation id="8353683614194668312">ते करू शकते:</translation> <translation id="8354034204605718473">तुमच्या लहान मुलाचा पिन जोडण्यात आला आहे</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">तुम्ही आधीच या डिव्हाइसची नोंदणी केली आहे. तुम्हाला याची पुन्हा नोंदणी करण्याची आवश्यकता नाही.</translation> <translation id="8357388086258943206">Linux इंस्टॉल करताना एरर आली</translation> <translation id="8358685469073206162">पेज पुनर्संचयित करायची?</translation> <translation id="8358912028636606457">या डिव्हाइसवर कास्टिंग टॅब ऑडिओला सपोर्ट नाही.</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 784690b..90f93cd 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">ပြုလုပ်ပြီးပါပြီ</translation> <translation id="1067661089446014701">လုံခြုံရေးပိုမိုကောင်းမွန်စေရန် သင့်စကားဝှက်များကို Google Account တွင် မသိမ်းမီ သင့်စက်၌ အသွင်ဝှက်နိုင်သည်</translation> <translation id="1067922213147265141">အခြား Google ဝန်ဆောင်မှုများ</translation> +<translation id="1069104208554708737">လျှို့ဝှက်ကီးကို ဤစက်တွင်သာ သိမ်းပါမည်</translation> <translation id="1069355737714877171"><ph name="PROFILE_NAME" /> ဟု အမည်ပေးထားသော eSIM ပရိုဖိုင်ကို ဖယ်ရှားရန်</translation> <translation id="1069814191880976658">အခြားဖန်သားပြင်တစ်ခု ရွေးရန်</translation> <translation id="1070377999570795893">သင့်ကွန်ပျူတာသို့ Chrome အလုပ်လုပ်ပုံပြောင်းလဲစေမည့် ပရိုဂရမ်အဆက်တစ်ခုကို အခြားပရိုဂရမ်တစ်ခုမှ ပေါင်းတည့်ခဲ့ပါသည်။ @@ -349,6 +350,7 @@ <translation id="1324106254079708331">ပစ်မှတ်ထား တိုက်ခိုက်မှုကို ခံနေရသူများ၏ ကိုယ်ပိုင်သုံး Google အကောင့်များကို ကာကွယ်ပေးသည်</translation> <translation id="1327272175893960498">Kerberos လက်မှတ်များ</translation> <translation id="1327495825214193325">ADB အမှားရှာပြင်ခြင်းကို ဖွင့်ရန် ဤ <ph name="DEVICE_TYPE" /> ကို ပြန်လည်စတင်ရပါမည်။ ၎င်းကို ပိတ်ခြင်းက စက်ရုံထုတ်ဆက်တင်များသို့ ပြင်ဆင်သတ်မှတ်ရန် လိုအပ်သည်။</translation> +<translation id="1327527584824210101">သင့်လျှို့ဝှက်ကီးသုံးခြင်း</translation> <translation id="1327794256477341646">သင့်တည်နေရာ လိုအပ်သည့် ဝန်ဆောင်မှုများ အလုပ်လုပ်မည်မဟုတ်ပါ</translation> <translation id="1331977651797684645">၎င်းသည် ကျွန်ုပ်ဖြစ်ပါသည်။</translation> <translation id="1333489022424033687">သင့်စက်ပေါ်တွင် အခြားဝဘ်ဆိုက်များက သိမ်းဆည်းထားသည့် ဒေတာများကို မဖျက်မချင်း <ph name="ORIGIN" /> ရှိ ဝန်ဆောင်မှုအချို့ကို အသုံးပြုနိုင်မည် မဟုတ်ပါ</translation> @@ -409,6 +411,7 @@ <translation id="139013308650923562">သင့်ကိရိယာတွင်ထည့်သွင်းထားသော ဖောင့်များသုံးရန် ခွင့်ပြုထားသည်</translation> <translation id="1390548061267426325">ပုံမှန် တပ်ဖ် အနေဖြင့် ဖွင့်မည်</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> ကို <ph name="PRINTER_NAME" /> တွင် ပုံနှိပ်ထုတ်ရန် ခွင့်ပြုမထားပါ။ သင့်စီမံခန့်ခွဲသူထံ ဆက်သွယ်ပါ။</translation> +<translation id="1392047138650695757">အသုံးပြုသူ အဘိဓါန်များ</translation> <translation id="1393283411312835250">နေနှင့် မိုးတိမ်</translation> <translation id="1395730723686586365">မွမ်းမံရေး လုပ်ကိုင်မှု စတင်ပြီ</translation> <translation id="1395832189806039783">ကီးဘုတ်ခလုတ်ဖြင့် အကြောင်းအရာကို မြင်သာအောင်လုပ်ပေးသည်</translation> @@ -1252,6 +1255,7 @@ <translation id="2135787500304447609">ပြန်လည် ရှေ့ဆက်မည်</translation> <translation id="2136372518715274136">စကားဝှက်အသစ် ထည့်ပါ</translation> <translation id="2136476978468204130">သင်ထည့်သွင်းထားသည့် လျှို့ဝှက်စကားစုသည် မမှန်ကန်ပါ</translation> +<translation id="2137128126782078222"><ph name="WEBSITE" /> ထံမှ အကြောင်းကြားချက်များ ခွင့်မပြုရန်</translation> <translation id="2137891579555018930">ခွင့်ပြုချက်ကို စောင့်နေသည်...</translation> <translation id="2139919072249842737">စနစ်ထည့်သွင်းရန် ခလုတ်</translation> <translation id="2140788884185208305">ဘက်ထရီအခြေအနေ</translation> @@ -1528,6 +1532,7 @@ <translation id="2356070529366658676">မေး</translation> <translation id="2357330829548294574"><ph name="USER_NAME" /> ကို ဖယ်ရှားရန်</translation> <translation id="2358561147588818967">ဝဘ်ဆိုက်များက Javascript ကို သုံးနိုင်သည်</translation> +<translation id="2358703245148663432">အခြားစက်</translation> <translation id="2358777858338503863"><ph name="ORIGIN" /> တွင်ခွင့်ပြုရန် နှိပ်ပါ-</translation> <translation id="2359071692152028734">Linux အက်ပ်များ တုံ့ပြန်မှုရပ်သွားနိုင်သည်။</translation> <translation id="2359345697448000899">Tools မီနျူးတွင်ရှိ အိတ်စတန်းရှင်းများကို နှိပ်ခြင်းဖြင့် သင့်အိတ်စတန်းရှင်းများကို စီမံပါ။</translation> @@ -1888,6 +1893,7 @@ <translation id="271033894570825754">အသစသ်</translation> <translation id="2711073837061989559">အစမ်းသုံးခြင်းများ</translation> <translation id="2712173769900027643">ခွင့်ပြုချက်တောင်းခံပါ</translation> +<translation id="2712207122921938368">အခြားစက်တွင် လျှို့ဝှက်ကီး ပြုလုပ်ခြင်း</translation> <translation id="2713106313042589954">ကင်မရာပိတ်ရန်</translation> <translation id="2713444072780614174">အဖြူ</translation> <translation id="2714393097308983682">Google Play စတိုး</translation> @@ -2400,6 +2406,7 @@ <translation id="3182749001423093222">စာလုံးပေါင်းသတ်ပုံစစ်ခြင်း</translation> <translation id="3183139917765991655">Profile Importer</translation> <translation id="3183143381919926261">မိုဘိုင်းဒေတာ ကွန်ရက်များ</translation> +<translation id="3183613134231754987">လျှို့ဝှက်ကီးကို Windows Hello တွင်သာ သိမ်းပါမည်။ ‘ရုပ်ဖျက်ဝင်ဒိုး’ အားလုံးပိတ်ပြီးသောအခါ ၎င်းက ဤစက်တွင် ကျန်ရှိနေမည်။</translation> <translation id="3183944777708523606">မော်နီတာ အစီအစဉ်</translation> <translation id="3184536091884214176">CUPS ပုံနှိပ်စက်များကို စနစ်ထည့်သွင်းပါ သို့မဟုတ် စီမံပါ။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{ဤအက်ပ်ကို ပိတ်ထားသည်}other{အက်ပ်အချို့ကို ပိတ်ထားသည်}}</translation> @@ -2490,6 +2497,7 @@ <translation id="3281892622610078515">သီးသန့်ထားရှိရန် ဖိုင်နှင့် ပရိုဂရမ်များ-</translation> <translation id="3282210178675490297">တဘ်ကို <ph name="APP_NAME" /> သို့ မျှဝေနေသည်</translation> <translation id="3285322247471302225">တဘ် & အသစ်</translation> +<translation id="3285500645985761267">အုပ်စုတွင်း သင့်လှုပ်ရှားမှုကို ကြည့်ရန်အတွက် ဆက်စပ်ဝဘ်ဆိုက်များ ခွင့်ပြုရန်</translation> <translation id="328571385944182268">သင့်စကားဝှက်များ သိမ်းမလား။</translation> <translation id="3288047731229977326">ဖွံ့ဖြိုးစေသူမုဒ်တွင် ဖွင့်ထားသည့် အိတ်စတန်းရှင်းသည် သင့်ကွန်ပျူတာကို ထိခိုက်စေနိုင်သည်။ အကယ်၍ သင်သည် ဖွံ့ဖြိုးစေသူမဟုတ်လျှင်၊ လုံခြုံမှုရှိစေရန် ဖွံ့ဖြိုးစေသူမုဒ်၌ ဖွင့်ထားသည့် ဤအိတ်စတန်းရှင်းများကို ပိတ်ထားသင့်သည်။</translation> <translation id="3289668031376215426">အလိုအလျောက် စာလုံးကြီးပြောင်းရန်</translation> @@ -2764,6 +2772,7 @@ <translation id="3541823293333232175">သတ်မှတ်ထားသည်</translation> <translation id="3543393733900874979">အဆင့်မြှင့်ခြင်း မအောင်မြင်ပါ (မှားယွင်းမှု: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">SHA-512 ဖြင့် X9.62 ECDSA လက်မှတ်</translation> +<translation id="3544058026430919413">အုပ်စုတွင်း သင့်လှုပ်ရှားမှုအား မျှဝေရန် ကွတ်ကီးသုံးနိုင်သည့် ဝဘ်ဆိုက်အုပ်စုကို ကုမ္ပဏီက သတ်မှတ်နိုင်သည်။ ၎င်းသည် ရုပ်ဖျက်တွင် ပိတ်နေမည်။</translation> <translation id="3544879808695557954">အသုံးပြုသူအမည် (ချန်လှပ်ထားနိုင်သည်)</translation> <translation id="354602065659584722">အန္တရာယ်ဖြစ်စေနိုင်သော ဆော့ဖ်ဝဲများကို ဖယ်ရှားလိုက်ပါပြီ</translation> <translation id="3547954654003013442">ပရောက်စီ ဆက်တင်များ</translation> @@ -2879,6 +2888,7 @@ <translation id="3654045516529121250">သင်၏ ရယူသုံးရေး ဆက်တင်များကို ဖတ်ကြည့်ရန်</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{၎င်းသည် ဖိုင်တစ်ဖိုင်အား အမြဲဝင်ရောက်သုံးခွင့်ရှိ၏။}other{၎င်းသည် ဖိုင် # ဖိုင်အား အမြဲဝင်ရောက်သုံးခွင့်ရှိ၏။}}</translation> <translation id="3658871634334445293">TrackPoint အရှိန်မြှင့်တင်မှု</translation> +<translation id="3659550105763988702"><ph name="APP_NAME" /> အတွက် သင့်လျှို့ဝှက်ကီးသုံးခြင်း</translation> <translation id="3659929705630080526">သင်သည် မမှန်ကန်သော ဝင်ခွင့်ကုဒ်ကို ကြိမ်ဖန်များစွာ ရိုက်ထည့်ထားပါသည်။ နောက်မှ ထပ်စမ်းကြည့်ပါ</translation> <translation id="3660234220361471169">မယုံကြည်ရသော</translation> <translation id="3664511988987167893">နောက်ဆက်တွဲ သင်္ကေတ</translation> @@ -2902,6 +2912,7 @@ <translation id="3681548574519135185">မြင်သာစေသည့် အကွင်း</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> မျက်နှာပြင် မျှဝေရန် တောင်းဆိုချက်</translation> <translation id="3685598397738512288">Linux USB သတ်မှတ်ချက်များ</translation> +<translation id="3687598459967813435"><ph name="WEBSITE" /> ထံမှ အကြောင်းကြားချက်များကို အမြဲခွင့်ပြုရန်</translation> <translation id="368789413795732264">ဒီဖိုင်ကို ရေးရန် ကြိုးစားစဉ် အမှား တစ်ခု ကြုံခဲ့ရ: <ph name="ERROR_TEXT" />။</translation> <translation id="3688507211863392146">သင်က အပလီကေးရှင်း ထဲမှာ ဖွင့်ခဲ့သည်ကို ဖိုင်များ နှင့် ဖိုလ်ဒါများသို့ ရေးရန်</translation> <translation id="3688526734140524629">ချာနယ် ပြောင်းရန်</translation> @@ -3152,6 +3163,7 @@ <translation id="3898327728850887246"><ph name="SITE_NAME" /> က အောက်ပါတို့ကို ပြုလုပ်လိုသည်- <ph name="FIRST_PERMISSION" /> နှင့် <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">ကီးဘုတ်ကို ရွေးပါ</translation> <translation id="3900966090527141178">စကားဝှက်များကို တင်ပို့ရန်</translation> +<translation id="3902789559055749153"><ph name="APP_NAME" /> အတွက် လျှို့ဝှက်ကီးပြုလုပ်ရန် နည်းလမ်းရွေးပါ</translation> <translation id="3903187154317825986">အသင့်ပါ ကီးဘုတ်</translation> <translation id="3904326018476041253">တည်နေရာဝန်ဆောင်မှုများ</translation> <translation id="3904849010307028014">အကောင့်တွင် ပုံမှန်လက်မှတ်ထိုးဝင်ခြင်းကဲ့သို့ ဝဘ်ဆိုက်နှင့် သင်၏ပြန်လှန်တုံ့ပြန်မှုပေါ် အခြေခံ၍ အဆိုပါဝဘ်ဆိုက်က သင့်ဘရောင်ဇာကို ယုံကြည်မှုတိုကင် ထုတ်ပေးနိုင်သည်။ နောက်ပိုင်းတွင် သင်ဝင်ကြည့်သော အခြားဝဘ်ဆိုက်များက ယုံကြည်မှုတိုကင်ကို စစ်ဆေးပြီး မှန်ကန်ကြောင်းတွေ့ရှိပါက သင့်အား ဘော့တ်အဖြစ်မဟုတ်ဘဲ လူပုဂ္ဂိုလ်အနေနှင့် ဆက်ဆံနိုင်ခြေရှိသည်။</translation> @@ -3480,6 +3492,7 @@ <translation id="4218081191298393750">ဤတဘ်ကိုအသံပိတ်ရန် စပီကာသင်္ကေတကို နှိပ်နိုင်သည်</translation> <translation id="4219558185499589032">Box</translation> <translation id="4220648711404560261">စတင်နေစဉ်အတွင်း အမှားဖြစ်သွားသည်။</translation> +<translation id="4223845867739585293">လျှို့ဝှက်ကီး ပြုလုပ်ခြင်း</translation> <translation id="4225397296022057997">ဝဘ်ဆိုက်များ အားလုံးတွင်</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{ဤနောက်ဆက်တွဲကို ခွင့်မပြုပါ}other{နောက်ဆက်တွဲအချို့ကို ခွင့်မပြုပါ}}</translation> <translation id="4231095370974836764">သင်၏ <ph name="DEVICE_TYPE" /> တွင် Google Play မှ အက်ပ်နှင့် ဂိမ်းများ ထည့်သွင်းပါ။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> @@ -4061,6 +4074,7 @@ <translation id="4779766576531456629">eSIM ဆယ်လူလာကွန်ရက် အမည်ပြောင်းရန်</translation> <translation id="4780321648949301421">စာမျက်နှာကို...အဖြစ် သိမ်းရန်</translation> <translation id="4781443161433589743">သင်သည် Chrome ၏ အခိုင်မာဆုံးလုံခြုံရေးကို ရယူထားသည်</translation> +<translation id="4781584184731045253">ဒေတာနှင့် ခွင့်ပြုချက်များ ရှင်းလင်းရန်</translation> <translation id="4782861709165039462">မိုက်ခရိုဖုန်းအားလုံးကို စက်များ၏ ဟာ့ဒ်ဝဲခလုတ်က ပိတ်ထားသည်</translation> <translation id="4785719467058219317">သင်သည် ဤဝဘ်ဆိုက်တွင် မှတ်ပုံတင်မထားသော လုံခြုံရေးကီးတစ်ခုကို အသုံးပြုနေသည်</translation> <translation id="4785914069240823137">ဖြတ်ညှိမှု မလုပ်တော့ရန်</translation> @@ -4122,6 +4136,7 @@ <translation id="4838907349371614303">စကားဝှက် အပ်ဒိတ်လုပ်ပြီးပြီ</translation> <translation id="4838958829619609362">ရွေးချယ်ထားသည်မှာ <ph name="LANGUAGE" /> မဟုတ်ပါ</translation> <translation id="4839303808932127586">ဗီဒီယိုအား သိမ်းမည်...</translation> +<translation id="4839910546484524995">သင့်စက်ကို ကြည့်ပါ</translation> <translation id="4840096453115567876">မည်သို့ပင်ဖြစ်စေ ရုပ်ဖျက်မုဒ်မှ ထွက်လိုပါသလား။</translation> <translation id="4841741146571978176">သတ်မှတ်ထားသော ပကတိအသွင်စက် မရှိပါ။ ရှေ့ဆက်ရန် <ph name="VM_TYPE" /> ကို စနစ်ထည့်သွင်းကြည့်ပါ</translation> <translation id="4842976633412754305">ဤစာမျက်နှာသည် အထောက်အထားမခိုင်လုံသော အရင်းအမြစ်များမှ စခရစ်များ ရယူရန် ကြိုးစားနေသည်။</translation> @@ -4741,6 +4756,7 @@ <translation id="5449551289610225147">စကားဝှက် မမှန်ကန်ပါ</translation> <translation id="5449588825071916739">တဲဘ်များ အားလုံးကို စာညှပ် ထည့်ပေးရန်</translation> <translation id="5449716055534515760">Win&dowကို ပိတ်ပါ</translation> +<translation id="545133051331995777">ကွန်ရက်ချိတ်ဆက်မှု မရှိပါ</translation> <translation id="5452446625764825792">သင့်ဖုန်း၏ လတ်တလောဓာတ်ပုံ၊ မီဒီယာနှင့် အက်ပ်များကို ယခု ကြည့်နိုင်ပြီ</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (အော့ဖ်လိုင်း သုံးနိုင်သည်)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" /> ဖြင့်</translation> @@ -4784,6 +4800,7 @@ <translation id="5487521232677179737">ဒေတာများကို ရှင်းလင်းပါ</translation> <translation id="5488093641312826914">'<ph name="COPIED_ITEM_NAME" />' ကို မိတ္ထူကူးယူထားသည်</translation> <translation id="5488508217173274228">အသွင်ဝှက်ရန် ရွေးစရာများကို စင့်ခ်လုပ်ရန်</translation> +<translation id="5489077378642700219"><ph name="WEBSITE" /> ထံမှ အကြောင်းကြားချက်များကို ခွင့်မပြုသော်လည်း နောက်မှ ထပ်မေးရန်</translation> <translation id="5489435190927933437"><ph name="DOMAIN" /> အတွက် သိမ်းထားသည့် စကားဝှက်များ</translation> <translation id="5490721031479690399">ဘလူးတုသ်စက် ချိတ်ဆက်မှုဖြုတ်ရန်</translation> <translation id="5490798133083738649">သင်၏မိုက်ကရိုဖုန်း အသုံးပြုရန် Linux ကို ခွင့်ပြုခြင်း</translation> @@ -5040,6 +5057,7 @@ <translation id="5729712731028706266">&မြင်ကွင်း</translation> <translation id="5731247495086897348">ကူး&ဖြည့် ပြီး သွားရန်</translation> <translation id="5732392974455271431">သင့်မိဘများသည် ၎င်းကို သင့်အတွက် ဖွင့်ပေးနိုင်ပါသည်</translation> +<translation id="5733109311583381874">သင့်လျော်သည့် ရလဒ်ကောင်းများကို စိတ်ကြိုက်ပြင်ဆင်ရန်အတွက် အသုံးပြုသူအဘိဓာန်များသို့ ကိုယ်ပိုင်စကားလုံးထည့်ရန်။</translation> <translation id="5733866499231170760">ID မမှန်ကန်ပါ။ သင်ထည့်သွင်းလိုက်သည့် ဖော်မက် မမှန်ကန်ပါ။ ထည့်သွင်းသည့် ID ပုံစံမှန်ကန်စေရန် သင်ရရှိထားသော ညွှန်ကြားချက်များကို စစ်ကြည့်ပါ။ ဤပြဿနာကို မဖြေရှင်းနိုင်ပါက အကွက်ကို အလွတ်ထားပြီး ဆက်လက်ထည့်သွင်းပါ။</translation> <translation id="5734362860645681824">ဆက်သွယ်မှုများ</translation> <translation id="5734697361979786483">ဖိုင်မျှဝေမှုကို ထည့်ရန်</translation> @@ -5122,6 +5140,7 @@ <translation id="5805697420284793859">ဝင်းဒိုး မန်နေဂျာ</translation> <translation id="5806447147478173900">ပြထားသည့် ဝဘ်ဆိုက်များက အသုံးပြုထားသည့် စုစုပေါင်းသိုလှောင်ခန်း- <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">၀° (မူရင်း)</translation> +<translation id="5809835394668218762"><ph name="WEBSITE" /> အတွက် နောက်ထပ်လုပ်ဆောင်ချက်များ</translation> <translation id="5810603387504252966">#borealis-enabled ကို chrome://flags တွင် ဖွင့်ထားရမည်</translation> <translation id="5810809306422959727">ဤအကောင့်တွင် မိဘ အထိန်းအချုပ်များကို အသုံးပြု၍မရပါ</translation> <translation id="5811614940486072060">ဤဖိုင်ကို အများအားဖြင့် ဒေါင်းလုဒ်လုပ်လေ့ မရှိပါ။ အန္တရာယ်ရှိနိုင်ပါသည်</translation> @@ -5136,6 +5155,7 @@ <translation id="5826395379250998812">သင်၏ <ph name="DEVICE_TYPE" /> ကို သင့်ဖုန်းနှင့် ချိတ်ဆက်ပါ။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="5826993284769733527">တစ်စိတ်တစ်ပိုင်း ထွင်းဖောက်မြင်ရသည်</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">ဝဘ်ဆိုက်များကို အုပ်စုတူတွင် ပြရန်</translation> <translation id="5827733057563115968">လာမည့်စကားလုံး ခန့်မှန်းချက်</translation> <translation id="5828545842856466741">ပရိုဖိုင် ထည့်ရန်...</translation> <translation id="5828633471261496623">ပရင့် ထုတ်နေသည်...</translation> @@ -5149,6 +5169,7 @@ <translation id="583431638776747">ဝဘ်ဆိုက်ကို အသုံးပြု၍မရပါ</translation> <translation id="5834581999798853053"><ph name="TIME" /> မိနစ်ခန့် ကျန်</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> - ကင်မရာ သို့မဟုတ် မိုက်ခရိုဖုန်း ဖမ်းယူရိုက်ကူးခြင်း</translation> +<translation id="5835625581856809102"><ph name="APP_NAME" /> အတွက် လျှို့ဝှက်ကီး ပြုလုပ်လိုသည့် စက်ဖြင့် ဤ QR ကုဒ်ကို စကင်ဖတ်ပါ</translation> <translation id="583673505367439042">သင့်စက်ပေါ်ရှိ ဖိုင်နှင့် ဖိုင်တွဲများ တည်းဖြတ်လိုပါက ဝဘ်ဆိုက်များက ခွင့်တောင်းနိုင်သည်</translation> <translation id="5836999627049108525">ဖော်ပြပါဘာသာစကားမှ ဘာသာပြန်ဆိုရန်</translation> <translation id="583756221537636748">ဘူး</translation> @@ -5249,6 +5270,7 @@ <translation id="5927232971138258197">ဤနောက်ဆက်တွဲက <ph name="HOST" /> ကို ဖတ်ပြီးပြောင်းနိုင်သည်</translation> <translation id="592740088639760830">ဤကွန်တိန်နာကို ရပ်ရန်</translation> <translation id="592880897588170157">PDF ဖိုင်များကို Chrome တွင် အလိုအလျောက် ဖွင့်မည့်အစား ဒေါင်းလုဒ်လုပ်လိုက်ပါ</translation> +<translation id="5928969282301718193">လောလောဆယ် အားလုံးပြီးပြီ</translation> <translation id="592919310198008711">နောက်ဆက်တွဲကို နှိပ်သောအခါ</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> ကသင်၏ <ph name="DEVICE_TYPE" /> ကို ချက်ချင်း အပ်ဒိတ်လုပ်စေလိုသည်။</translation> <translation id="5932224571077948991">ဝဘ်ဆိုက်က စိတ်အနှောင့်အယှက်ဖြစ်စေသော (သို့) အထင်အမြင်မှားစေသော ကြော်ငြာများကို ပြသည်</translation> @@ -5386,6 +5408,7 @@ <translation id="6059276912018042191">လတ်တလော Chrome တဘ်များ</translation> <translation id="6059652578941944813">လက်မှတ် အဆင့်ဆင့်</translation> <translation id="6059925163896151826">USB စက်ပစ္စည်းများ</translation> +<translation id="6061408389284235459"><ph name="DEVICE_NAME" /> သို့ အကြောင်းကြားချက် ပို့ထားသည်</translation> <translation id="6063284707309177505">QR ကုဒ် ပြုလုပ်ရန်</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />မှတ်ချက်-<ph name="END_BOLD" /> ဆင်တူသောအသံ (သို့) အသံသွင်းချက်ဖြင့် <ph name="SUPERVISED_USER_NAME" /> ၏ ကိုယ်ရေးကိုယ်တာ ရလဒ်များသို့ ဝင်ခွင့်ရသွားနိုင်ပါသည်။ ဘက်ထရီချွေတာရန် ဤစက်ကို ပါဝါနှင့် ချိတ်ဆက်ထားသည့်အခါတွင်သာ “Ok Google” ကို ဖွင့်ရန်<ph name="SUPERVISED_USER_NAME" /> ၏ Assistant ဆက်တင်များတွင် ရွေးနိုင်သည်။</translation> <translation id="6064217302520318294">ဖန်သားပြင်လော့ခ်</translation> @@ -5422,6 +5445,7 @@ <translation id="6087746524533454243">စာမျက်နှာအကြောင်း ဘရောင်ဇာကို ရှာနေပါသလား။ ဝင်ကြည့်ရန်</translation> <translation id="6087960857463881712">ပြုံးရွှင်သည့် မျက်နှာ</translation> <translation id="608912389580139775">သင်၏ဖတ်ရန် စာရင်းတွင် ဤစာမျက်နှာကို ထည့်ရန် ‘လိပ်စာ’ သင်္ကေတကို နှိပ်ပါ</translation> +<translation id="6091116443517744502">သင့်အင်တာနက်ချိတ်ဆက်မှုကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ</translation> <translation id="6091761513005122595">မျှဝေပြီးပါပြီ။</translation> <translation id="6093803049406781019">ပရိုဖိုင်ကို ဖျက်ရန်</translation> <translation id="6093888419484831006">မွှမ်းမံခြင်းကို ပယ်ဖျက်နေပါသည်၊</translation> @@ -5513,6 +5537,7 @@ <translation id="6178664161104547336">လက်မှတ်တစ်ခု ရွေးရန်</translation> <translation id="6178682841350631965">သင့်လက်မှတ်ထိုးဝင်ခြင်းဆိုင်ရာ ဒေတာကို အပ်ဒိတ်လုပ်ထားသည်</translation> <translation id="6180510783007738939">မျဉ်းဆွဲ တူးလ်</translation> +<translation id="6180550893222597997"><ph name="APP_NAME" /> အတွက် မည်သည့်လျှို့ဝှက်ကီးကို သုံးလိုပါသလဲ။</translation> <translation id="6181431612547969857">ဒေါင်းလုဒ် ပိတ်ဆို့ထား</translation> <translation id="6184099524311454384">တဘ်များတွင် ရှာရန်</translation> <translation id="6185132558746749656">စက်ကိရိယာ တည်နေရာ</translation> @@ -5947,6 +5972,7 @@ <translation id="6596816719288285829">IP လိပ်စာ</translation> <translation id="6597017209724497268">နမူနာများ</translation> <translation id="6597331566371766302">အောက်ပါနောက်ဆက်တွဲများကို သင့်စီမံသူက ပိတ်ထားသည်-</translation> +<translation id="6601262427770154296">အသုံးပြုသူအဘိဓာန်များ စီမံရန်</translation> <translation id="6601612474695404578">အချို့ဝဘ်ဆိုက်များက ၎င်းတို့၏စာမျက်နှာများ ဖွင့်ရန် ပြင်ပအဖွဲ့အစည်း၏ ကွတ်ကီးများကို အသုံးပြုသည်။ ဝဘ်ဆိုက်တစ်ခု အလုပ်မလုပ်ပါက ကွတ်ကီးများကို ခွင့်ပြုကြည့်နိုင်ပါသည်။</translation> <translation id="6602937173026466876">သင့်ပုံနှိပ်စက်များကို အသုံးပြုရန်</translation> <translation id="6602956230557165253">သွားလာရန် ဘယ်ညာ မြားများကို အသုံးပြုပါ။</translation> @@ -6083,6 +6109,7 @@ <translation id="6736243959894955139">လိပ်စာ</translation> <translation id="6737393581255281855">ပြထားသည့်ဒေတာကို ရှင်းမလား။</translation> <translation id="6737663862851963468">Kerberos လက်မှတ် ဖယ်ရှားရန်</translation> +<translation id="6738180164164974883">ပြင်ပကုမ္ပဏီကွတ်ကီးများကို ခွင့်ပြုရန်</translation> <translation id="6738430949033571771">အကောင့် အတည်ပြုနေသည်...</translation> <translation id="6739923123728562974">ဒက်စ်တော့ ဖြတ်လမ်းလင့်ခ်ကို ပြရန်</translation> <translation id="6740234557573873150">ဆိုင်းငံ့ထား<ph name="FILE_NAME" /></translation> @@ -6280,6 +6307,7 @@ <translation id="691106080621596509">ဤလုပ်ဆောင်ချက်က <ph name="SITE_GROUP_NAME" />၊ ၎င်းအောက်ရှိ ဝဘ်ဆိုက်မှန်သမျှနှင့် ၎င်းထည့်သွင်းထားသော အက်ပ်များ သိမ်းထားသည့် ဒေတာနှင့် ကွတ်ကီးအားလုံးကို ရှင်းထုတ်ပါမည်</translation> <translation id="6911734910326569517">ဖြစ်စဉ်တွင် မှတ်ဉာဏ်အသုံးပြုမှု</translation> <translation id="6912007319859991306">ဆယ်လူလာဆင်းမ် ပင်နံပါတ်</translation> +<translation id="6912380255120084882">အခြားစက်နှင့် စမ်းကြည့်ပါ</translation> <translation id="691289340230098384">စာတန်း သတ်မှတ်ချက်များ</translation> <translation id="6914783257214138813">တင်ပို့လိုက်သည့်ဖိုင်ကို မြင်နိုင်သူအားလုံးသည် သင်၏ စကားဝှက်များကို မြင်နိုင်ပါမည်။</translation> <translation id="6916590542764765824">Manage Extensions</translation> @@ -6310,6 +6338,7 @@ <translation id="6943060957016121200">'အလိုအလျောက် ချိတ်ဆက်မျှဝေခြင်း' ဖွင့်ရန်</translation> <translation id="6943176775188458830">ပုံနှိပ်ခြင်းကို ဖယ်ဖျက်ရန်</translation> <translation id="6943939122536910181"><ph name="DEVICE" /> မှ ချိတ်ဆက်မှုဖြုတ်လိုက်သည်</translation> +<translation id="6944708469742828051">ဤလျှို့ဝှက်ကီးကို Windows Hello တွင်သာ သိမ်းပါမည်</translation> <translation id="6945221475159498467">ရွေးရန်</translation> <translation id="694592694773692225">ဤစာမျက်နှာတွင် တဆင့်ပြန်ညွှန်ခြင်းကို ပိတ်ထားသည်။</translation> <translation id="6947015141909171112">သင်၏လတ်တလော ချက်ပြုတ်နည်း ‘ရှာဖွေရေးလုပ်ဆောင်ချက်’ ပေါ်မူတည်၍ ၎င်းတို့ကို မြင်ရခြင်းဖြစ်သည်။ @@ -6562,6 +6591,7 @@ <translation id="7193051357671784796">ဤအက်ပ်ကို သင့်အဖွဲ့အစည်းက ထည့်ထားပါသည်။ အက်ပ်စနစ်ထည့်သွင်းမှု အပြီးသတ်ရန် ၎င်းကိုပြန်စတင်ပါ။</translation> <translation id="7193374945610105795"><ph name="ORIGIN" /> အတွက် မည်သည့်စကားဝှက်မျှ သိမ်းမထားပါ</translation> <translation id="7194873994243265344">ဤဖိုင်ကို အသွင်ဝှက်ထား၍ သင့်အဖွဲ့အစည်းက ပိတ်ထားသည်။ ၎င်း၏ပိုင်ရှင်ကို ကုဒ်ဖြည်ခိုင်းပါ။</translation> +<translation id="7196272782924897510">အခြားစက်မှ လျှို့ဝှက်ကီး သုံးမလား။</translation> <translation id="7196913789568937443">Google Drive သို့ အရန်သိမ်းပါ။ သင့်ဒေတာများကို ပြန်ယူခြင်း (သို့) စက်ပစ္စည်းပြောင်းခြင်းတို့ အချိန်မရွေး လွယ်ကူစွာပြုလုပ်နိုင်သည်။ သင့်အရန်တွင် အက်ပ်ဒေတာများ ပါဝင်သည်။ သင်၏ Google အကောင့်စကားဝှက် အသုံးပြု၍ ၎င်းတို့ကို Google သို့ အပ်လုဒ်လုပ်ပြီး အသွင်ဝှက်ထားပါသည်။<ph name="BEGIN_LINK1" />ပိုမိုလေ့လာရန်<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">သင်အသုံးပြုသည့်အခါတိုင်း Google Search Google smarts တို့ကို ရယူပါ</translation> <translation id="719791532916917144">လက်ကွက်ဖြတ်လမ်းများ</translation> @@ -6590,6 +6620,7 @@ <translation id="7222204278952406003">Chrome သည် သင်၏ မူရင်းဘရောင်ဇာဖြစ်သည်</translation> <translation id="7222232353993864120">အီးမေးလ် လိပ်စာ</translation> <translation id="7222235798733126207">ဝဘ်ဆိုက်များကြား မျှဝေမှုကန့်သတ်ထားခြင်း</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{<ph name="FPS_OWNER" /> ၏ အုပ်စုရှိ ဝဘ်ဆိုက် ၁ ခု}other{<ph name="FPS_OWNER" /> ၏ အုပ်စုရှိ ဝဘ်ဆိုက် {MEMBERS} ခု}}</translation> <translation id="7225082563376899794">စကားဝှက်များထည့်စဉ် Windows Hello သုံးရန်</translation> <translation id="7225179976675429563">ကွန်ရက် ပုံစံ ပျောက်နေ</translation> <translation id="7227458944009118910">အောက်တွင်ပြထားသော အက်ပ်များသည်လည်း ပရိုတိုကောလင့်ခ်များကို စီမံနိုင်သည်။ အခြားအက်ပ်များက ခွင့်ပြုချက် တောင်းပါမည်။</translation> @@ -7059,6 +7090,7 @@ <translation id="7670483791111801022">စာတန်းထိုးများ</translation> <translation id="7671130400130574146">စနစ် ခေါင်းစီး ဘား နှင့် အနားများကို သုံးရန်</translation> <translation id="767127784612208024">ပြင်ဆင်သတ်မှတ်မှု အတည်ပြုရန် ထိပါ</translation> +<translation id="7672504401554182757"><ph name="APP_NAME" /> အတွက် လျှို့ဝှက်ကီး ရှိသည့်စက်ကို ရွေးပါ</translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />၊ <ph name="PAGE_TITLE" /> အတွင်း။</translation> <translation id="7674416868315480713">Linux တွင် ထပ်ဆင့်ပို့ထားသော ပို့တ်အားလုံးကို ပိတ်ရန်</translation> <translation id="7674537509496907005">အက်ပ် <ph name="APP_COUNT" /> ခု</translation> @@ -7102,6 +7134,7 @@ <translation id="7709152031285164251">မအောင်မြင်ခဲ့- <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&ကာစ်...</translation> <translation id="7711900714716399411">သင့်ဖုန်းနှင့် ကွန်ပျူတာကို ချိတ်ဆက်ရန် USB ကြိုး သုံးပါ။ သင့်ဖုန်းကို ချိတ်ဆက်ပြီးဖြစ်ပါက ဖြုတ်ပြီး ပြန်တပ်ပါ။</translation> +<translation id="7711968363685835633">အသုံးပြုသူ အဘိဓာန်နှင့်အတူ ပုဂ္ဂိုလ်ရေးသီးသန့် ရလဒ်ကောင်းနှင့် အကြံပြုချက်များကို ပိတ်ရန်</translation> <translation id="7712739869553853093">ပုံနှိပ်ထုတ်ယူမှု အစမ်းကြည့်ရှုခြင်း ဒိုင်ယာလော့ခ်</translation> <translation id="7714307061282548371"><ph name="DOMAIN" /> ထံမှ ကွတ်ကီးများကို ခွင့်ပြုထားသည်</translation> <translation id="7714464543167945231">လက်မှတ်</translation> @@ -7168,11 +7201,13 @@ <translation id="7766807826975222231">လေ့လာ ကြည့်ရှုပါ</translation> <translation id="7766838926148951335">ခွင့်ပြုချက်များကို လက်ခံရန်</translation> <translation id="7767554953520855281">သင်၏ဖန်သားပြင်ကို မျှဝေနေစဉ် အသေးစိတ်ကို ဖျောက်ထားသည်</translation> +<translation id="7767972280546034736"><ph name="APP_NAME" /> အတွက် လျှို့ဝှက်ကီး ပြုလုပ်ခြင်း</translation> <translation id="7768507955883790804">ဝဘ်ဆိုက်များသို့ ဝင်ကြည့်သောအခါ ၎င်းတို့က ဤဆက်တင်အတိုင်း အလိုအလျောက်လုပ်ဆောင်သည်</translation> <translation id="7768526219335215384"><ph name="ORIGIN" /> သည် <ph name="FOLDERNAME" /> ရှိ ဖိုင်များကို ကြည့်နိုင်ပါမည်</translation> <translation id="7768770796815395237">ပြောင်းရန်</translation> <translation id="7768784765476638775">စကားပြော-ရွေးရန်</translation> <translation id="7769748505895274502">လတ်တလောပိတ်ထားသည်များကို ခေါက်ရန်</translation> +<translation id="7770072242481632881">ဘေးအကန့် ရွေးချယ်စနစ်</translation> <translation id="7770406201819593386">ChromeOS Flex အမှားရှာဖွေမှုဆိုင်ရာ စမ်းသပ်မှုများ လုပ်ဆောင်နိုင်သည်။</translation> <translation id="7770450735129978837">မောက်စ်ညာကလစ်</translation> <translation id="7770612696274572992">အခြားစက်မှ မိတ္တူကူးထားသည့် ပုံ</translation> @@ -7655,6 +7690,7 @@ <translation id="820568752112382238">အများဆုံး ဝင်ကြည့်ထားသော ဝဘ်ဆိုက်များ</translation> <translation id="8206745257863499010">အပြာရောင်ဂီတသင်္ကေတ</translation> <translation id="8206859287963243715">ဆဲလ်လူလာ</translation> +<translation id="8207404892907560325">လျှို့ဝှက်ကီးရွေးခြင်း</translation> <translation id="8208216423136871611">မသိမ်းဆည်းပါနှင့်</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{အကြောင်းကြားချက်အသစ်}other{အကြောင်းကြားချက်အသစ် # ခု}}</translation> <translation id="821119981794423735"><ph name="USER_EMAIL" /> ၏ ‘Google စကားဝှက်မန်နေဂျာ’ တွင် စကားဝှက်များထည့်သွင်းရန် CSV ဖိုင်တစ်ခု ရွေးပါ</translation> @@ -7808,6 +7844,7 @@ <translation id="8353683614194668312">၎င်း ဖြစ်နိုင်သည်မှာ:</translation> <translation id="8354034204605718473">သင့်ကလေး၏ ပင်နံပါတ်ကို ထည့်ပြီးပြီ</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">ဤစက်ကို မှတ်ပုံတင်ထားပြီးဖြစ်သည်။ ထပ်မံ မှတ်ပုံတင်ရန် မလိုပါ။</translation> <translation id="8357388086258943206">Linux ထည့်သွင်းရာတွင် အမှားရှိနေသည်</translation> <translation id="8358685469073206162">စာမျက်နှာများ ပြန်လည်သိုလှောင်မလား?</translation> <translation id="8358912028636606457">တဘ်အသံကို ကာစ်လုပ်ခြင်းအား ဤစက်ပစ္စည်းပေါ်တွင် ပံ့ပိုးမထားပါ။</translation> @@ -7827,6 +7864,7 @@ <translation id="8376137163494131156">Google Cast တွင် ဘာဖြစ်နေသည်ကို ပြောပြပါ။</translation> <translation id="8376384591331888629">ဤဝဘ်ဆိုက်ရှိ ပြင်ပကုမ္ပဏီကွတ်ကီးများ အပါအဝင်</translation> <translation id="8376451933628734023">ဤဝဘ်အက်ပ်သည် အခြားအက်ပ်တစ်ခုဖြစ်ကြောင်း တွေးထင်စေရန် သင့်အားလှည့်စားနေပါက ၎င်းကို ဖယ်ရှားပါ။</translation> +<translation id="8377625247046155446">ဤလျှို့ဝှက်ကီးကို ဤစက်တွင်သာ သိမ်းပါမည်။ ‘ရုပ်ဖျက်ဝင်ဒိုး’ အားလုံးပိတ်ပြီးသောအခါ ၎င်းက ဤစက်တွင် ကျန်ရှိနေမည်။</translation> <translation id="8378714024927312812">သင်၏ 'အဖွဲ့အစည်း' က စီမံခန့်ခွဲထားသည်</translation> <translation id="8379156816349755485">လက်မှတ်ထိုးဝင်သည့်အခါ သီးသန့် အထောက်အထားစိစစ်ခြင်း တိုကင်ကို သိမ်းထားမည်ဖြစ်ပြီး နောင်လာမည့် သတ်မှတ်ချက်ပြည့်မီသော ဒေါင်းလုဒ်အားလုံးအတွက် အသုံးပြုမည်။</translation> <translation id="8379878387931047019">ဤစက်ပစ္စည်းတွင် ဤဝဘ်ဆိုက်က တောင်းဆိုထားသော လုံခြုံရေးကီး အမျိုးအစားကို သုံး၍မရပါ</translation> @@ -8044,7 +8082,7 @@ <translation id="8599864823732014237">လုပ်ငန်းသုံးတွင် စာရင်းသွင်းခြင်းကို ကျော်မလား။</translation> <translation id="8601206103050338563">TLS WWW သုံးစွဲသူကို စိစစ်ခြင်း</translation> <translation id="8601611099293226919">Google Lens ဖြင့် သင့်ဖန်သားပြင်တွင် ရှာဖွေပါ</translation> -<translation id="8602674530529411098">အက်ပ်များ (စမ်းသပ်ဆော့ဖ်ဝဲ)</translation> +<translation id="8602674530529411098">အက်ပ်များ (စမ်းသပ်)</translation> <translation id="8602851771975208551">Chrome အလုပ်လုပ်ပုံပေါင်းလဲသွားစေမည့် အက်ပ် တစ်ခုကို သင့်ကွန်ပျူတာရှိ အခြား ပရိုဂရမ်မှ ပေါင်းထည့်ခဲ့သည်။</translation> <translation id="8605428685123651449">SQLite မှတ်ဉာဏ်</translation> <translation id="8608618451198398104">Kerberos လက်မှတ်တစ်ခု ထည့်ခြင်း</translation> @@ -8657,6 +8695,7 @@ <ph name="LIST_ITEM" />Chrome ချိတ်ဆက်မှု စိစစ်ချက်များ လုပ်ဆောင်ခြင်း <ph name="END_LIST" /></translation> <translation id="916607977885256133">နှစ်ခုထပ်၍ကြည့်ခြင်း</translation> +<translation id="9166253503936244008"><ph name="APP_NAME" /> အတွက် သုံးလိုသည့် လျှို့ဝှက်ကီးရှိသောစက်ဖြင့် ဤ QR ကုဒ်ကို စကင်ဖတ်ပါ</translation> <translation id="9167063903968449027">ဖတ်ရန်စာရင်း ပြရန်</translation> <translation id="9167450455589251456">ဤပရိုဖိုင်ကို ပံ့ပိုးမထားပါ</translation> <translation id="9168436347345867845">နောက်မှလုပ်ရန်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index cd67599..c461b0b 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1126,7 +1126,7 @@ तपाईं आफ्नो यन्त्रमा Family Link एप स्थापना गरेर यो खाताको सेटिङ व्यवस्थित गर्न सक्नुहुन्छ। हामीले इमेलमार्फत तपाईंलाई निर्देशनहरू पठाएका छौँ।</translation> <translation id="2039464276165755892">कसैले चियो गरिरहेको छ भन्ने कुरा पत्ता लागेमा सूचना लुकाइयोस्</translation> -<translation id="2040460856718599782">ओहो! तपाईं प्रमाणीकरण गर्न प्रयास गर्दा केही गल्ती भयो। आफ्नो साइन इन प्रमाणहरू डबल जाँच गरी फेरि प्रयास गर्नुहोस्।</translation> +<translation id="2040460856718599782">ओहो! तपाईं प्रमाणीकरण गर्न प्रयास गर्दा कुनै त्रुटि भयो। आफ्नो साइन इन प्रमाणहरू डबल जाँच गरी फेरि प्रयास गर्नुहोस्।</translation> <translation id="2040894699575719559">लोकेसन हेर्न रोक लगाइएको छ</translation> <translation id="2042279886444479655">सक्रिय प्रोफाइलहरू</translation> <translation id="2044014337866019681">कृपया तपाईं यो सत्र अनलक गर्न <ph name="ACCOUNT" /> पुष्टि गर्दै हुनुहुन्छ भन्ने कुरा सुनिश्चित गर्नुहोस्।</translation> @@ -6724,7 +6724,7 @@ <translation id="7347943691222276892"><ph name="SUBPAGE_TITLE" /> बाट बाहिर निस्केर अघिल्लो पृष्ठमा जान क्लिक गर्नुहोस्।</translation> <translation id="7348093485538360975">अन्-स्क्रिन कुञ्जीपाटी</translation> <translation id="7349010927677336670">अवरोधविना भिडियो चल्ने गति</translation> -<translation id="7352651011704765696">केही गल्ती भयो</translation> +<translation id="7352651011704765696">कुनै त्रुटि भयो</translation> <translation id="7353261921908507769">तपाईं वरपर हुँदा तपाईंको सम्पर्क सूचीमा भएका व्यक्तिहरू सामग्री सेयर गर्न सक्छन्। तपाईंले सामग्री सार्ने निम्तो स्वीकार नगरेसम्म सामग्री सार्ने काम सुरु हुँदैन।</translation> <translation id="735361434055555355">Linux स्थापना गर्दै...</translation> <translation id="7354341762311560488">तपाईंको किबोर्डको बायाँतिर फेदमा रहेको कुञ्जी फिंगरप्रिन्ट सेन्सर हो। यसलाई जुनसुकै औँलाले हल्का छुनुहोस्।</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index 8f95bf12..21fbf82 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1248,6 +1248,7 @@ <translation id="2135787500304447609">&Fortsett</translation> <translation id="2136372518715274136">Skriv inn et nytt passord</translation> <translation id="2136476978468204130">Passordfrasen du skrev inn, er feil</translation> +<translation id="2137128126782078222">Ikke tillat varsler fra <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Venter på tillatelse …</translation> <translation id="2139919072249842737">Konfigurer-knappen</translation> <translation id="2140788884185208305">Batterihelse</translation> @@ -2486,6 +2487,7 @@ <translation id="3281892622610078515">Filer og programmer som blir satt i karantene:</translation> <translation id="3282210178675490297">Deler en fane med <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Ny &fane</translation> +<translation id="3285500645985761267">Tillat relaterte nettsteder å se aktiviteten din i gruppen</translation> <translation id="328571385944182268">Vil du lagre passordene dine?</translation> <translation id="3288047731229977326">Utvidelser som kjører i utviklermodus kan skade datamaskinen din. Hvis du ikke er utvikler, bør du deaktivere disse utvidelsene som kjører i utviklermodus, for å være på den sikre siden.</translation> <translation id="3289668031376215426">Automatisk stor forbokstav</translation> @@ -2760,6 +2762,7 @@ <translation id="3541823293333232175">Tilordnet</translation> <translation id="3543393733900874979">Oppdatering mislyktes (feil: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">X9.62 ECDSA-signatur med SHA-512</translation> +<translation id="3544058026430919413">Bedrifter kan definere grupper av nettsteder som kan bruke informasjonskapsler for å dele aktiviteten din i gruppen. Dette er av i Inkognito.</translation> <translation id="3544879808695557954">Brukernavn (valgfritt)</translation> <translation id="354602065659584722">Den skadelige programvaren er fjernet</translation> <translation id="3547954654003013442">Innstillinger for proxy-tjener</translation> @@ -2898,6 +2901,7 @@ <translation id="3681548574519135185">Fokusring</translation> <translation id="3683524264665795342"><ph name="APP_NAME" />-forespørsel om skjermdeling</translation> <translation id="3685598397738512288">USB-innstillinger for Linux</translation> +<translation id="3687598459967813435">Tillat alltid varsler fra <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Det oppstod en feil under forsøket på å skrive filen: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">skrive til filer og mapper du åpner i appen</translation> <translation id="3688526734140524629">Bytt kanal</translation> @@ -4055,6 +4059,7 @@ <translation id="4779766576531456629">Gi nytt navn til mobilnettverket for e-SIM-kortet</translation> <translation id="4780321648949301421">L&agre side som</translation> <translation id="4781443161433589743">Du har den beste sikkerheten i Chrome</translation> +<translation id="4781584184731045253">Fjern data og tillatelser</translation> <translation id="4782861709165039462">Alle mikrofoner er deaktivert via den fysiske bryteren på enheten</translation> <translation id="4785719467058219317">Du bruker en sikkerhetsnøkkel som ikke er registrert på dette nettstedet</translation> <translation id="4785914069240823137">Avbryt beskjæring</translation> @@ -4734,6 +4739,7 @@ <translation id="5449551289610225147">Ugyldig passord</translation> <translation id="5449588825071916739">Angi bokmerker for alle faner</translation> <translation id="5449716055534515760">Lukk vin&du</translation> +<translation id="545133051331995777">Ingen nettverkstilkobling</translation> <translation id="5452446625764825792">Nå kan du se telefonens nylige bilder, medier og apper</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (fungerer uten nett)</translation> <translation id="5454166040603940656">med <ph name="PROVIDER" /></translation> @@ -4777,6 +4783,7 @@ <translation id="5487521232677179737">Slett data</translation> <translation id="5488093641312826914">«<ph name="COPIED_ITEM_NAME" />» er kopiert</translation> <translation id="5488508217173274228">Alternativer for kryptering av synkroniserte data</translation> +<translation id="5489077378642700219">Ikke tillat varsler fra <ph name="WEBSITE" />, men spør senere</translation> <translation id="5489435190927933437">Lagrede passord for <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Koble fra Bluetooth-enheten</translation> <translation id="5490798133083738649">Gi Linux tilgang til mikrofonen din</translation> @@ -5114,6 +5121,7 @@ <translation id="5805697420284793859">Window Manager</translation> <translation id="5806447147478173900">Total mengde lagringsplass som brukes av nettstedene som vises: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (standard)</translation> +<translation id="5809835394668218762">Flere handlinger for <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled må være aktivert i chrome://flags</translation> <translation id="5810809306422959727">Denne kontoen er ikke kvalifisert for foreldrekontroll</translation> <translation id="5811614940486072060">Denne filen lastes sjelden ned og kan være farlig.</translation> @@ -5128,6 +5136,7 @@ <translation id="5826395379250998812">Koble <ph name="DEVICE_TYPE" /> til telefonen. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Halvgjennomsiktig</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Vis nettsteder i samme gruppe</translation> <translation id="5827733057563115968">Forslag til neste ord</translation> <translation id="5828545842856466741">Legg til profil…</translation> <translation id="5828633471261496623">Skriver ut …</translation> @@ -5243,6 +5252,7 @@ <translation id="5927232971138258197">Denne utvidelsen kan lese og endre <ph name="HOST" /></translation> <translation id="592740088639760830">Stopp denne beholderen</translation> <translation id="592880897588170157">Last ned PDF-filer i stedet for at de åpnes automatisk i Chrome</translation> +<translation id="5928969282301718193">Det var alt for denne gangen</translation> <translation id="592919310198008711">Når jeg klikker på utvidelsen</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> krever at du oppdaterer <ph name="DEVICE_TYPE" /> umiddelbart.</translation> <translation id="5932224571077948991">Nettstedet viser forstyrrende eller villedende annonser</translation> @@ -5416,6 +5426,7 @@ <translation id="6087746524533454243">Ser du etter nettleserens Om-side? Gå til</translation> <translation id="6087960857463881712">Fantastisk-fjes</translation> <translation id="608912389580139775">For å legge til denne siden på leselisten din, klikk på Bokmerke-ikonet</translation> +<translation id="6091116443517744502">kontroller internettilkoblingen din, og prøv på nytt</translation> <translation id="6091761513005122595">Delingen er aktivert.</translation> <translation id="6093803049406781019">Slett profil</translation> <translation id="6093888419484831006">Avbryter oppdatering …</translation> @@ -6078,6 +6089,7 @@ <translation id="6736243959894955139">Adresse</translation> <translation id="6737393581255281855">Vil du slette dataene som vises?</translation> <translation id="6737663862851963468">Fjern Kerberos-sak</translation> +<translation id="6738180164164974883">Tillat nettstedet å angi informasjonskapsler fra tredjeparter</translation> <translation id="6738430949033571771">Bekrefter kontoen …</translation> <translation id="6739923123728562974">Vis skrivebordssnarvei</translation> <translation id="6740234557573873150"><ph name="FILE_NAME" /> er satt på pause</translation> @@ -6275,6 +6287,7 @@ <translation id="691106080621596509">Dette sletter alle dataene og informasjonskapslene som er lagret av <ph name="SITE_GROUP_NAME" />, eventuelle underordnede nettsteder og den tilhørende appen som er installert</translation> <translation id="6911734910326569517">Minnebruk</translation> <translation id="6912007319859991306">PIN-kode for mobil-SIM</translation> +<translation id="6912380255120084882">Prøv en annen enhet</translation> <translation id="691289340230098384">Valg for teksting</translation> <translation id="6914783257214138813">Passordene dine blir synlige for alle som kan se den eksporterte filen.</translation> <translation id="6916590542764765824">Administrer utvidelser</translation> @@ -6585,6 +6598,7 @@ <translation id="7222204278952406003">Chrome er standardnettleseren din</translation> <translation id="7222232353993864120">E-postadresse</translation> <translation id="7222235798733126207">Begrenset deling mellom nettsteder</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 nettsted i gruppen til <ph name="FPS_OWNER" />}other{{MEMBERS} nettsteder i gruppen til <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Bruk Windows Hello når du fyller ut passord</translation> <translation id="7225179976675429563">Nettverkstype mangler</translation> <translation id="7227458944009118910">Appene som er oppført nedenfor, kan også håndtere protokoll-linker. Andre apper kommer til å be om tillatelse.</translation> @@ -7097,6 +7111,7 @@ <translation id="7709152031285164251">Mislykket – <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Cast…</translation> <translation id="7711900714716399411">Bruk en USB-kabel for å koble telefonen til datamaskinen. Hvis telefonen allerede er koblet til, kobler du den fra og til igjen.</translation> +<translation id="7711968363685835633">Deaktiver personlige konverteringer og forslag samt brukerordlisten</translation> <translation id="7712739869553853093">Dialogboks for forhåndsvisning av utskrift</translation> <translation id="7714307061282548371">Informasjonskapsler fra <ph name="DOMAIN" /> tillates</translation> <translation id="7714464543167945231">Sertifikat</translation> @@ -7168,6 +7183,7 @@ <translation id="7768770796815395237">Endre</translation> <translation id="7768784765476638775">Tekstopplesing</translation> <translation id="7769748505895274502">Skjul nylig lukkede</translation> +<translation id="7770072242481632881">Sidepanelvelger</translation> <translation id="7770406201819593386">Kjør diagnostikktester for ChromeOS Flex.</translation> <translation id="7770450735129978837">Høyre museknapp</translation> <translation id="7770612696274572992">Et bilde er kopiert fra en annen enhet</translation> @@ -7804,6 +7820,7 @@ <translation id="8353683614194668312">Den får følgende tilgang:</translation> <translation id="8354034204605718473">Barnets PIN-kode er lagt til</translation> <translation id="8356197132883132838"><ph name="TITLE" /> – <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Du har allerede registrert denne enheten. Du trenger ikke å registrere den på nytt.</translation> <translation id="8357388086258943206">Feil ved installering av Linux</translation> <translation id="8358685469073206162">Vil du gjenopprette sidene?</translation> <translation id="8358912028636606457">Denne enheten har ikke støtte for å caste fanelyd.</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 1db5c7c0..c593f1c 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -1910,6 +1910,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">ਨਿਗਰਾਨੀ ਕੀਤੇ ਵਰਤੋਂਕਾਰ ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਏ ਗਏ ਹਨ।</translation> <translation id="2722540561488096675">ਤੁਹਾਡਾ ਡੀਵਾਈਸ <ph name="TIME_LEFT" /> ਵਿੱਚ ਬੰਦ ਹੋ ਜਾਵੇਗਾ। ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਵਾਪਸ ਚਾਲੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ USB ਹਟਾਓ। ਫਿਰ ਤੁਸੀਂ <ph name="DEVICE_OS" /> ਨੂੰ ਵਰਤਣਾ ਸ਼ੁਰੂ ਕਰ ਸਕਦੇ ਹੋ।</translation> +<translation id="2722547199758472013">ਆਈਡੀ: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC ਲੌਗਸ</translation> <translation id="272488616838512378">ਇਕਾਈ ਰੂਪਾਂਤਰਨ</translation> <translation id="2725200716980197196">ਨੈੱਟਵਰਕ ਕਨੈਕਟੀਵਿਟੀ ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਗਿਆ</translation> @@ -3082,6 +3083,7 @@ <translation id="3828029223314399057">ਬੁੱਕਮਾਰਕ ਖੋਜੋ</translation> <translation id="3828953470056652895">ਮੈਂ <ph name="BEGIN_LINK1" />Google ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Chrome ਅਤੇ ChromeOS ਦੇ ਵਧੀਕ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK2" /> ਅਤੇ <ph name="BEGIN_LINK3" />Play ਦੇ ਸੇਵਾ ਦੇ ਨਿਯਮਾਂ<ph name="END_LINK3" /> ਨੂੰ ਪੜ੍ਹ ਲਿਆ ਹੈ ਅਤੇ ਉਨ੍ਹਾਂ ਨਾਲ ਸਹਿਮਤ ਹਾਂ।</translation> <translation id="3829765597456725595">SMB ਫ਼ਾਈਲ ਸਾਂਝਾਕਰਨ</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /> 'ਤੇ</translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ 1 ਸੰਭਾਵੀ ਤੌਰ 'ਤੇ ਨੁਕਸਾਨਦੇਹ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰ ਦਿੱਤਾ ਹੈ}one{ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ {NUM_EXTENSIONS} ਸੰਭਾਵੀ ਤੌਰ 'ਤੇ ਨੁਕਸਾਨਦੇਹ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰ ਦਿੱਤਾ ਹੈ}other{ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ {NUM_EXTENSIONS} ਸੰਭਾਵੀ ਤੌਰ 'ਤੇ ਨੁਕਸਾਨਦੇਹ ਐਕਸਟੈਂਸ਼ਨਾਂ ਨੂੰ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰ ਦਿੱਤਾ ਹੈ}}</translation> <translation id="3831436149286513437">Google Drive ਖੋਜ ਸੁਝਾਅ</translation> <translation id="3834728400518755610">ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲਣ ਲਈ Linux ਨੂੰ ਬੰਦ ਕਰਨਾ ਲੋੜੀਂਦਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ Linux ਨੂੰ ਬੰਦ ਕਰੋ।</translation> @@ -5217,6 +5219,7 @@ <translation id="5884474295213649357">ਇਹ ਟੈਬ ਕਿਸੇ ਬਲੂਟੁੱਥ ਡੀਵਾਈਸ ਨਾਲ ਕਨੈਕਟ ਕੀਤੀ ਗਈ ਹੈ।</translation> <translation id="5885314688092915589">ਤੁਹਾਡੀ ਸੰਸਥਾ ਇਸ ਪ੍ਰੋਫਾਈਲ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੇਗੀ</translation> <translation id="5886009770935151472">ਉਂਗਲ 1</translation> +<translation id="5886112770923972514">ਤੇਜ਼ ਜੋੜਾਬੰਦੀ ਵਾਲੇ ਨੇੜਲੇ ਡੀਵਾਈਸਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰੋ ਅਤੇ ਉਨ੍ਹਾਂ ਦਾ ਤੁਰੰਤ ਸੈੱਟਅੱਪ ਕਰੋ</translation> <translation id="5886384907280980632">ਹੁਣੇ ਬੰਦ ਕਰੋ</translation> <translation id="5889282057229379085">ਵਿਚਕਾਰਲੇ CA ਦੀ ਅਧਿਕਤਮ ਸੰਖਿਆ: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">ਤਰਜੀਹੀ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ</translation> @@ -6729,7 +6732,7 @@ <translation id="7347943691222276892"><ph name="SUBPAGE_TITLE" /> ਤੋਂ ਦੂਰ ਨੈਵੀਗੇਟ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ।</translation> <translation id="7348093485538360975">ਔਨ-ਸਕ੍ਰੀਨ ਕੀ-ਬੋਰਡ</translation> <translation id="7349010927677336670">ਵੀਡੀਓ ਸਰਲਤਾ</translation> -<translation id="7352651011704765696">ਕੁਝ ਗ਼ਲਤ ਹੋਇਆ ਸੀ</translation> +<translation id="7352651011704765696">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ</translation> <translation id="7353261921908507769">ਉਹਨਾਂ ਦੇ ਨਜ਼ਦੀਕ ਹੋਣ 'ਤੇ ਤੁਹਾਡੇ ਸੰਪਰਕ ਤੁਹਾਡੇ ਨਾਲ ਸਾਂਝਾ ਕਰ ਸਕਦੇ ਹਨ। ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਸਵੀਕਾਰ ਨਹੀਂ ਕਰਦੇ, ਟ੍ਰਾਂਸਫ਼ਰ ਸ਼ੁਰੂ ਨਹੀਂ ਹੁੰਦਾ।</translation> <translation id="735361434055555355">Linux ਸਥਾਪਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="7354341762311560488">ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਤੁਹਾਡੇ ਕੀ-ਬੋਰਡ ਦੀ ਹੇਠਲੀ ਖੱਬੇ ਪਾਸੇ ਦੀ ਕੁੰਜੀ ਹੈ। ਇਸਨੂੰ ਕਿਸੇ ਵੀ ਉਂਗਲ ਨਾਲ ਹਲਕਾ ਜਿਹਾ ਸਪਰਸ਼ ਕਰੋ।</translation> @@ -7817,6 +7820,7 @@ <translation id="8338952601723052325">ਵਿਕਾਸਕਾਰ ਵੈੱਬਸਾਈਟ</translation> <translation id="833986336429795709">ਇਸ ਲਿੰਕ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ, ਕੋਈ ਐਪ ਚੁਣੋ</translation> <translation id="8340547030807793004"><ph name="DEVICE" /> ਲਈ ਹੋਰ ਕਾਰਵਾਈਆਂ</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{ਹਾਲ ਹੀ ਵਿੱਚ ਬਹੁਤ ਸਾਰੀਆਂ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਵਾਲੀ <ph name="BEGIN_BOLD" />1 ਸਾਈਟ<ph name="END_BOLD" /> ਦੀ ਸਮੀਖਿਆ ਕਰੋ}one{ਹਾਲ ਹੀ ਵਿੱਚ ਬਹੁਤ ਸਾਰੀਆਂ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਵਾਲੀ <ph name="BEGIN_BOLD" />{NUM_SITES} ਸਾਈਟ<ph name="END_BOLD" /> ਦੀ ਸਮੀਖਿਆ ਕਰੋ}other{ਹਾਲ ਹੀ ਵਿੱਚ ਬਹੁਤ ਸਾਰੀਆਂ ਸੂਚਨਾਵਾਂ ਭੇਜਣ ਵਾਲੀਆਂ <ph name="BEGIN_BOLD" />{NUM_SITES} ਸਾਈਟਾਂ<ph name="END_BOLD" /> ਦੀ ਸਮੀਖਿਆ ਕਰੋ}}</translation> <translation id="8342221978608739536">ਕੋਸ਼ਿਸ਼ ਨਹੀਂ ਕੀਤੀ</translation> <translation id="8342861492835240085">ਕੋਈ ਸੰਗ੍ਰਹਿ ਚੁਣੋ</translation> <translation id="8345848587667658367">ਤੁਸੀਂ ਹੁਣ ਆਪਣੇ ਫ਼ੋਨ ਦੀਆਂ ਹਾਲੀਆ ਫ਼ੋਟੋਆਂ, ਮੀਡੀਆ, ਸੂਚਨਾਵਾਂ ਅਤੇ ਐਪਾਂ ਨੂੰ ਦੇਖ ਸਕਦੇ ਹੋ</translation> @@ -8815,6 +8819,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">ਸੁਰੱਖਿ੍ਤ ਕਨੈਕਸ਼ਨ ਸਥਾਪਿਤ ਕਰ ਰਿਹਾ ਹੈ...</translation> <translation id="996803490569799917">ਆਪਣੇ ਮਨਪਸੰਦ ਲੋਕਾਂ ਦੀਆਂ ਯਾਦਾਂ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਦੇਖੋ</translation> +<translation id="997143476478634194">ਜਦੋਂ ਤੁਸੀਂ ਸਾਈਟਾਂ 'ਤੇ ਜਾਂਦੇ ਹੋ, ਤਾਂ ਉਹ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਇਸ ਸੈਟਿੰਗ ਦੀ ਪਾਲਣਾ ਕਰਦੀਆਂ ਹਨ। ਸਾਈਟਾਂ ਆਮ ਤੌਰ 'ਤੇ ਤੁਹਾਨੂੰ ਤਾਜ਼ਾ ਖਬਰਾਂ ਜਾਂ ਚੈਟ ਸੁਨੇਹਿਆਂ ਬਾਰੇ ਦੱਸਣ ਲਈ ਸੂਚਨਾਵਾਂ ਭੇਜਦੀਆਂ ਹਨ।</translation> <translation id="99731366405731005">ਵਾਈ-ਫਾਈ ਸਿੰਕ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ <ph name="LINK1_BEGIN" />Chrome ਸਿੰਕ<ph name="LINK1_END" /> ਨੂੰ ਚਾਲੂ ਕਰੋ। <ph name="LINK2_BEGIN" />ਹੋਰ ਜਾਣੋ<ph name="LINK2_END" /></translation> <translation id="998747458861718449">ਜਾਂ&ਚ ਕਰੋ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index c5fa0164..38f8f0d 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1881,6 +1881,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Nadzorowanych użytkowników wyłączył administrator.</translation> <translation id="2722540561488096675">Urządzenie wyłączy się za <ph name="TIME_LEFT" />. Zanim ponownie je włączysz, wyjmij urządzenie USB. Potem możesz zacząć używać systemu <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">Identyfikator: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">Logi WebRTC</translation> <translation id="272488616838512378">Przeliczanie jednostek</translation> <translation id="2725200716980197196">Łączność z siecią przywrócona</translation> @@ -3054,6 +3055,7 @@ <translation id="3828029223314399057">Przeszukaj zakładki</translation> <translation id="3828953470056652895">Znam i akceptuję <ph name="BEGIN_LINK1" />Warunki korzystania z usług Google<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Dodatkowe warunki korzystania z Google Chrome i Chrome OS<ph name="END_LINK2" /> oraz <ph name="BEGIN_LINK3" />Warunki korzystania z usługi Google Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">Udział plików SMB</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Twój administrator ponownie włączył 1 potencjalnie niebezpieczne rozszerzenie}few{Twój administrator ponownie włączył {NUM_EXTENSIONS} potencjalnie niebezpieczne rozszerzenia}many{Twój administrator ponownie włączył {NUM_EXTENSIONS} potencjalnie niebezpiecznych rozszerzeń}other{Twój administrator ponownie włączył {NUM_EXTENSIONS} potencjalnie niebezpiecznego rozszerzenia}}</translation> <translation id="3831436149286513437">Podpowiedzi z Dysku Google podczas wyszukiwania</translation> <translation id="3834728400518755610">Zmiana ustawienia mikrofonu wymaga wyłączenia Linuksa. Wyłącz Linuksa, by kontynuować.</translation> @@ -5188,6 +5190,7 @@ <translation id="5884474295213649357">Ta karta jest połączona z urządzeniem USB.</translation> <translation id="5885314688092915589">Tym profilem będzie zarządzać Twoja organizacja</translation> <translation id="5886009770935151472">Palec 1</translation> +<translation id="5886112770923972514">Podłącz i szybko skonfiguruj urządzenia w pobliżu, używając funkcji Szybkie parowanie</translation> <translation id="5886384907280980632">Wyłącz teraz</translation> <translation id="5889282057229379085">Maksymalna liczba pośrednich urzędów certyfikacji: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Preferowane sieci Wi-Fi</translation> @@ -7789,6 +7792,7 @@ <translation id="8338952601723052325">Witryna dewelopera</translation> <translation id="833986336429795709">Aby otworzyć ten link, wybierz aplikację</translation> <translation id="8340547030807793004">Więcej działań dotyczących: <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Sprawdź <ph name="BEGIN_BOLD" />1 witrynę<ph name="END_BOLD" />, która ostatnio wysłała wiele powiadomień}few{Sprawdź <ph name="BEGIN_BOLD" />{NUM_SITES} witryny<ph name="END_BOLD" />, które ostatnio wysłały wiele powiadomień}many{Sprawdź <ph name="BEGIN_BOLD" />{NUM_SITES} witryn<ph name="END_BOLD" />, które ostatnio wysłały wiele powiadomień}other{Sprawdź <ph name="BEGIN_BOLD" />{NUM_SITES} witryny<ph name="END_BOLD" />, która ostatnio wysłała wiele powiadomień}}</translation> <translation id="8342221978608739536">Nie wiem</translation> <translation id="8342861492835240085">Wybierz kolekcję</translation> <translation id="8345848587667658367">Możesz teraz wyświetlać najnowsze zdjęcia, pliki multimedialne, powiadomienia i aplikacje z telefonu</translation> @@ -8785,6 +8789,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Nawiązuję bezpieczne połączenie...</translation> <translation id="996803490569799917">Oglądaj wspomnienia związane m.in. ze swoimi ulubionymi osobami</translation> +<translation id="997143476478634194">Otwierane witryny automatycznie działają zgodnie z tym ustawieniem. Witryny zazwyczaj wysyłają powiadomienia o aktualnościach lub wiadomościach czatu.</translation> <translation id="99731366405731005">Aby korzystać z synchronizacji Wi-Fi, włącz <ph name="LINK1_BEGIN" />Synchronizację Chrome<ph name="LINK1_END" />. <ph name="LINK2_BEGIN" />Więcej informacji<ph name="LINK2_END" /></translation> <translation id="998747458861718449">&Zbadaj</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 61a91ab8..0cea7ad 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1243,6 +1243,7 @@ <translation id="2135787500304447609">&Reia</translation> <translation id="2136372518715274136">Introdu noua parolă</translation> <translation id="2136476978468204130">Expresia de acces pe care ai introdus-o nu este corectă</translation> +<translation id="2137128126782078222">Nu permite notificările de la <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Se așteaptă permisiunea…</translation> <translation id="2139919072249842737">Butonul Configurează</translation> <translation id="2140788884185208305">Buna funcționare a bateriei</translation> @@ -2478,6 +2479,7 @@ <translation id="3281892622610078515">Fișierele și programele ce urmează a fi mutate în carantină:</translation> <translation id="3282210178675490297">Se distribuie o filă către <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Filă &nouă</translation> +<translation id="3285500645985761267">Permite site-urilor conexe să-ți vadă activitatea în grup</translation> <translation id="328571385944182268">Salvezi parolele?</translation> <translation id="3288047731229977326">Extensiile care rulează în modul pentru dezvoltatori pot afecta computerul. Dacă nu sunteți dezvoltator, se recomandă să dezactivați aceste extensii, pentru siguranță.</translation> <translation id="3289668031376215426">Scriere automată cu majuscule</translation> @@ -2752,6 +2754,7 @@ <translation id="3541823293333232175">Atribuită</translation> <translation id="3543393733900874979">Actualizarea nu a reușit (eroare: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">Semnătură X9.62 ECDSA cu SHA-512</translation> +<translation id="3544058026430919413">O companie poate defini un grup de site-uri care pot folosi cookie-uri pentru a-ți afișa activitatea în grup. Această opțiune este dezactivată în modul incognito.</translation> <translation id="3544879808695557954">Nume de utilizator (opțional)</translation> <translation id="354602065659584722">Software-ul dăunător a fost eliminat</translation> <translation id="3547954654003013442">Setări proxy</translation> @@ -2890,6 +2893,7 @@ <translation id="3681548574519135185">Inel de focalizare</translation> <translation id="3683524264665795342">Solicitare de accesare a ecranului pentru aplicația <ph name="APP_NAME" /></translation> <translation id="3685598397738512288">Preferințe USB în Linux</translation> +<translation id="3687598459967813435">Permite întotdeauna notificările de la <ph name="WEBSITE" /></translation> <translation id="368789413795732264">A apărut o eroare la încercarea de scriere a fișierului: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Scrie în fișierele și dosarele pe care le deschideți în aplicație</translation> <translation id="3688526734140524629">Schimbați canalul</translation> @@ -4049,6 +4053,7 @@ <translation id="4779766576531456629">Redenumește rețeaua de date mobile eSIM</translation> <translation id="4780321648949301421">Salvează pagina ca...</translation> <translation id="4781443161433589743">Folosești cea mai eficientă securitate pentru Chrome</translation> +<translation id="4781584184731045253">Elimină datele și permisiunile</translation> <translation id="4782861709165039462">Toate microfoanele sunt dezactivate de la comutatorul hardware al dispozitivului</translation> <translation id="4785719467058219317">Folosești o cheie de securitate care nu este înregistrată pe acest site</translation> <translation id="4785914069240823137">Anulează decuparea</translation> @@ -4729,6 +4734,7 @@ <translation id="5449551289610225147">Parolă nevalidă</translation> <translation id="5449588825071916739">Marcați toate filele</translation> <translation id="5449716055534515760">Închide fe&reastra</translation> +<translation id="545133051331995777">Nicio conexiune la rețea</translation> <translation id="5452446625764825792">Poți vedea fotografiile, conținutul media și aplicațiile recente ale telefonului</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (funcționează offline)</translation> <translation id="5454166040603940656">cu <ph name="PROVIDER" /></translation> @@ -4772,6 +4778,7 @@ <translation id="5487521232677179737">Șterge datele</translation> <translation id="5488093641312826914">Elementul „<ph name="COPIED_ITEM_NAME" />” a fost copiat</translation> <translation id="5488508217173274228">Opțiuni de criptare a sincronizării</translation> +<translation id="5489077378642700219">Nu permite notificările de la <ph name="WEBSITE" />, dar întreabă mai târziu</translation> <translation id="5489435190927933437">Parole salvate pentru <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Deconectează dispozitivul Bluetooth</translation> <translation id="5490798133083738649">Permite accesul Linux la microfon</translation> @@ -5109,6 +5116,7 @@ <translation id="5805697420284793859">Managerul de ferestre</translation> <translation id="5806447147478173900">Spațiul total de stocare folosit de site-urile afișate: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (prestabilit)</translation> +<translation id="5809835394668218762">Mai multe acțiuni pentru <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled trebuie să fie activat în chrome://flags</translation> <translation id="5810809306422959727">Acest cont nu este eligibil pentru controlul parental</translation> <translation id="5811614940486072060">Acest fișier nu este descărcat de obicei și poate fi periculos</translation> @@ -5123,6 +5131,7 @@ <translation id="5826395379250998812">Conectează-ți dispozitivul <ph name="DEVICE_TYPE" /> cu telefonul. <ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Semitransparent</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Afișează site-urile din același grup</translation> <translation id="5827733057563115968">Predicția cuvântului următor</translation> <translation id="5828545842856466741">Adaugă un profil...</translation> <translation id="5828633471261496623">Se printează...</translation> @@ -5238,6 +5247,7 @@ <translation id="5927232971138258197">Extensia poate să citească și să facă modificări la <ph name="HOST" /></translation> <translation id="592740088639760830">Oprește acest container</translation> <translation id="592880897588170157">Descarcă fișierele PDF în loc să le deschizi automat în Chrome</translation> +<translation id="5928969282301718193">Gata</translation> <translation id="592919310198008711">Când dau clic pe extensie</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> îți solicită să actualizezi imediat dispozitivul <ph name="DEVICE_TYPE" />.</translation> <translation id="5932224571077948991">Site-ul afișează anunțuri deranjante sau înșelătoare</translation> @@ -5411,6 +5421,7 @@ <translation id="6087746524533454243">Cauți pagina despre browser? Accesează</translation> <translation id="6087960857463881712">Față extraordinară</translation> <translation id="608912389580139775">Pentru a adăuga pagina în lista de lecturi, dă clic pe pictograma Marcaj</translation> +<translation id="6091116443517744502">Verifică-ți conexiunea la internet și încearcă din nou</translation> <translation id="6091761513005122595">Dispozitivul de stocare în rețea a fost montat.</translation> <translation id="6093803049406781019">Ștergeți profilul</translation> <translation id="6093888419484831006">Se anulează actualizarea...</translation> @@ -6075,6 +6086,7 @@ <translation id="6736243959894955139">Adresă</translation> <translation id="6737393581255281855">Ștergi datele afișate?</translation> <translation id="6737663862851963468">Elimină un tichet Kerberos</translation> +<translation id="6738180164164974883">Permite setarea cookie-urilor terță parte</translation> <translation id="6738430949033571771">Se realizează verificarea contului...</translation> <translation id="6739923123728562974">Afișează comanda rapidă pe desktop</translation> <translation id="6740234557573873150">Descărcarea fișierului <ph name="FILE_NAME" /> a fost întreruptă</translation> @@ -6272,6 +6284,7 @@ <translation id="691106080621596509">Astfel, se vor șterge toate datele și cookie-urile stocate de <ph name="SITE_GROUP_NAME" /> și de site-urile subordonate, precum și de aplicația instalată asociată</translation> <translation id="6911734910326569517">Memorie utilizată</translation> <translation id="6912007319859991306">Codul PIN al cardului SIM pentru rețeaua mobilă</translation> +<translation id="6912380255120084882">Încearcă alt dispozitiv</translation> <translation id="691289340230098384">Preferințe pentru subtitrări</translation> <translation id="6914783257214138813">Parolele vor fi vizibile pentru toți cei care pot vedea fișierul exportat.</translation> <translation id="6916590542764765824">Gestionează extensiile</translation> @@ -6582,6 +6595,7 @@ <translation id="7222204278952406003">Chrome este browserul prestabilit</translation> <translation id="7222232353993864120">Adresa de e-mail</translation> <translation id="7222235798733126207">Transfer limitat între site-uri</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{Un site din grupul <ph name="FPS_OWNER" />}few{{MEMBERS} site-uri din grupul <ph name="FPS_OWNER" />}other{{MEMBERS} de site-uri din grupul <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Folosește Windows Hello la completarea parolelor</translation> <translation id="7225179976675429563">Lipsește tipul de rețea</translation> <translation id="7227458944009118910">Și aplicațiile enumerate mai jos pot gestiona linkuri de protocol. Alte aplicații vor solicita permisiunea.</translation> @@ -7094,6 +7108,7 @@ <translation id="7709152031285164251">Nu a reușit – <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Proiectează…</translation> <translation id="7711900714716399411">Folosește un cablu USB pentru a conecta telefonul la computer. Dacă telefonul este deja conectat, deconectează-l și reconectează-l.</translation> +<translation id="7711968363685835633">Dezactivează conversiile și sugestiile personalizate, precum și dicționarul utilizatorului</translation> <translation id="7712739869553853093">Caseta de dialog pentru previzualizarea înainte de printare</translation> <translation id="7714307061282548371">Se permit cookie-urile de la <ph name="DOMAIN" /></translation> <translation id="7714464543167945231">Certificat</translation> @@ -7165,6 +7180,7 @@ <translation id="7768770796815395237">Modifică</translation> <translation id="7768784765476638775">Selectează și ascultă</translation> <translation id="7769748505895274502">Restrânge filele închise recent</translation> +<translation id="7770072242481632881">Selectorul panoului lateral</translation> <translation id="7770406201819593386">Rulează teste de diagnosticare pentru sistemul de operare Chrome Flex.</translation> <translation id="7770450735129978837">Clic pe butonul din dreapta al mouse-ului</translation> <translation id="7770612696274572992">Imagine copiată de pe alt dispozitiv</translation> @@ -7801,6 +7817,7 @@ <translation id="8353683614194668312">Permisiuni:</translation> <translation id="8354034204605718473">Codul PIN al copilului a fost adăugat</translation> <translation id="8356197132883132838"><ph name="TITLE" /> – <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Ai înregistrat deja acest dispozitiv. Nu trebuie să-l înregistrezi din nou.</translation> <translation id="8357388086258943206">A apărut o eroare la instalarea Linux</translation> <translation id="8358685469073206162">Restabiliți paginile?</translation> <translation id="8358912028636606457">Proiecția conținutului audio din filă nu este acceptată pe acest dispozitiv.</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 4feda185..7dbec397 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1891,6 +1891,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Контролируемые профили отключены администратором.</translation> <translation id="2722540561488096675">Устройство будет выключено через <ph name="TIME_LEFT" />. Прежде чем включать его снова, извлеките USB-накопитель. Затем вы сможете приступить к работе с <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">Идентификатор: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">Журналы WebRTC</translation> <translation id="272488616838512378">Преобразование единиц измерения</translation> <translation id="2725200716980197196">Подключение к сети восстановлено.</translation> @@ -3062,6 +3063,7 @@ <translation id="3828029223314399057">Искать в закладках</translation> <translation id="3828953470056652895">Я принимаю <ph name="BEGIN_LINK1" />Условия использования Google<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Дополнительные условия использования Chrome и Chrome OS<ph name="END_LINK2" /> и <ph name="BEGIN_LINK3" />Условия использования Google Play<ph name="END_LINK3" /></translation> <translation id="3829765597456725595">Общая папка SMB</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Администратор снова включил 1 потенциально опасное расширение.}one{Администратор снова включил {NUM_EXTENSIONS} потенциально опасное расширение.}few{Администратор снова включил {NUM_EXTENSIONS} потенциально опасных расширения.}many{Администратор снова включил {NUM_EXTENSIONS} потенциально опасных расширений.}other{Администратор снова включил {NUM_EXTENSIONS} потенциально опасного расширения.}}</translation> <translation id="3831436149286513437">Автозаполнение при поиске на Google Диске</translation> <translation id="3834728400518755610">Настройки микрофона были изменены. Чтобы продолжить, завершите работу Linux.</translation> @@ -5192,6 +5194,7 @@ <translation id="5884474295213649357">Эта вкладка подключена к USB-устройству</translation> <translation id="5885314688092915589">Этим профилем будет управлять ваша организация</translation> <translation id="5886009770935151472">1-й палец</translation> +<translation id="5886112770923972514">Подключать и быстро настраивать устройства поблизости с помощью функции "Быстрое подключение"</translation> <translation id="5886384907280980632">Отключить</translation> <translation id="5889282057229379085">Максимальное количество промежуточных ЦС: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Предпочитаемые сети Wi-Fi</translation> @@ -7789,6 +7792,7 @@ <translation id="8338952601723052325">Сайт разработчика</translation> <translation id="833986336429795709">Чтобы открыть ссылку, выберите приложение</translation> <translation id="8340547030807793004">Другие действия с устройством "<ph name="DEVICE" />"</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Проверьте <ph name="BEGIN_BOLD" />1 сайт<ph name="END_BOLD" />, который недавно отправлял много уведомлений}one{Проверьте <ph name="BEGIN_BOLD" />{NUM_SITES} сайт<ph name="END_BOLD" />, которые недавно отправляли много уведомлений}few{Проверьте <ph name="BEGIN_BOLD" />{NUM_SITES} сайта<ph name="END_BOLD" />, которые недавно отправляли много уведомлений}many{Проверьте <ph name="BEGIN_BOLD" />{NUM_SITES} сайтов<ph name="END_BOLD" />, которые недавно отправляли много уведомлений}other{Проверьте <ph name="BEGIN_BOLD" />{NUM_SITES} сайта<ph name="END_BOLD" />, которые недавно отправляли много уведомлений}}</translation> <translation id="8342221978608739536">Не знаю</translation> <translation id="8342861492835240085">Выберите коллекцию</translation> <translation id="8345848587667658367">Теперь вы можете просматривать недавние фотографии, медиафайлы, уведомления и приложения с телефона</translation> @@ -8787,6 +8791,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Создание безопасного подключения...</translation> <translation id="996803490569799917">Показывать воспоминания с выбранными вами людьми и не только</translation> +<translation id="997143476478634194">Когда вы посещаете сайты, эти настройки используются автоматически. Обычно сайты показывают уведомления, чтобы оповестить вас о сообщениях в чате или срочных новостях.</translation> <translation id="99731366405731005">Чтобы использовать функцию "Синхронизация Wi-Fi", включите <ph name="LINK1_BEGIN" />синхронизацию Chrome<ph name="LINK1_END" />. <ph name="LINK2_BEGIN" />Подробнее…<ph name="LINK2_END" /></translation> <translation id="998747458861718449">П&росмотреть код</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index 9dd06358..5166bec 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -277,6 +277,7 @@ <translation id="1244303850296295656">දිගු දෝෂය</translation> <translation id="1245628370644070008">දේශීය දත්ත ප්රතිසාධනය</translation> <translation id="1246863218384630739"><ph name="VM_NAME" /> ස්ථාපනය කළ නොහැකි විය: රූප URL <ph name="HTTP_ERROR" /> දෝෂ කේතයක් ලබා දුණි. කරුණාකර ඔබගේ පරිපාලක සම්බන්ධ කර ගන්න.</translation> +<translation id="1249818027270187058">{NUM_SITES,plural, =1{1 වෙබ් අඩවියක් සඳහා දැනුම්දීම්වලට ඉඩ නොදේ}one{වෙබ් අඩවි {NUM_SITES} ක් සඳහා දැනුම්දීම්වලට ඉඩ නොදේ}other{වෙබ් අඩවි {NUM_SITES} ක් සඳහා දැනුම්දීම්වලට ඉඩ නොදේ}}</translation> <translation id="1251366534849411931">අපේක්ෂිත විවෘත රැළි කඹය: <ph name="ERROR_LINE" /></translation> <translation id="1251480783646955802">මෙය වෙබ් අඩවිවලින් සහ ස්ථාපිත යෙදුම්වලින් ගබඩා කරනු ලැබූ දත්ත <ph name="TOTAL_USAGE" /> ක් හිස් කරයි</translation> <translation id="1251578593170406502">ජංගම දත්ත ජාල සඳහා ස්කෑන් කරමින්...</translation> @@ -1644,6 +1645,7 @@ <translation id="2476974672882258506"><ph name="PARALLELS_DESKTOP" /> අස්ථාපනය කිරීමට Windows වසන්න.</translation> <translation id="2477065602824695373">ඔබ ස්විච කිහිපයක් පිහිටවූ බැවින්, ස්වයංක්රිය ස්කෑන් කිරීම ක්රියාවිරහිත කර ඇත.</translation> <translation id="2478176599153288112">"<ph name="EXTENSION" />" සඳහා මාධ්යය-ගොනු බලතල</translation> +<translation id="24786041351753425">දත්ත ප්රතිසාධන සේවාව සබල කරන්න.</translation> <translation id="2480868415629598489">ඔබ පිටපත් කරන සහ අලවන දත්ත වෙනස් කරන්න</translation> <translation id="2482878487686419369">දැනුම්දීම්</translation> <translation id="2482895651873876648">ටැබය <ph name="GROUP_NAME" /> සමූහය වෙත ගෙන යන ලදි - <ph name="GROUP_CONTENTS" /></translation> @@ -2258,6 +2260,7 @@ <translation id="3024374909719388945">පැය 24 ඔරලෝසුව භාවිතා කරන්න</translation> <translation id="3027296729579831126">ළඟ බෙදා ගැනීම සක්රීය කරන්න</translation> <translation id="3029466929721441205">අල්මාරිය තුළ පන්හිඳ මෙවලම් පෙන්වන්න</translation> +<translation id="3029808567601324798">අඟුලු දැමීමට කාලයයි</translation> <translation id="3030311804857586740">{NUM_DAYS,plural, =1{<ph name="MANAGER" /> හට ඔබ අද යාවත්කාලීනයක් බාගැනීමට අවශ්යයි. ඔබ අන්තර්ජාලයට සම්බන්ධ වන විට යාවත්කාලීනය ස්වයංක්රියව බාගනු ඇත.}one{<ph name="MANAGER" /> හට නියමිත වේලාවට පෙර ඔබ යාවත්කාලීනයක් බාගැනීම අවශ්යයි. ඔබ අන්තර්ජාලයට සම්බන්ධ වන විට යාවත්කාලීනය ස්වයංක්රියව බාගනු ඇත.}other{<ph name="MANAGER" /> හට නියමිත වේලාවට පෙර ඔබ යාවත්කාලීනයක් බාගැනීම අවශ්යයි. ඔබ අන්තර්ජාලයට සම්බන්ධ වන විට යාවත්කාලීනය ස්වයංක්රියව බාගනු ඇත.}}</translation> <translation id="3030967311408872958">හිරු බැසීමේ සිට හිරු නැගීම</translation> <translation id="3031417829280473749">X ඒජන්ත</translation> @@ -4201,6 +4204,7 @@ <translation id="4901154724271753917">මෑතක දී වසා දැමූ ඒවා පුළුල් කරන්න</translation> <translation id="4901309472892185668"><ph name="EXPERIMENT_NAME" /> අත්හදා බැලීම සඳහා අත්හදා බැලීමේ තත්ත්වය තෝරන්න.</translation> <translation id="49027928311173603">සේවාදායකයෙන් බාගත් ප්රතිපත්තිය අවලංගුයි: <ph name="VALIDATION_ERROR" />.</translation> +<translation id="4903967893652864401">මෙය පසුබිම් ක්රියාකාරකම් සහ සුමට අනුචලනය වැනි දෘශ්ය ප්රයෝග සීමා කිරීමෙන් බැටරි බලය දිගු කරයි.</translation> <translation id="4906490889887219338">ජාල ගොනු බෙදා ගැනීම් සකසන්න කළමනා කරන්න. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation> <translation id="4907129260985716018">මෙම දිගුවට ඔබේ අඩවි දත්ත කියවීමට සහ වෙනස් කිරීමට හැකි විට අවස්ථාව තෝරන්න</translation> <translation id="4907161631261076876">මෙම ගොනුව සුලබව බාගැනීම සිදු නොකරන අතර අනතුරුදායක විය හැක.</translation> @@ -5302,6 +5306,7 @@ <translation id="5971037678316050792">Bluetooth ඇඩැප්ටර තත්වය හා යුගල කිරීම</translation> <translation id="597235323114979258">තවත් ගමනාන්ත බලන්න</translation> <translation id="5972543790327947908">සමහර සහාය දක්වන සබැඳි තවම <ph name="APP_NAME" />, <ph name="APP_NAME_2" /> හෝ <ph name="APP_NAME_3" /> තුළ විවෘතව තිබෙනු ඇත.</translation> +<translation id="5972559880616357748"><ph name="SITE_GROUP" /> සඳහා තවත් ක්රියා</translation> <translation id="5972666587303800813">ඇතුළු නොවීම් සේවය</translation> <translation id="5972708806901999743">මුදුනට ගෙන යන්න</translation> <translation id="5972826969634861500">ආරම්භ කරන්න <ph name="PRODUCT_NAME" /></translation> @@ -8478,6 +8483,7 @@ <translation id="8987927404178983737">මාසය</translation> <translation id="8989359959810288806">ටෙදරින් තත්ත්වය නැවුම් කරන්න</translation> <translation id="8991520179165052608">අඩවියට ඔබේ මයික්රෆෝනය භාවිත කළ හැකිය</translation> +<translation id="8993059306046735527">ඔබට ඔබේ <ph name="DEVICE_TYPE" /> මුරපදය අමතක වුවහොත්, ඔබට තවමත් ඔබේ ස්ථානික දත්ත ප්රතිසාධන කළ හැක. ඔබට ඔබේ Google ගිණුමට පුරනය වීමට හෝ ගිණුම් ප්රතිසාධනය භාවිත කිරීමට අවශ්ය වෙයි.</translation> <translation id="899384117894244799">සීමා කළ පරිශීලකයා ඉවත් කරන්න</translation> <translation id="899403249577094719">Netscape සහතික මත පදනම් වූ URL</translation> <translation id="899657321862108550">ඔබේ Chrome, සැම තැනම</translation> @@ -8577,6 +8583,7 @@ <translation id="9078316009970372699">ක්ෂණික ටෙදරින් අබල කරන්න</translation> <translation id="9078842827190780028">පැති පැනලයේ තව සෙවීම් ප්රතිඵල බලන්න</translation> <translation id="9079267182985899251">ළඟදීම මෙම විකල්පය තවදුරටත් සහාය නොදක්වනු ඇත. ටැබයක් ඉදිරිපත් කිරීමට, <ph name="GOOGLE_MEET" /> භාවිත කරන්න.</translation> +<translation id="9080175821499742274">මතක සුරකිනය අක්රිය පටිතිවලින් මතකය නිදහස් කරන නිසා එය සක්රිය පටිති සහ වෙනත් යෙදුම් මගින් භාවිත කරනු ලැබිය හැක</translation> <translation id="9080971985541434310">ඔබගේ ලැදිකම් තක්සේරු කරන්න - Chrome හට ඔබගේ ලැදිකම් තක්සේරු කළ හැකිය</translation> <translation id="9081543426177426948">ඔබ පිවිසෙන අඩවි අප්රසිද්ධ ප්රකාරයේදී සුරකිනු නොලැබේ.</translation> <translation id="9084064520949870008">කවුළුවක් සේ විවෘත කරන්න</translation> @@ -8766,6 +8773,7 @@ <translation id="964790508619473209">තිර පිළියෙළ</translation> <translation id="965211523698323809">ඔබේ <ph name="DEVICE_TYPE" /> වෙතින් පාඨ පණිවුඩ යවන්න සහ ලබන්න. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation> <translation id="96535553604365597">Google Cast සමගින් වන ගැටලුවක් වාර්තා කරන්න</translation> +<translation id="965470117154635268">{NUM_SITES,plural, =1{මෑතදී බොහෝ දැනුම්දීම් එවූ 1 වෙබ් අඩවියක් සමාලෝචන කරන්න}one{මෑතදී බොහෝ දැනුම්දීම් එවූ වෙබ් අඩවි {NUM_SITES} ක් සමාලෝචන කරන්න}other{මෑතදී බොහෝ දැනුම්දීම් එවූ වෙබ් අඩවි {NUM_SITES} ක් සමාලෝචන කරන්න}}</translation> <translation id="967398046773905967">කිසිඳු වෙබ් අඩවියකට HID උපාංග වෙත ප්රවේශ වීමට ඉඩ නොදෙන්න</translation> <translation id="967624055006145463">දත්ත ගබඩා කර ඇත</translation> <translation id="96774243435178359">කළමනාකරණය කෙරෙන මුද්රණ යන්ත්ර</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index ec21001..b993fd4 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">Vytvorené</translation> <translation id="1067661089446014701">Heslá v zariadení môžete zašifrovať ešte pred ich uložením do účtu Google, čím zvýšite bezpečnosť</translation> <translation id="1067922213147265141">Ďalšie služby Googlu</translation> +<translation id="1069104208554708737">Tento prístupový kľúč bude uložený iba v tomto zariadení</translation> <translation id="1069355737714877171">Odstrániť profil eSIM karty s názvom <ph name="PROFILE_NAME" /></translation> <translation id="1069814191880976658">Vybrať inú obrazovku</translation> <translation id="1070377999570795893">Iný program v počítači pridal rozšírenie, ktoré môže zmeniť spôsob fungovania prehliadača Chrome. @@ -349,6 +350,7 @@ <translation id="1324106254079708331">Zabezpečuje ochranu všetkých osobných účtov Google, ktorým hrozia cielené útoky</translation> <translation id="1327272175893960498">Tikety Kerberos</translation> <translation id="1327495825214193325">Ak chcete aktivovať ladenie ADB, musíte reštartovať toto zariadenie <ph name="DEVICE_TYPE" />. Jeho deaktivácia vyžaduje obnovenie výrobných nastavení.</translation> +<translation id="1327527584824210101">Použite svoj prístupový kľúč</translation> <translation id="1327794256477341646">Funkcie vyžadujúce vašu polohu nebudú fungovať</translation> <translation id="1331977651797684645">To som bol(a) ja.</translation> <translation id="1333489022424033687">Niektoré funkcie na <ph name="ORIGIN" /> nemusia fungovať, dokým nevymažete dáta, ktoré ostatné weby uložili v zariadení</translation> @@ -409,6 +411,7 @@ <translation id="139013308650923562">Weby s povolením používať písma nainštalované v zariadení</translation> <translation id="1390548061267426325">Otvoriť ako bežnú kartu</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> nemá oprávnenie tlačiť v zariadení <ph name="PRINTER_NAME" />. Kontaktujte správcu.</translation> +<translation id="1392047138650695757">Používateľské slovníky</translation> <translation id="1393283411312835250">Slnko a mraky</translation> <translation id="1395730723686586365">Služba Updater bola spustená</translation> <translation id="1395832189806039783">Zvýrazňovať položky pomocou označenia klávesnice</translation> @@ -1518,6 +1521,7 @@ <translation id="2356070529366658676">Opýtať sa</translation> <translation id="2357330829548294574">Odobrať používateľa <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Weby môžu používať JavaScript</translation> +<translation id="2358703245148663432">Iné zariadenie</translation> <translation id="2358777858338503863">Kliknutím povolíte prístup na <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Aplikácie pre Linux nemusia reagovať.</translation> <translation id="2359345697448000899">Ak chcete spravovať rozšírenia, kliknite na možnosť Rozšírenia v ponuke Nástroje.</translation> @@ -1878,6 +1882,7 @@ <translation id="271033894570825754">Nové</translation> <translation id="2711073837061989559">Skúšobné obdobia</translation> <translation id="2712173769900027643">Požiadať o povolenie</translation> +<translation id="2712207122921938368">Vytvorte prístupový kľúč v inom zariadení</translation> <translation id="2713106313042589954">Vypnúť kameru</translation> <translation id="2713444072780614174">Biela</translation> <translation id="2714393097308983682">Obchod Google Play</translation> @@ -2390,6 +2395,7 @@ <translation id="3182749001423093222">Kontrola pravopisu</translation> <translation id="3183139917765991655">Profile Importer</translation> <translation id="3183143381919926261">Mobilné dátové siete</translation> +<translation id="3183613134231754987">Tento prístupový kľúč bude uložený iba vo funkcii Windows Hello. Po zavretí všetkých okien inkognito zostane v tomto zariadení.</translation> <translation id="3183944777708523606">Usporiadanie monitora</translation> <translation id="3184536091884214176">Nastaviť alebo spravovať tlačiarne CUPS. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{Táto aplikácia je blokovaná}few{Niektoré aplikácie sú blokované}many{Niektoré aplikácie sú blokované}other{Niektoré aplikácie sú blokované}}</translation> @@ -2871,6 +2877,7 @@ <translation id="3654045516529121250">Čítať nastavenia dostupnosti</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Aplikácia má trvalý prístup k jednému súboru.}few{Aplikácia má trvalý prístup k # súborom.}many{Aplikácia má trvalý prístup k # súboru.}other{Aplikácia má trvalý prístup k # súborom.}}</translation> <translation id="3658871634334445293">Akcelerácia zariadenia TrackPoint</translation> +<translation id="3659550105763988702">Použite svoj prístupový kľúč pre aplikáciu <ph name="APP_NAME" /></translation> <translation id="3659929705630080526">Príliš veľakrát ste zadali nesprávny prístupový kód. Skúste to neskôr</translation> <translation id="3660234220361471169">Nedôveryhodné</translation> <translation id="3664511988987167893">Ikona rozšírenia</translation> @@ -3145,6 +3152,7 @@ <translation id="3898327728850887246"><ph name="SITE_NAME" /> vyžaduje povolenia <ph name="FIRST_PERMISSION" /> a <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">Výber klávesnice</translation> <translation id="3900966090527141178">Exportovanie hesiel</translation> +<translation id="3902789559055749153">Vyberte, ako chcete vytvoriť prístupový kľúč pre aplikáciu <ph name="APP_NAME" /></translation> <translation id="3903187154317825986">Vstavaná klávesnica</translation> <translation id="3904326018476041253">Služby určovania polohy</translation> <translation id="3904849010307028014">Na základe vašej interakcie s určitým webom, ako je pravidelné prihlasovanie sa do účtu, môže daný web vydať vášmu prehliadaču token dôveryhodnosti. Ak neskôr ďalšie weby, ktoré navštívite, skontrolujú a nájdu platný token dôveryhodnosti, budú vás s vyššou pravdepodobnosťou považovať za osobu a nie robota.</translation> @@ -3474,6 +3482,7 @@ <translation id="4218081191298393750">Ak chcete vypnúť zvuk tejto karty, kliknite na ikonu reproduktora</translation> <translation id="4219558185499589032">Box</translation> <translation id="4220648711404560261">Počas aktivácie sa vyskytla chyba.</translation> +<translation id="4223845867739585293">Vytvorte prístupový kľúč</translation> <translation id="4225397296022057997">Na všetkých weboch</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Toto rozšírenie nie je povolené}few{Niektoré rozšírenia nie sú povolené}many{Niektoré rozšírenia nie sú povolené}other{Niektoré rozšírenia nie sú povolené}}</translation> <translation id="4231095370974836764">Nainštalujte si aplikácie a hry zo služby Google Play v zariadení <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Ďalšie informácie<ph name="LINK_END" /></translation> @@ -4116,6 +4125,7 @@ <translation id="4838907349371614303">Heslo bolo aktualizované</translation> <translation id="4838958829619609362">Výber nie je v jazyku <ph name="LANGUAGE" /></translation> <translation id="4839303808932127586">Uložiť &video ako...</translation> +<translation id="4839910546484524995">Kontrola zariadenia</translation> <translation id="4840096453115567876">Naozaj chcete ukončiť režim inkognito?</translation> <translation id="4841741146571978176">Povinný virtuálny počítač neexistuje. Pokračujte nastavením virtuálneho počítača <ph name="VM_TYPE" />.</translation> <translation id="4842976633412754305">Táto stránka sa snaží načítať skripty z neoverených zdrojov.</translation> @@ -5035,6 +5045,7 @@ <translation id="5729712731028706266">&Zobraziť</translation> <translation id="5731247495086897348">Prilepiť a &otvoriť</translation> <translation id="5732392974455271431">Vaši rodičia ho môžu pre vás odblokovať</translation> +<translation id="5733109311583381874">Ak chcete prispôsobiť kandidátov konverzie, pridajte do používateľského slovníka vlastné slová.</translation> <translation id="5733866499231170760">Neplatný identifikátor. Zadaný formát je nesprávny. Prezrite si pokyny, ktoré ste dostali, a uistite sa tak, že identifikátor zadávate v správnom formáte. Ak tento problém neviete vyriešiť, ponechajte pole prázdne a pokračujte s inštaláciou.</translation> <translation id="5734362860645681824">Komunikácia</translation> <translation id="5734697361979786483">Pridať zdieľanie súboru</translation> @@ -5146,6 +5157,7 @@ <translation id="583431638776747">Web bol nedostupný</translation> <translation id="5834581999798853053">Zostáva približne <ph name="TIME" /> min.</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Kamera alebo mikrofón zaznamenáva obsah</translation> +<translation id="5835625581856809102">Naskenujte tento QR kód pomocou zariadenia, v ktorom chcete vytvoriť prístupový kľúč pre aplikáciu <ph name="APP_NAME" /></translation> <translation id="583673505367439042">Weby môžu žiadať o úpravu súborov a priečinkov v zariadení</translation> <translation id="5836999627049108525">Jazyk, z ktorého chcete prekladať</translation> <translation id="583756221537636748">Puzdro</translation> @@ -5386,6 +5398,7 @@ <translation id="6059276912018042191">Nedávne karty Chromu</translation> <translation id="6059652578941944813">Hierarchia certifikátu</translation> <translation id="6059925163896151826">Zariadenia USB</translation> +<translation id="6061408389284235459">Upozornenie bolo odoslané do zariadenia <ph name="DEVICE_NAME" /></translation> <translation id="6063284707309177505">Vytvoriť QR kód</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />Poznámka:<ph name="END_BOLD" /> K osobným výsledkom dieťaťa <ph name="SUPERVISED_USER_NAME" /> je možné získať prístup podobným hlasom alebo jeho nahrávkou. Ak chcete šetriť batériu, môžete v nastaveniach Asistenta dieťaťa <ph name="SUPERVISED_USER_NAME" /> vybrať, aby bolo rozpoznávanie výrazu „Hey Google“ zapnuté iba vtedy, keď je toto zariadenie pripojené k napájaciemu zdroju.</translation> <translation id="6064217302520318294">Zámka obrazovky</translation> @@ -5514,6 +5527,7 @@ <translation id="6178664161104547336">Vybrať certifikát</translation> <translation id="6178682841350631965">Vaše prihlasovacie údaje boli aktualizované</translation> <translation id="6180510783007738939">Nástroj na kreslenie čiar</translation> +<translation id="6180550893222597997">Ktorý prístupový kľúč chcete používať pre aplikáciu <ph name="APP_NAME" />?</translation> <translation id="6181431612547969857">Stiahnutie bolo zablokované</translation> <translation id="6184099524311454384">Vyhľadajte karty</translation> <translation id="6185132558746749656">Poloha zariadenia</translation> @@ -5953,6 +5967,7 @@ <translation id="6596816719288285829">Adresa IP</translation> <translation id="6597017209724497268">Vzorky</translation> <translation id="6597331566371766302">Váš správca zablokoval nasledujúce rozšírenia:</translation> +<translation id="6601262427770154296">Spravovať používateľské slovníky</translation> <translation id="6601612474695404578">Niektoré weby načítavajú svoje stránky pomocou súborov cookie tretích strán. Ak web nefunguje, môžete skúsiť povoliť súbory cookie.</translation> <translation id="6602937173026466876">Prístup k vašim tlačiarňam</translation> <translation id="6602956230557165253">Navigujte pomocou klávesov doľava a doprava.</translation> @@ -6318,6 +6333,7 @@ <translation id="6943060957016121200">Povoliť dynamický tethering</translation> <translation id="6943176775188458830">Zrušiť tlač</translation> <translation id="6943939122536910181">Odpojené od siete <ph name="DEVICE" /></translation> +<translation id="6944708469742828051">Tento prístupový kľúč bude uložený iba vo funkcii Windows Hello</translation> <translation id="6945221475159498467">Vybrať</translation> <translation id="694592694773692225">Presmerovanie bolo zablokované na tejto stránke.</translation> <translation id="6947015141909171112">Zobrazujú sa recepty na základe vašej nedávnej aktivity vyhľadávania receptov. @@ -6570,6 +6586,7 @@ <translation id="7193051357671784796">Túto aplikáciu pridala vaša organizácia. Ak chcete dokončiť jej inštaláciu, reštartujte ju.</translation> <translation id="7193374945610105795">Žiadne uložené heslá pre <ph name="ORIGIN" /></translation> <translation id="7194873994243265344">Vaša organizácia tento súbor zablokovala, pretože je šifrovaný. Požiadajte vlastníka, aby ho dešifroval.</translation> +<translation id="7196272782924897510">Chcete použiť prístupový kľúč z iného zariadenia?</translation> <translation id="7196913789568937443">Zálohovanie na Disk Google. Jednoducho kedykoľvek obnovte svoje údaje alebo prejdite na iné zariadenie. Záloha obsahuje dáta aplikácií. Zálohy sa nahrajú do Googlu a zašifrujú pomocou vášho hesla účtu Google. <ph name="BEGIN_LINK1" />Ďalšie informácie<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Získajte Vyhľadávanie Google a funkcie Googlu pri každom prehliadaní</translation> <translation id="719791532916917144">Klávesová skratka</translation> @@ -7068,6 +7085,7 @@ <translation id="7670483791111801022">Titulky</translation> <translation id="7671130400130574146">Použiť záhlavie a orámovanie okna systému</translation> <translation id="767127784612208024">Resetovanie potvrďte stlačením</translation> +<translation id="7672504401554182757">Vyberte, ktoré zariadenie má prístupový kľúč pre aplikáciu <ph name="APP_NAME" /></translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" /> na stránke <ph name="PAGE_TITLE" />.</translation> <translation id="7674416868315480713">Deaktivovať všetky porty presmerované v systéme Linux</translation> <translation id="7674537509496907005">Aplikácie: <ph name="APP_COUNT" /></translation> @@ -7178,6 +7196,7 @@ <translation id="7766807826975222231">Spustiť prehliadku</translation> <translation id="7766838926148951335">Prijať povolenia</translation> <translation id="7767554953520855281">Podrobnosti sú počas zdieľania obrazovky skryté</translation> +<translation id="7767972280546034736">Vytvorte prístupový kľúč pre aplikáciu <ph name="APP_NAME" /></translation> <translation id="7768507955883790804">Weby sa automaticky riadia týmto nastavením, keď ich navštívite</translation> <translation id="7768526219335215384"><ph name="ORIGIN" /> bude môcť čítať súbory v priečinku <ph name="FOLDERNAME" />.</translation> <translation id="7768770796815395237">Zmeniť</translation> @@ -7667,6 +7686,7 @@ <translation id="820568752112382238">Najnavštevovanejšie weby</translation> <translation id="8206745257863499010">Bluesový</translation> <translation id="8206859287963243715">Mobilné</translation> +<translation id="8207404892907560325">Výber prístupového kľúča</translation> <translation id="8208216423136871611">Neuložiť</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Nové upozornenie}few{# nové upozornenia}many{# new notifications}other{# nových upozornení}}</translation> <translation id="821119981794423735">Ak chcete importovať heslá do Správcu hesiel Google pre účet <ph name="USER_EMAIL" />, vyberte súbor CSV</translation> @@ -7840,6 +7860,7 @@ <translation id="8376137163494131156">Informujte nás, čo sa deje so zariadením Google Cast.</translation> <translation id="8376384591331888629">Vrátane súborov cookie tretích strán na tomto webe</translation> <translation id="8376451933628734023">Ak sa vás táto webová aplikácia snaží presvedčiť, že nie je tá, za ktorú ju pokladáte, odinštalujte ju.</translation> +<translation id="8377625247046155446">Tento prístupový kľúč bude uložený iba v tomto zariadení. Po zavretí všetkých okien inkognito zostane v tomto zariadení.</translation> <translation id="8378714024927312812">Spravované vašou organizáciou</translation> <translation id="8379156816349755485">Po prihlásení dôjde k uloženiu jedinečného overovacieho tokenu, ktorý sa bude používať v prípade budúcich vhodných sťahovaní.</translation> <translation id="8379878387931047019">Toto zariadenie nepodporuje typ bezpečnostného kľúča požadovaného týmto webom</translation> @@ -8672,6 +8693,7 @@ <ph name="LIST_ITEM" />spustiť Diagnostiku pripojenia Chrome. <ph name="END_LIST" /></translation> <translation id="916607977885256133">Obraz v obraze</translation> +<translation id="9166253503936244008">Naskenujte tento QR kód zariadením s prístupovým kľúčom, ktorý chcete použiť pre aplikáciu <ph name="APP_NAME" /></translation> <translation id="9167063903968449027">Zobraziť čitateľský zoznam</translation> <translation id="9167450455589251456">Profil nie je podporovaný</translation> <translation id="9168436347345867845">Neskôr</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index ade4adc8..c2f8565 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">Napravljeno</translation> <translation id="1067661089446014701">Radi dodatne zaštite možete da šifrujete lozinke na uređaju pre nego što se sačuvaju na Google nalogu</translation> <translation id="1067922213147265141">Druge Google usluge</translation> +<translation id="1069104208554708737">Ovaj pristupni kôd će se sačuvati samo na ovom uređaju</translation> <translation id="1069355737714877171">Uklonite eSIM profil <ph name="PROFILE_NAME" /></translation> <translation id="1069814191880976658">Odaberi drugi ekran</translation> <translation id="1070377999570795893">Drugi program na računaru je dodao dodatak koji može da promeni način na koji Chrome funkcioniše. @@ -349,6 +350,7 @@ <translation id="1324106254079708331">Predostrožno štiti lične Google naloge svih korisnika ugroženih ciljanim napadima</translation> <translation id="1327272175893960498">Kerberos tiketi</translation> <translation id="1327495825214193325">Da biste omogućili ADB otklanjanje grešaka, morate da restartujete ovaj <ph name="DEVICE_TYPE" />. Da biste ga onemogućili, moraćete da resetujete uređaj na fabrička podešavanja.</translation> +<translation id="1327527584824210101">Koristite pristupni kôd</translation> <translation id="1327794256477341646">Funkcije kojima je potrebna vaša lokacija neće raditi</translation> <translation id="1331977651797684645">To sam ja.</translation> <translation id="1333489022424033687">Neke funkcije na <ph name="ORIGIN" /> možda neće raditi dok ne obrišete podatke koje su drugi sajtovi sačuvali na uređaju</translation> @@ -409,6 +411,7 @@ <translation id="139013308650923562">Imaju dozvolu da koriste fontove instalirane na uređaju</translation> <translation id="1390548061267426325">Otvori kao uobičajenu karticu</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> nema ovlašćenje da štampa na: <ph name="PRINTER_NAME" />. Obratite se administratoru.</translation> +<translation id="1392047138650695757">Korisnički rečnici</translation> <translation id="1393283411312835250">Sunce i oblaci</translation> <translation id="1395730723686586365">Program za ažuriranje je pokrenut</translation> <translation id="1395832189806039783">Istaknite stavku pomoću fokusa tastature</translation> @@ -1241,6 +1244,7 @@ <translation id="2135787500304447609">&Nastavi</translation> <translation id="2136372518715274136">Unesite novu lozinku</translation> <translation id="2136476978468204130">Pristupna fraza koju ste uneli je netačna</translation> +<translation id="2137128126782078222">Ne dozvoljavajte obaveštenja sa <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Čeka se dozvola…</translation> <translation id="2139919072249842737">Dugme za podešavanje</translation> <translation id="2140788884185208305">Stanje baterije</translation> @@ -1514,6 +1518,7 @@ <translation id="2356070529366658676">Pitaj</translation> <translation id="2357330829548294574">Uklonite korisnika <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Sajtovi mogu da koriste JavaScript</translation> +<translation id="2358703245148663432">Drugi uređaj</translation> <translation id="2358777858338503863">Kliknite da biste dozvolili na <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux aplikacije mogu da prestanu da reaguju.</translation> <translation id="2359345697448000899">Upravljajte dodacima klikom na stavku Dodaci u meniju Alatke.</translation> @@ -1874,6 +1879,7 @@ <translation id="271033894570825754">Novo</translation> <translation id="2711073837061989559">Probe</translation> <translation id="2712173769900027643">Zatraži dozvolu</translation> +<translation id="2712207122921938368">Napravite pristupni kôd na drugom uređaju</translation> <translation id="2713106313042589954">Isključi kameru</translation> <translation id="2713444072780614174">Bela</translation> <translation id="2714393097308983682">Google Play prodavnica</translation> @@ -1888,6 +1894,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Administrator je onemogućio korisnike pod nadzorom.</translation> <translation id="2722540561488096675">Uređaj će se isključiti za <ph name="TIME_LEFT" />. Uklonite USB pre nego što ponovo uključite uređaj. Onda možete da počnete da koristite <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">ID: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC evidencije</translation> <translation id="272488616838512378">Konverzija jedinica</translation> <translation id="2725200716980197196">Veza sa mrežom je ponovo uspostavljena</translation> @@ -2385,6 +2392,7 @@ <translation id="3182749001423093222">Provera pravopisa</translation> <translation id="3183139917765991655">Uvoz profila</translation> <translation id="3183143381919926261">Mobilne mreže za prenos podataka</translation> +<translation id="3183613134231754987">Ovaj pristupni kôd će se sačuvati samo u funkciji Windows Hello. On će ostati na ovom uređaju kada zatvorite sve prozore bez arhiviranja.</translation> <translation id="3183944777708523606">Raspored monitora</translation> <translation id="3184536091884214176">Podesite CUPS štampače ili upravljajte njima. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{Ova aplikacija je blokirana}one{Neke aplikacije su blokirane}few{Neke aplikacije su blokirane}other{Neke aplikacije su blokirane}}</translation> @@ -2475,6 +2483,7 @@ <translation id="3281892622610078515">Datoteke i programi koji treba da se stave u karantin:</translation> <translation id="3282210178675490297">Kartica se deli sa aplikacijom <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Nova &kartica</translation> +<translation id="3285500645985761267">Dozvolite srodnim sajtovima da vide vaše aktivnosti u grupi</translation> <translation id="328571385944182268">Želite li da sačuvate lozinke?</translation> <translation id="3288047731229977326">Dodaci pokrenuti u režimu programera mogu da naškode računaru. Ako niste programer, trebalo bi da onemogućite ove dodatke pokrenute u režimu programera da biste se zaštitili.</translation> <translation id="3289668031376215426">Automatsko pisanje velikih početnih slova</translation> @@ -2749,6 +2758,7 @@ <translation id="3541823293333232175">Dodeljeno</translation> <translation id="3543393733900874979">Ažuriranje nije uspelo (greška: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">Potpis X9.62 ECDSA putem SHA-512</translation> +<translation id="3544058026430919413">Preduzeće može da definiše grupu sajtova koji mogu da koriste kolačiće da bi delili aktivnosti u grupi. Ovo je isključeno u režimu bez arhiviranja.</translation> <translation id="3544879808695557954">Korisničko ime (opcionalno)</translation> <translation id="354602065659584722">Štetan softver je uklonjen</translation> <translation id="3547954654003013442">Podešavanja proksija</translation> @@ -2864,6 +2874,7 @@ <translation id="3654045516529121250">Čitanje podešavanja pristupačnosti</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Ima stalan pristup jednoj datoteci.}one{Ima stalan pristup # datoteci.}few{Ima stalan pristup za # datoteke.}other{Ima stalan pristup za # datoteka.}}</translation> <translation id="3658871634334445293">Ubrzanje TrackPoint-a</translation> +<translation id="3659550105763988702">Koristite pristupni kôd za aplikaciju <ph name="APP_NAME" /></translation> <translation id="3659929705630080526">Previše puta ste uneli netačan pristupni kôd. Probajte ponovo kasnije.</translation> <translation id="3660234220361471169">Nepouzdani</translation> <translation id="3664511988987167893">Ikona dodatka</translation> @@ -2887,6 +2898,7 @@ <translation id="3681548574519135185">Prsten za fokusiranje</translation> <translation id="3683524264665795342">Zahtev za deljenje ekrana aplikacije <ph name="APP_NAME" /></translation> <translation id="3685598397738512288">Podešavanja USB-a za Linux</translation> +<translation id="3687598459967813435">Uvek dozvoljavajte obaveštenja sa <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Došlo je do greške pri pokušaju upisivanja datoteke: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Upisivanje u datoteke i direktorijume koje otvorite u aplikaciji</translation> <translation id="3688526734140524629">Promeni kanal</translation> @@ -3004,7 +3016,7 @@ <translation id="3788331399335602504">ovi fajlovi</translation> <translation id="3788401245189148511">Mogli bi da:</translation> <translation id="3789841737615482174">Instaliraj</translation> -<translation id="3790417903123637354">Nešto nije u redu. Probajte ponovo kasnije</translation> +<translation id="3790417903123637354">Došlo je do greške. Probajte ponovo kasnije</translation> <translation id="379082410132524484">Kartica je istekla</translation> <translation id="3792973596468118484">Dodataka: <ph name="NUM_EXTENSIONS" /></translation> <translation id="3793588272211751505">{NUM_DAYS,plural, =1{Chrome nije pronašao štetan softver na računaru • Provereno pre 1 dan}one{Chrome nije pronašao štetan softver na računaru • Provereno pre {NUM_DAYS} dan}few{Chrome nije pronašao štetan softver na računaru • Provereno pre {NUM_DAYS} dana}other{Chrome nije pronašao štetan softver na računaru • Provereno pre {NUM_DAYS} dana}}</translation> @@ -3059,6 +3071,7 @@ <translation id="3828029223314399057">Pretraži obeleživače</translation> <translation id="3828953470056652895">Pročitao/la sam i prihvatam <ph name="BEGIN_LINK1" />Google uslove korišćenja usluge<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />dodatne uslove korišćenja usluge za Chrome i Chrome OS<ph name="END_LINK2" /> i <ph name="BEGIN_LINK3" />uslove korišćenja usluge Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">Deljenje SMB datoteka</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Administrator je ponovo uključio 1 potencijalno štetan dodatak}one{Administrator je ponovo uključio {NUM_EXTENSIONS} potencijalno štetan dodatak}few{Administrator je ponovo uključio {NUM_EXTENSIONS} potencijalno štetna dodatka}other{Administrator je ponovo uključio {NUM_EXTENSIONS} potencijalno štetnih dodataka}}</translation> <translation id="3831436149286513437">Predlozi za pretragu Google diska</translation> <translation id="3834728400518755610">Promena podešavanja mikrofona zahteva isključivanje Linux-a. Isključite Linux da biste nastavili.</translation> @@ -3136,6 +3149,7 @@ <translation id="3898327728850887246"><ph name="SITE_NAME" /> želi da: <ph name="FIRST_PERMISSION" /> i <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">Izaberite tastaturu</translation> <translation id="3900966090527141178">Izvezite lozinke</translation> +<translation id="3902789559055749153">Odaberite kako želite da napravite pristupni kôd za aplikaciju <ph name="APP_NAME" /></translation> <translation id="3903187154317825986">Ugrađena tastatura</translation> <translation id="3904326018476041253">Usluge lokacije</translation> <translation id="3904849010307028014">Taj sajt može da izda pouzdan token za pregledač na osnovu vaše interakcije sa sajtom, poput redovnog prijavljivanja na nalog. Ako drugi sajtovi koje posećujete kasnije potraže i pronađu važeći pouzdani token, veća je verovatnoća da će vas tretirati kao osobu, a ne kao robota.</translation> @@ -3465,6 +3479,7 @@ <translation id="4218081191298393750">Kliknite na ikonu zvučnika da biste isključili zvuk za ovu karticu</translation> <translation id="4219558185499589032">Box</translation> <translation id="4220648711404560261">Došlo je do greške pri aktivaciji.</translation> +<translation id="4223845867739585293">Napravite pristupni kôd</translation> <translation id="4225397296022057997">Na svim sajtovima</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Ovaj dodatak nije dozvoljen}one{Neki dodaci nisu dozvoljeni}few{Neki dodaci nisu dozvoljeni}other{Neki dodaci nisu dozvoljeni}}</translation> <translation id="4231095370974836764">Instalirajte aplikacije i igre sa Google Play-a na uređaju <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> @@ -4045,6 +4060,7 @@ <translation id="4779766576531456629">Preimenujte mobilnu mrežu za eSIM</translation> <translation id="4780321648949301421">Sačuvaj stranicu kao...</translation> <translation id="4781443161433589743">Vi koristite najjaču Chrome zaštitu</translation> +<translation id="4781584184731045253">Obriši podatke i dozvole</translation> <translation id="4782861709165039462">Prekidač za hardver uređaja je onemogućio sve mikrofone</translation> <translation id="4785719467058219317">Koristite bezbednosni ključ koji nije registrovan za ovaj veb-sajt</translation> <translation id="4785914069240823137">Otkažite opsecanje</translation> @@ -4106,6 +4122,7 @@ <translation id="4838907349371614303">Lozinka je ažurirana</translation> <translation id="4838958829619609362">Izbor nije na jeziku <ph name="LANGUAGE" /></translation> <translation id="4839303808932127586">Sa&čuvaj video snimak kao...</translation> +<translation id="4839910546484524995">Proverite uređaj</translation> <translation id="4840096453115567876">Želite da ipak izađete iz režima bez arhiviranja?</translation> <translation id="4841741146571978176">Obavezna virtuelna mašina ne postoji. Probajte da podesite virtuelnu mašinu <ph name="VM_TYPE" /> da biste nastavili</translation> <translation id="4842976633412754305">Ova stranica pokušava da učitava skripte iz izvora čija autentičnost nije potvrđena.</translation> @@ -4724,6 +4741,7 @@ <translation id="5449551289610225147">Nevažeća lozinka</translation> <translation id="5449588825071916739">Obeleži sve kartice</translation> <translation id="5449716055534515760">Close Win&dow (Zatvori prozor)</translation> +<translation id="545133051331995777">Nema mrežne veze</translation> <translation id="5452446625764825792">Sada možete da pregledate nedavne slike, medije i aplikacije na telefonu</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (radi oflajn)</translation> <translation id="5454166040603940656">sa dobavljačem <ph name="PROVIDER" /></translation> @@ -4767,6 +4785,7 @@ <translation id="5487521232677179737">Obriši podatke</translation> <translation id="5488093641312826914">Stavka „<ph name="COPIED_ITEM_NAME" />“ je kopirana</translation> <translation id="5488508217173274228">Opcije šifrovanja sinhronizovanih podataka</translation> +<translation id="5489077378642700219">Ne dozvoljavajte obaveštenja sa <ph name="WEBSITE" />, ali neka vas pitaju kasnije</translation> <translation id="5489435190927933437">Sačuvane lozinke za <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Prekinite vezu sa Bluetooth uređajem</translation> <translation id="5490798133083738649">Dozvoli Linux-u da pristupa mikrofonu</translation> @@ -5023,6 +5042,7 @@ <translation id="5729712731028706266">&Prikaži</translation> <translation id="5731247495086897348">Na&lepi i idi</translation> <translation id="5732392974455271431">Roditelji mogu da ga odblokiraju za tebe</translation> +<translation id="5733109311583381874">Dodajte sopstvene reči u korisničke rečnike da biste prilagodili predloge za konverziju.</translation> <translation id="5733866499231170760">Nevažeći ID. Uneti format je netačan. Proverite uputstva koja ste primili da biste uneli ID u tačnom formatu. Ako ne možete da rešite ovaj problem, ostavite prazno polje i nastavite sa instaliranjem.</translation> <translation id="5734362860645681824">Komunikacije</translation> <translation id="5734697361979786483">Dodaj deljenje datoteka</translation> @@ -5105,6 +5125,7 @@ <translation id="5805697420284793859">Menadžer prozora</translation> <translation id="5806447147478173900">Ukupan memorijski prostor koji koriste prikazani sajtovi: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (podrazumevano)</translation> +<translation id="5809835394668218762">Još radnji za <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled mora da se omogući u chrome://flags</translation> <translation id="5810809306422959727">Ovaj nalog ne ispunjava uslove za roditeljski nadzor</translation> <translation id="5811614940486072060">Ovaj fajl se ne preuzima često i može da bude opasan</translation> @@ -5119,6 +5140,7 @@ <translation id="5826395379250998812">Povežite <ph name="DEVICE_TYPE" /> sa telefonom. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Polutransparentno</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Prikaži sajtove u istoj grupi</translation> <translation id="5827733057563115968">Predviđanje sledeće reči</translation> <translation id="5828545842856466741">Dodaj profil…</translation> <translation id="5828633471261496623">Štampanje...</translation> @@ -5132,6 +5154,7 @@ <translation id="583431638776747">Sajt nije bio dostupan</translation> <translation id="5834581999798853053">Ostalo je oko <ph name="TIME" /> minuta</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Kamera ili mikrofon snimaju</translation> +<translation id="5835625581856809102">Skenirajte ovaj QR kôd pomoću uređaja na kom želite da napravite pristupni kôd za aplikaciju <ph name="APP_NAME" /></translation> <translation id="583673505367439042">Sajtovi mogu da traže da menjaju fajlove i foldere na uređaju</translation> <translation id="5836999627049108525">Jezik sa kog želite da prevodite</translation> <translation id="583756221537636748">Futrola</translation> @@ -5189,6 +5212,7 @@ <translation id="5884474295213649357">Ova kartica je povezana sa USB uređajem.</translation> <translation id="5885314688092915589">Organizacija će upravljati ovim profilom</translation> <translation id="5886009770935151472">Prst 1</translation> +<translation id="5886112770923972514">Povežite i brzo podesite uređaje za brzo uparivanje u blizini</translation> <translation id="5886384907280980632">Isključi</translation> <translation id="5889282057229379085">Najveći broj posredničkih CA: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Primarne WiFi mreže</translation> @@ -5233,6 +5257,7 @@ <translation id="5927232971138258197">Ovaj dodatak može da čita i menja <ph name="HOST" /></translation> <translation id="592740088639760830">Zaustavi ovaj kontejner</translation> <translation id="592880897588170157">Preuzmite PDF datoteke da se ne bi automatski otvarale u Chrome-u</translation> +<translation id="5928969282301718193">Za sada je sve gotovo</translation> <translation id="592919310198008711">Kada kliknem na dodatak</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> zahteva da odmah ažurirate <ph name="DEVICE_TYPE" />.</translation> <translation id="5932224571077948991">Sajt prikazuje oglase koji ometaju aktivnosti ili obmanjujuće oglase</translation> @@ -5370,6 +5395,7 @@ <translation id="6059276912018042191">Nedavne Chrome kartice</translation> <translation id="6059652578941944813">Hijerarhija sertifikata</translation> <translation id="6059925163896151826">USB uređaji</translation> +<translation id="6061408389284235459">Obaveštenje je poslato na uređaj <ph name="DEVICE_NAME" /></translation> <translation id="6063284707309177505">Napravi QR kôd</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />Napomena<ph name="END_BOLD" />: Neko sa sličnim glasom ili snimkom možda može da pristupa ličnim rezultatima deteta <ph name="SUPERVISED_USER_NAME" />. Radi uštede baterije u podešavanjima Pomoćnika deteta <ph name="SUPERVISED_USER_NAME" /> možete da izaberete da funkcija „Hej Google“ bude aktivna samo kad je uređaj povezan sa izvorom napajanja.</translation> <translation id="6064217302520318294">Zaključavanje ekrana</translation> @@ -5406,6 +5432,7 @@ <translation id="6087746524533454243">Tražite stranicu sa osnovnim podacima o pregledaču? Posetite</translation> <translation id="6087960857463881712">Zadovoljno lice</translation> <translation id="608912389580139775">Da biste dodali ovu stranicu na listu za čitanje, kliknite na ikonu obeleživača</translation> +<translation id="6091116443517744502">proverite internet vezu i probajte ponovo</translation> <translation id="6091761513005122595">Deljena datoteka je učitana.</translation> <translation id="6093803049406781019">Brisanje profila</translation> <translation id="6093888419484831006">Otkazivanje ažuriranja...</translation> @@ -5497,6 +5524,7 @@ <translation id="6178664161104547336">Izbor sertifikata</translation> <translation id="6178682841350631965">Podaci za prijavljivanje su ažurirani</translation> <translation id="6180510783007738939">Alatka za linije</translation> +<translation id="6180550893222597997">Koji pristupni kôd želite da koristite za aplikaciju <ph name="APP_NAME" />?</translation> <translation id="6181431612547969857">Preuzimanje je blokirano</translation> <translation id="6184099524311454384">Pretražite kartice</translation> <translation id="6185132558746749656">Lokacija uređaja</translation> @@ -5936,6 +5964,7 @@ <translation id="6596816719288285829">IP adresa</translation> <translation id="6597017209724497268">Uzorci</translation> <translation id="6597331566371766302">Administrator je blokirao sledeće dodatke:</translation> +<translation id="6601262427770154296">Upravljanje korisničkim rečnicima</translation> <translation id="6601612474695404578">Neki sajtovi koriste kolačiće treće strane da bi učitavali svoje stranice. Ako sajt ne radi, možete da probate da dozvolite kolačiće.</translation> <translation id="6602937173026466876">Pristupite štampačima</translation> <translation id="6602956230557165253">Koristite tastere sa strelicama ulevo i udesno za kretanje.</translation> @@ -6072,6 +6101,7 @@ <translation id="6736243959894955139">Adresa</translation> <translation id="6737393581255281855">Želite da obrišete prikazane podatke?</translation> <translation id="6737663862851963468">Uklonite Kerberos tiket</translation> +<translation id="6738180164164974883">Dozvoli podešavanje kolačića treće strane</translation> <translation id="6738430949033571771">Verifikuje se nalog…</translation> <translation id="6739923123728562974">Prikaži prečicu na radnoj površini</translation> <translation id="6740234557573873150">Preuzimanje datoteke <ph name="FILE_NAME" /> je pauzirano</translation> @@ -6130,7 +6160,7 @@ <translation id="6795371939514004514">Automatsko skeniranje vam omogućava da se automatski krećete kroz stavke na ekranu. Kada je stavka istaknuta, pritisnite Izaberi da biste je aktivirali.</translation> <translation id="6795884519221689054">Panda</translation> <translation id="6796509790850723820">Renderuj</translation> -<translation id="6797493596609571643">Ups, nešto nije u redu.</translation> +<translation id="6797493596609571643">Ups, došlo je do greške.</translation> <translation id="6798420440063423019">Bezbednosni ključ je zaključan jer ste previše puta uneli pogrešan PIN. Treba da resetujete bezbednosni ključ.</translation> <translation id="679845623837196966">Prikaži listu za čitanje</translation> <translation id="6798578729981748444">Da biste dovršili uvoz, zatvorite sve Firefox prozore.</translation> @@ -6269,6 +6299,7 @@ <translation id="691106080621596509">Ovim brišete sve podatke i kolačiće koje čuvaju sajt <ph name="SITE_GROUP_NAME" />, svi njemu podređeni sajtovi i njegove instalirane aplikacije</translation> <translation id="6911734910326569517">Memorijski prostor u upotrebi</translation> <translation id="6912007319859991306">PIN SIM-a za mobilnu mrežu</translation> +<translation id="6912380255120084882">Probajte sa drugim uređajem</translation> <translation id="691289340230098384">Podešavanja titla</translation> <translation id="6914783257214138813">Lozinke će biti vidljive svima koji mogu da vide izvezenu datoteku.</translation> <translation id="6916590542764765824">Upravljajte dodacima</translation> @@ -6299,6 +6330,7 @@ <translation id="6943060957016121200">Omogući trenutno privezivanje</translation> <translation id="6943176775188458830">Otkaži štampanje</translation> <translation id="6943939122536910181">Prekinuta je veza sa uređajem <ph name="DEVICE" /></translation> +<translation id="6944708469742828051">Ovaj pristupni kôd će se sačuvati samo u funkciji Windows Hello</translation> <translation id="6945221475159498467">Izaberi</translation> <translation id="694592694773692225">Preusmeravanje je blokirano na ovoj stranici.</translation> <translation id="6947015141909171112">Prikazuju vam se recepti na osnovu nedavne aktivnosti pretrage za recepte. @@ -6551,6 +6583,7 @@ <translation id="7193051357671784796">Ovu aplikaciju je dodala vaša organizacija. Ponovo je pokrenite da biste završili instalaciju.</translation> <translation id="7193374945610105795">Nijedna lozinka nije sačuvana za <ph name="ORIGIN" /></translation> <translation id="7194873994243265344">Organizacija je blokirala ovaj fajl zato što je šifrovan. Zatražite od vlasnika da je dešifruje.</translation> +<translation id="7196272782924897510">Želite da koristite pristupni kôd sa drugog uređaja?</translation> <translation id="7196913789568937443">Pravite rezervne kopije na Google disku. Lako vraćajte podatke ili menjajte uređaje u bilo kom trenutku. Rezervna kopija obuhvata podatke aplikacija. Rezervne kopije se otpremaju na Google i šifruju pomoću lozinke za Google nalog. <ph name="BEGIN_LINK1" />Saznajte više<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Dobijte Google pretragu i Google pametne funkcije svaki put kada pregledate</translation> <translation id="719791532916917144">Tasterska prečica</translation> @@ -6579,6 +6612,7 @@ <translation id="7222204278952406003">Chrome je podrazumevani pregledač</translation> <translation id="7222232353993864120">Imejl adresa</translation> <translation id="7222235798733126207">Ograničeno deljenje između sajtova</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 sajt u grupi vlasnika <ph name="FPS_OWNER" />}one{{MEMBERS} sajt u grupi vlasnika <ph name="FPS_OWNER" />}few{{MEMBERS} sajta u grupi vlasnika <ph name="FPS_OWNER" />}other{{MEMBERS} sajtova u grupi vlasnika <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Koristi Windows Hello pri popunjavanju lozinki</translation> <translation id="7225179976675429563">Nedostaje tip mreže</translation> <translation id="7227458944009118910">Aplikacije navedene ispod mogu da obrađuju i linkove protokola. Ostale aplikacije će tražiti dozvolu.</translation> @@ -6994,7 +7028,7 @@ <translation id="7632948528260659758">Ažuriranje sledećih kiosk aplikacija nije uspelo:</translation> <translation id="7633724038415831385">Ovo je jedini trenutak kada ćete čekati na ažuriranje. Na Chromebook-u se softver ažurira u pozadini.</translation> <translation id="7634280112532283638">Umanjenje nepoželjnog sadržaja i prevara</translation> -<translation id="7634566076839829401">Nešto nije u redu. Probajte ponovo.</translation> +<translation id="7634566076839829401">Došlo je do greške. Probajte ponovo.</translation> <translation id="7635048370253485243">Zakačio je administrator</translation> <translation id="7636919061354591437">Instaliraj na ovom uređaju</translation> <translation id="7637253234491814483">Dodirnite senzor za otisak prsta u gornjem desnom uglu tastature, pored dugmeta za uključivanje. Podaci o otisku prsta se bezbedno čuvaju isključivo na uređaju <ph name="DEVICE_TYPE" />.</translation> @@ -7048,6 +7082,7 @@ <translation id="7670483791111801022">Titlovi</translation> <translation id="7671130400130574146">Koristi sistemsku traku naslova i ivice</translation> <translation id="767127784612208024">Dodirnite da biste potvrdili resetovanje</translation> +<translation id="7672504401554182757">Odaberite koji uređaj ima pristupni kôd za aplikaciju <ph name="APP_NAME" /></translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, na stranici <ph name="PAGE_TITLE" />.</translation> <translation id="7674416868315480713">Deaktiviraj sve portove koji se prosleđuju u Linux-u</translation> <translation id="7674537509496907005">Aplikacija: <ph name="APP_COUNT" /></translation> @@ -7091,6 +7126,7 @@ <translation id="7709152031285164251">Nije uspelo – <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Prebaci...</translation> <translation id="7711900714716399411">Povežite telefon sa računarom pomoću USB kabla. Ako je telefon već povezan, isključite ga, pa ga ponovo priključite.</translation> +<translation id="7711968363685835633">Onemogući personalizovane konverzije i predloge kao i korisnički rečnik</translation> <translation id="7712739869553853093">Odštampajte dijalog pregleda</translation> <translation id="7714307061282548371">Kolačići sa <ph name="DOMAIN" /> su dozvoljeni</translation> <translation id="7714464543167945231">Sertifikat</translation> @@ -7157,11 +7193,13 @@ <translation id="7766807826975222231">Kreni u obilazak</translation> <translation id="7766838926148951335">Prihvati dozvole</translation> <translation id="7767554953520855281">Detalji su sakriveni dok delite ekran</translation> +<translation id="7767972280546034736">Napravite šifru za aplikaciju <ph name="APP_NAME" /></translation> <translation id="7768507955883790804">Sajtovi automatski prate ovo podešavanje kada ih posetite</translation> <translation id="7768526219335215384"><ph name="ORIGIN" /> će moći da pregleda fajlove u folderu <ph name="FOLDERNAME" /></translation> <translation id="7768770796815395237">Promenite</translation> <translation id="7768784765476638775">Izaberite za govor</translation> <translation id="7769748505895274502">Skupi nedavno zatvoreno</translation> +<translation id="7770072242481632881">Birač bočne table</translation> <translation id="7770406201819593386">Pokrenite Chrome OS Flex dijagnostičke testove.</translation> <translation id="7770450735129978837">Klik na desni taster miša</translation> <translation id="7770612696274572992">Slika je kopirana sa nekog drugog uređaja</translation> @@ -7645,6 +7683,7 @@ <translation id="820568752112382238">Najposećeniji sajtovi</translation> <translation id="8206745257863499010">Bluzi</translation> <translation id="8206859287963243715">Mobilni uređaj</translation> +<translation id="8207404892907560325">Odaberite pristupni kôd</translation> <translation id="8208216423136871611">Ne čuvaj</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Novo obaveštenje}one{# novo obaveštenje}few{# nova obaveštenja}other{# novih obaveštenja}}</translation> <translation id="821119981794423735">Da biste uvezli lozinke u Google menadžer lozinki za <ph name="USER_EMAIL" />, izaberite CSV fajl</translation> @@ -7784,6 +7823,7 @@ <translation id="8338952601723052325">Veb-sajt programera</translation> <translation id="833986336429795709">Izaberite aplikaciju da biste otvorili ovaj link</translation> <translation id="8340547030807793004">Još radnji za <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Pregledajte <ph name="BEGIN_BOLD" />1 sajt<ph name="END_BOLD" /> koji je nedavno poslao mnogo obaveštenja}one{Pregledajte <ph name="BEGIN_BOLD" />{NUM_SITES} sajt<ph name="END_BOLD" /> koji je nedavno poslao mnogo obaveštenja}few{Pregledajte <ph name="BEGIN_BOLD" />{NUM_SITES} sajta<ph name="END_BOLD" /> koja su nedavno poslala mnogo obaveštenja}other{Pregledajte <ph name="BEGIN_BOLD" />{NUM_SITES} sajtova<ph name="END_BOLD" /> koji su nedavno poslali mnogo obaveštenja}}</translation> <translation id="8342221978608739536">Nisam pokušao/la</translation> <translation id="8342861492835240085">Izaberite kolekciju</translation> <translation id="8345848587667658367">Sada možete da pregledate nedavne slike, medije, obaveštenja i aplikacije na telefonu</translation> @@ -7797,6 +7837,7 @@ <translation id="8353683614194668312">Može da:</translation> <translation id="8354034204605718473">PIN deteta je dodat</translation> <translation id="8356197132883132838"><ph name="TITLE" /> – <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Već ste registrovali ovaj uređaj. Ne morate ponovo da ga registrujete.</translation> <translation id="8357388086258943206">Greška pri instaliranju Linux-a</translation> <translation id="8358685469073206162">Želite li da vratite stranice?</translation> <translation id="8358912028636606457">Prebacivanje zvuka kartice nije podržano na ovom uređaju.</translation> @@ -7816,6 +7857,7 @@ <translation id="8376137163494131156">Recite nam šta se dešava sa Google Cast-om.</translation> <translation id="8376384591331888629">Uključujući kolačiće trećih strana na ovom sajtu</translation> <translation id="8376451933628734023">Ako ova veb-aplikacija pokušava da vas prevari da je neka druga aplikacija, deinstalirajte je.</translation> +<translation id="8377625247046155446">Ovaj pristupni kôd će se sačuvati samo na ovom uređaju. On će ostati na ovom uređaju kada zatvorite sve prozore bez arhiviranja.</translation> <translation id="8378714024927312812">Ovim upravlja organizacija</translation> <translation id="8379156816349755485">Kada se prijavite, jedinstveni token za potvrdu identiteta će se sačuvati i koristiti za sva buduća preuzimanja koja ispunjavaju uslove.</translation> <translation id="8379878387931047019">Ovaj uređaj ne podržava tip bezbednosnog ključa koji zahteva ovaj veb-sajt</translation> @@ -8648,6 +8690,7 @@ <ph name="LIST_ITEM" />Pokrenite Chrome dijagnostiku povezivosti <ph name="END_LIST" /></translation> <translation id="916607977885256133">Slika u slici</translation> +<translation id="9166253503936244008">Skenirajte ovaj QR kôd pomoću uređaja koji ima pristupni kôd koji želite da koristite za aplikaciju <ph name="APP_NAME" /></translation> <translation id="9167063903968449027">Prikaži listu za čitanje</translation> <translation id="9167450455589251456">Profil nije podržan</translation> <translation id="9168436347345867845">Uradiću to kasnije</translation> @@ -8781,6 +8824,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Uspostavljanje bezbedne veze...</translation> <translation id="996803490569799917">Pogledajte uspomene sa omiljenim osobama i drugo</translation> +<translation id="997143476478634194">Sajtovi automatski prate ovo podešavanje kada ih posetite. Sajtovi obično šalju obaveštenja da bi vas obavestili o udarnim vestima ili porukama ćaskanja.</translation> <translation id="99731366405731005">Uključite <ph name="LINK1_BEGIN" />Chrome sinhronizaciju<ph name="LINK1_END" /> da biste koristili WiFi sinhronizaciju. <ph name="LINK2_BEGIN" />Saznajte više<ph name="LINK2_END" /></translation> <translation id="998747458861718449">P&regledaj</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index aecd2db2..efd2452 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -72,6 +72,7 @@ <translation id="1067048845568873861">Направљено</translation> <translation id="1067661089446014701">Ради додатне заштите можете да шифрујете лозинке на уређају пре него што се сачувају на Google налогу</translation> <translation id="1067922213147265141">Друге Google услуге</translation> +<translation id="1069104208554708737">Овај приступни кôд ће се сачувати само на овом уређају</translation> <translation id="1069355737714877171">Уклоните eSIM профил <ph name="PROFILE_NAME" /></translation> <translation id="1069814191880976658">Одабери други екран</translation> <translation id="1070377999570795893">Други програм на рачунару је додао додатак који може да промени начин на који Chrome функционише. @@ -349,6 +350,7 @@ <translation id="1324106254079708331">Предострожно штити личне Google налоге свих корисника угрожених циљаним нападима</translation> <translation id="1327272175893960498">Kerberos тикети</translation> <translation id="1327495825214193325">Да бисте омогућили ADB отклањање грешака, морате да рестартујете овај <ph name="DEVICE_TYPE" />. Да бисте га онемогућили, мораћете да ресетујете уређај на фабричка подешавања.</translation> +<translation id="1327527584824210101">Користите приступни кôд</translation> <translation id="1327794256477341646">Функције којима је потребна ваша локација неће радити</translation> <translation id="1331977651797684645">То сам ја.</translation> <translation id="1333489022424033687">Неке функције на <ph name="ORIGIN" /> можда неће радити док не обришете податке које су други сајтови сачували на уређају</translation> @@ -409,6 +411,7 @@ <translation id="139013308650923562">Имају дозволу да користе фонтове инсталиране на уређају</translation> <translation id="1390548061267426325">Отвори као уобичајену картицу</translation> <translation id="1390907927270446471"><ph name="PROFILE_USERNAME" /> нема овлашћење да штампа на: <ph name="PRINTER_NAME" />. Обратите се администратору.</translation> +<translation id="1392047138650695757">Кориснички речници</translation> <translation id="1393283411312835250">Сунце и облаци</translation> <translation id="1395730723686586365">Програм за ажурирање је покренут</translation> <translation id="1395832189806039783">Истакните ставку помоћу фокуса тастатуре</translation> @@ -1241,6 +1244,7 @@ <translation id="2135787500304447609">&Настави</translation> <translation id="2136372518715274136">Унесите нову лозинку</translation> <translation id="2136476978468204130">Приступна фраза коју сте унели је нетачна</translation> +<translation id="2137128126782078222">Не дозвољавајте обавештења са <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Чека се дозвола…</translation> <translation id="2139919072249842737">Дугме за подешавање</translation> <translation id="2140788884185208305">Стање батерије</translation> @@ -1514,6 +1518,7 @@ <translation id="2356070529366658676">Питај</translation> <translation id="2357330829548294574">Уклоните корисника <ph name="USER_NAME" /></translation> <translation id="2358561147588818967">Сајтови могу да користе JavaScript</translation> +<translation id="2358703245148663432">Други уређај</translation> <translation id="2358777858338503863">Кликните да бисте дозволили на <ph name="ORIGIN" />:</translation> <translation id="2359071692152028734">Linux апликације могу да престану да реагују.</translation> <translation id="2359345697448000899">Управљајте додацима кликом на ставку Додаци у менију Алатке.</translation> @@ -1874,6 +1879,7 @@ <translation id="271033894570825754">Ново</translation> <translation id="2711073837061989559">Пробе</translation> <translation id="2712173769900027643">Затражи дозволу</translation> +<translation id="2712207122921938368">Направите приступни кôд на другом уређају</translation> <translation id="2713106313042589954">Искључи камеру</translation> <translation id="2713444072780614174">Бела</translation> <translation id="2714393097308983682">Google Play продавница</translation> @@ -1888,6 +1894,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Администратор је онемогућио кориснике под надзором.</translation> <translation id="2722540561488096675">Уређај ће се искључити за <ph name="TIME_LEFT" />. Уклоните USB пре него што поново укључите уређај. Онда можете да почнете да користите <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">ИД: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC евиденције</translation> <translation id="272488616838512378">Конверзија јединица</translation> <translation id="2725200716980197196">Веза са мрежом је поново успостављена</translation> @@ -2385,6 +2392,7 @@ <translation id="3182749001423093222">Провера правописа</translation> <translation id="3183139917765991655">Увоз профила</translation> <translation id="3183143381919926261">Мобилне мреже за пренос података</translation> +<translation id="3183613134231754987">Овај приступни кôд ће се сачувати само у функцији Windows Hello. Он ће остати на овом уређају када затворите све прозоре без архивирања.</translation> <translation id="3183944777708523606">Распоред монитора</translation> <translation id="3184536091884214176">Подесите CUPS штампаче или управљајте њима. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="3185014249447200271">{NUM_APPS,plural, =1{Ова апликација је блокирана}one{Неке апликације су блокиране}few{Неке апликације су блокиране}other{Неке апликације су блокиране}}</translation> @@ -2475,6 +2483,7 @@ <translation id="3281892622610078515">Датотеке и програми који треба да се ставе у карантин:</translation> <translation id="3282210178675490297">Картица се дели са апликацијом <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">Нова &картица</translation> +<translation id="3285500645985761267">Дозволите сродним сајтовима да виде ваше активности у групи</translation> <translation id="328571385944182268">Желите ли да сачувате лозинке?</translation> <translation id="3288047731229977326">Додаци покренути у режиму програмера могу да нашкоде рачунару. Ако нисте програмер, требало би да онемогућите ове додатке покренуте у режиму програмера да бисте се заштитили.</translation> <translation id="3289668031376215426">Аутоматско писање великих почетних слова</translation> @@ -2749,6 +2758,7 @@ <translation id="3541823293333232175">Додељено</translation> <translation id="3543393733900874979">Ажурирање није успело (грешка: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">Потпис X9.62 ECDSA путем SHA-512</translation> +<translation id="3544058026430919413">Предузеће може да дефинише групу сајтова који могу да користе колачиће да би делили активности у групи. Ово је искључено у режиму без архивирања.</translation> <translation id="3544879808695557954">Корисничко име (опционално)</translation> <translation id="354602065659584722">Штетан софтвер је уклоњен</translation> <translation id="3547954654003013442">Подешавања проксија</translation> @@ -2864,6 +2874,7 @@ <translation id="3654045516529121250">Читање подешавања приступачности</translation> <translation id="3655712721956801464">{NUM_FILES,plural, =1{Има сталан приступ једној датотеци.}one{Има сталан приступ # датотеци.}few{Има сталан приступ за # датотеке.}other{Има сталан приступ за # датотека.}}</translation> <translation id="3658871634334445293">Убрзање TrackPoint-а</translation> +<translation id="3659550105763988702">Користите приступни кôд за апликацију <ph name="APP_NAME" /></translation> <translation id="3659929705630080526">Превише пута сте унели нетачан приступни кôд. Пробајте поново касније.</translation> <translation id="3660234220361471169">Непоуздани</translation> <translation id="3664511988987167893">Икона додатка</translation> @@ -2887,6 +2898,7 @@ <translation id="3681548574519135185">Прстен за фокусирање</translation> <translation id="3683524264665795342">Захтев за дељење екрана апликације <ph name="APP_NAME" /></translation> <translation id="3685598397738512288">Подешавања USB-а за Linux</translation> +<translation id="3687598459967813435">Увек дозвољавајте обавештења са <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Дошло је до грешке при покушају уписивања датотеке: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Уписивање у датотеке и директоријуме које отворите у апликацији</translation> <translation id="3688526734140524629">Промени канал</translation> @@ -3004,7 +3016,7 @@ <translation id="3788331399335602504">ови фајлови</translation> <translation id="3788401245189148511">Могли би да:</translation> <translation id="3789841737615482174">Инсталирај</translation> -<translation id="3790417903123637354">Нешто није у реду. Пробајте поново касније</translation> +<translation id="3790417903123637354">Дошло је до грешке. Пробајте поново касније</translation> <translation id="379082410132524484">Картица је истекла</translation> <translation id="3792973596468118484">Додатака: <ph name="NUM_EXTENSIONS" /></translation> <translation id="3793588272211751505">{NUM_DAYS,plural, =1{Chrome није пронашао штетан софтвер на рачунару • Проверено пре 1 дан}one{Chrome није пронашао штетан софтвер на рачунару • Проверено пре {NUM_DAYS} дан}few{Chrome није пронашао штетан софтвер на рачунару • Проверено пре {NUM_DAYS} дана}other{Chrome није пронашао штетан софтвер на рачунару • Проверено пре {NUM_DAYS} дана}}</translation> @@ -3059,6 +3071,7 @@ <translation id="3828029223314399057">Претражи обележиваче</translation> <translation id="3828953470056652895">Прочитао/ла сам и прихватам <ph name="BEGIN_LINK1" />Google услове коришћења услуге<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />додатне услове коришћења услуге за Chrome и Chrome ОС<ph name="END_LINK2" /> и <ph name="BEGIN_LINK3" />услове коришћења услуге Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">Дељење SMB датотека</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Администратор је поново укључио 1 потенцијално штетан додатак}one{Администратор је поново укључио {NUM_EXTENSIONS} потенцијално штетан додатак}few{Администратор је поново укључио {NUM_EXTENSIONS} потенцијално штетна додатка}other{Администратор је поново укључио {NUM_EXTENSIONS} потенцијално штетних додатака}}</translation> <translation id="3831436149286513437">Предлози за претрагу Google диска</translation> <translation id="3834728400518755610">Промена подешавања микрофона захтева искључивање Linux-а. Искључите Linux да бисте наставили.</translation> @@ -3136,6 +3149,7 @@ <translation id="3898327728850887246"><ph name="SITE_NAME" /> жели да: <ph name="FIRST_PERMISSION" /> и <ph name="SECOND_PERMISSION" /></translation> <translation id="389901847090970821">Изаберите тастатуру</translation> <translation id="3900966090527141178">Извезите лозинке</translation> +<translation id="3902789559055749153">Одаберите како желите да направите приступни кôд за апликацију <ph name="APP_NAME" /></translation> <translation id="3903187154317825986">Уграђена тастатура</translation> <translation id="3904326018476041253">Услуге локације</translation> <translation id="3904849010307028014">Тај сајт може да изда поуздан токен за прегледач на основу ваше интеракције са сајтом, попут редовног пријављивања на налог. Ако други сајтови које посећујете касније потраже и пронађу важећи поуздани токен, већа је вероватноћа да ће вас третирати као особу, а не као робота.</translation> @@ -3465,6 +3479,7 @@ <translation id="4218081191298393750">Кликните на икону звучника да бисте искључили звук за ову картицу</translation> <translation id="4219558185499589032">Box</translation> <translation id="4220648711404560261">Дошло је до грешке при активацији.</translation> +<translation id="4223845867739585293">Направите приступни кôд</translation> <translation id="4225397296022057997">На свим сајтовима</translation> <translation id="4228209296591583948">{NUM_EXTENSIONS,plural, =1{Овај додатак није дозвољен}one{Неки додаци нису дозвољени}few{Неки додаци нису дозвољени}other{Неки додаци нису дозвољени}}</translation> <translation id="4231095370974836764">Инсталирајте апликације и игре са Google Play-а на уређају <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> @@ -4045,6 +4060,7 @@ <translation id="4779766576531456629">Преименујте мобилну мрежу за eSIM</translation> <translation id="4780321648949301421">Сачувај страницу као...</translation> <translation id="4781443161433589743">Ви користите најјачу Chrome заштиту</translation> +<translation id="4781584184731045253">Обриши податке и дозволе</translation> <translation id="4782861709165039462">Прекидач за хардвер уређаја је онемогућио све микрофоне</translation> <translation id="4785719467058219317">Користите безбедносни кључ који није регистрован за овај веб-сајт</translation> <translation id="4785914069240823137">Откажите опсецање</translation> @@ -4106,6 +4122,7 @@ <translation id="4838907349371614303">Лозинка је ажурирана</translation> <translation id="4838958829619609362">Избор није на језику <ph name="LANGUAGE" /></translation> <translation id="4839303808932127586">Са&чувај видео снимак као...</translation> +<translation id="4839910546484524995">Проверите уређај</translation> <translation id="4840096453115567876">Желите да ипак изађете из режима без архивирања?</translation> <translation id="4841741146571978176">Обавезна виртуелна машина не постоји. Пробајте да подесите виртуелну машину <ph name="VM_TYPE" /> да бисте наставили</translation> <translation id="4842976633412754305">Ова страница покушава да учитава скрипте из извора чија аутентичност није потврђена.</translation> @@ -4724,6 +4741,7 @@ <translation id="5449551289610225147">Неважећа лозинка</translation> <translation id="5449588825071916739">Обележи све картице</translation> <translation id="5449716055534515760">Close Win&dow (Затвори прозор)</translation> +<translation id="545133051331995777">Нема мрежне везе</translation> <translation id="5452446625764825792">Сада можете да прегледате недавне слике, медије и апликације на телефону</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (ради офлајн)</translation> <translation id="5454166040603940656">са добављачем <ph name="PROVIDER" /></translation> @@ -4767,6 +4785,7 @@ <translation id="5487521232677179737">Обриши податке</translation> <translation id="5488093641312826914">Ставка „<ph name="COPIED_ITEM_NAME" />“ је копирана</translation> <translation id="5488508217173274228">Опције шифровања синхронизованих података</translation> +<translation id="5489077378642700219">Не дозвољавајте обавештења са <ph name="WEBSITE" />, али нека вас питају касније</translation> <translation id="5489435190927933437">Сачуване лозинке за <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Прекините везу са Bluetooth уређајем</translation> <translation id="5490798133083738649">Дозволи Linux-у да приступа микрофону</translation> @@ -5023,6 +5042,7 @@ <translation id="5729712731028706266">&Прикажи</translation> <translation id="5731247495086897348">На&лепи и иди</translation> <translation id="5732392974455271431">Родитељи могу да га одблокирају за тебе</translation> +<translation id="5733109311583381874">Додајте сопствене речи у корисничке речнике да бисте прилагодили предлоге за конверзију.</translation> <translation id="5733866499231170760">Неважећи ИД. Унети формат је нетачан. Проверите упутства која сте примили да бисте унели ИД у тачном формату. Ако не можете да решите овај проблем, оставите празно поље и наставите са инсталирањем.</translation> <translation id="5734362860645681824">Комуникације</translation> <translation id="5734697361979786483">Додај дељење датотека</translation> @@ -5105,6 +5125,7 @@ <translation id="5805697420284793859">Менаџер прозора</translation> <translation id="5806447147478173900">Укупан меморијски простор који користе приказани сајтови: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (подразумевано)</translation> +<translation id="5809835394668218762">Још радњи за <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">#borealis-enabled мора да се омогући у chrome://flags</translation> <translation id="5810809306422959727">Овај налог не испуњава услове за родитељски надзор</translation> <translation id="5811614940486072060">Овај фајл се не преузима често и може да буде опасан</translation> @@ -5119,6 +5140,7 @@ <translation id="5826395379250998812">Повежите <ph name="DEVICE_TYPE" /> са телефоном. <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Полутранспарентно</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Прикажи сајтове у истој групи</translation> <translation id="5827733057563115968">Предвиђање следеће речи</translation> <translation id="5828545842856466741">Додај профил…</translation> <translation id="5828633471261496623">Штампање...</translation> @@ -5132,6 +5154,7 @@ <translation id="583431638776747">Сајт није био доступан</translation> <translation id="5834581999798853053">Остало је око <ph name="TIME" /> минута</translation> <translation id="5835486486592033703"><ph name="WINDOW_TITLE" /> – Камера или микрофон снимају</translation> +<translation id="5835625581856809102">Скенирајте овај QR кôд помоћу уређаја на ком желите да направите приступни кôд за апликацију <ph name="APP_NAME" /></translation> <translation id="583673505367439042">Сајтови могу да траже да мењају фајлове и фолдере на уређају</translation> <translation id="5836999627049108525">Језик са ког желите да преводите</translation> <translation id="583756221537636748">Футрола</translation> @@ -5189,6 +5212,7 @@ <translation id="5884474295213649357">Ова картица је повезана са USB уређајем.</translation> <translation id="5885314688092915589">Организација ће управљати овим профилом</translation> <translation id="5886009770935151472">Прст 1</translation> +<translation id="5886112770923972514">Повежите и брзо подесите уређаје за брзо упаривање у близини</translation> <translation id="5886384907280980632">Искључи</translation> <translation id="5889282057229379085">Највећи број посредничких CA: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Примарне WiFi мреже</translation> @@ -5233,6 +5257,7 @@ <translation id="5927232971138258197">Овај додатак може да чита и мења <ph name="HOST" /></translation> <translation id="592740088639760830">Заустави овај контејнер</translation> <translation id="592880897588170157">Преузмите PDF датотеке да се не би аутоматски отварале у Chrome-у</translation> +<translation id="5928969282301718193">За сада је све готово</translation> <translation id="592919310198008711">Када кликнем на додатак</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> захтева да одмах ажурирате <ph name="DEVICE_TYPE" />.</translation> <translation id="5932224571077948991">Сајт приказује огласе који ометају активности или обмањујуће огласе</translation> @@ -5370,6 +5395,7 @@ <translation id="6059276912018042191">Недавне Chrome картице</translation> <translation id="6059652578941944813">Хијерархија сертификата</translation> <translation id="6059925163896151826">USB уређаји</translation> +<translation id="6061408389284235459">Обавештење је послато на уређај <ph name="DEVICE_NAME" /></translation> <translation id="6063284707309177505">Направи QR кôд</translation> <translation id="6063847492705284550"><ph name="BEGIN_BOLD" />Напомена<ph name="END_BOLD" />: Неко са сличним гласом или снимком можда може да приступа личним резултатима детета <ph name="SUPERVISED_USER_NAME" />. Ради уштеде батерије у подешавањима Помоћника детета <ph name="SUPERVISED_USER_NAME" /> можете да изаберете да функција „Хеј Google“ буде активна само кад је уређај повезан са извором напајања.</translation> <translation id="6064217302520318294">Закључавање екрана</translation> @@ -5406,6 +5432,7 @@ <translation id="6087746524533454243">Тражите страницу са основним подацима о прегледачу? Посетите</translation> <translation id="6087960857463881712">Задовољно лице</translation> <translation id="608912389580139775">Да бисте додали ову страницу на листу за читање, кликните на икону обележивача</translation> +<translation id="6091116443517744502">проверите интернет везу и пробајте поново</translation> <translation id="6091761513005122595">Дељена датотека је учитана.</translation> <translation id="6093803049406781019">Брисање профила</translation> <translation id="6093888419484831006">Отказивање ажурирања...</translation> @@ -5497,6 +5524,7 @@ <translation id="6178664161104547336">Избор сертификата</translation> <translation id="6178682841350631965">Подаци за пријављивање су ажурирани</translation> <translation id="6180510783007738939">Алатка за линије</translation> +<translation id="6180550893222597997">Који приступни кôд желите да користите за апликацију <ph name="APP_NAME" />?</translation> <translation id="6181431612547969857">Преузимање је блокирано</translation> <translation id="6184099524311454384">Претражите картице</translation> <translation id="6185132558746749656">Локација уређаја</translation> @@ -5936,6 +5964,7 @@ <translation id="6596816719288285829">IP адреса</translation> <translation id="6597017209724497268">Узорци</translation> <translation id="6597331566371766302">Администратор је блокирао следеће додатке:</translation> +<translation id="6601262427770154296">Управљање корисничким речницима</translation> <translation id="6601612474695404578">Неки сајтови користе колачиће треће стране да би учитавали своје странице. Ако сајт не ради, можете да пробате да дозволите колачиће.</translation> <translation id="6602937173026466876">Приступите штампачима</translation> <translation id="6602956230557165253">Користите тастере са стрелицама улево и удесно за кретање.</translation> @@ -6072,6 +6101,7 @@ <translation id="6736243959894955139">Адреса</translation> <translation id="6737393581255281855">Желите да обришете приказане податке?</translation> <translation id="6737663862851963468">Уклоните Kerberos тикет</translation> +<translation id="6738180164164974883">Дозволи подешавање колачића треће стране</translation> <translation id="6738430949033571771">Верификује се налог…</translation> <translation id="6739923123728562974">Прикажи пречицу на радној површини</translation> <translation id="6740234557573873150">Преузимање датотеке <ph name="FILE_NAME" /> је паузирано</translation> @@ -6130,7 +6160,7 @@ <translation id="6795371939514004514">Аутоматско скенирање вам омогућава да се аутоматски крећете кроз ставке на екрану. Када је ставка истакнута, притисните Изабери да бисте је активирали.</translation> <translation id="6795884519221689054">Панда</translation> <translation id="6796509790850723820">Рендеруј</translation> -<translation id="6797493596609571643">Упс, нешто није у реду.</translation> +<translation id="6797493596609571643">Упс, дошло је до грешке.</translation> <translation id="6798420440063423019">Безбедносни кључ је закључан јер сте превише пута унели погрешан PIN. Треба да ресетујете безбедносни кључ.</translation> <translation id="679845623837196966">Прикажи листу за читање</translation> <translation id="6798578729981748444">Да бисте довршили увоз, затворите све Firefox прозоре.</translation> @@ -6269,6 +6299,7 @@ <translation id="691106080621596509">Овим бришете све податке и колачиће које чувају сајт <ph name="SITE_GROUP_NAME" />, сви њему подређени сајтови и његове инсталиране апликације</translation> <translation id="6911734910326569517">Меморијски простор у употреби</translation> <translation id="6912007319859991306">PIN SIM-а за мобилну мрежу</translation> +<translation id="6912380255120084882">Пробајте са другим уређајем</translation> <translation id="691289340230098384">Подешавања титла</translation> <translation id="6914783257214138813">Лозинке ће бити видљиве свима који могу да виде извезену датотеку.</translation> <translation id="6916590542764765824">Управљајте додацима</translation> @@ -6299,6 +6330,7 @@ <translation id="6943060957016121200">Омогући тренутно привезивање</translation> <translation id="6943176775188458830">Откажи штампање</translation> <translation id="6943939122536910181">Прекинута је веза са уређајем <ph name="DEVICE" /></translation> +<translation id="6944708469742828051">Овај приступни кôд ће се сачувати само у функцији Windows Hello</translation> <translation id="6945221475159498467">Изабери</translation> <translation id="694592694773692225">Преусмеравање је блокирано на овој страници.</translation> <translation id="6947015141909171112">Приказују вам се рецепти на основу недавне активности претраге за рецепте. @@ -6551,6 +6583,7 @@ <translation id="7193051357671784796">Ову апликацију је додала ваша организација. Поново је покрените да бисте завршили инсталацију.</translation> <translation id="7193374945610105795">Ниједна лозинка није сачувана за <ph name="ORIGIN" /></translation> <translation id="7194873994243265344">Организација је блокирала овај фајл зато што је шифрован. Затражите од власника да је дешифрује.</translation> +<translation id="7196272782924897510">Желите да користите приступни кôд са другог уређаја?</translation> <translation id="7196913789568937443">Правите резервне копије на Google диску. Лако враћајте податке или мењајте уређаје у било ком тренутку. Резервна копија обухвата податке апликација. Резервне копије се отпремају на Google и шифрују помоћу лозинке за Google налог. <ph name="BEGIN_LINK1" />Сазнајте више<ph name="END_LINK1" /></translation> <translation id="7197190419934240522">Добијте Google претрагу и Google паметне функције сваки пут када прегледате</translation> <translation id="719791532916917144">Тастерска пречица</translation> @@ -6579,6 +6612,7 @@ <translation id="7222204278952406003">Chrome је подразумевани прегледач</translation> <translation id="7222232353993864120">Имејл адреса</translation> <translation id="7222235798733126207">Ограничено дељење између сајтова</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 сајт у групи власника <ph name="FPS_OWNER" />}one{{MEMBERS} сајт у групи власника <ph name="FPS_OWNER" />}few{{MEMBERS} сајта у групи власника <ph name="FPS_OWNER" />}other{{MEMBERS} сајтова у групи власника <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Користи Windows Hello при попуњавању лозинки</translation> <translation id="7225179976675429563">Недостаје тип мреже</translation> <translation id="7227458944009118910">Апликације наведене испод могу да обрађују и линкове протокола. Остале апликације ће тражити дозволу.</translation> @@ -6994,7 +7028,7 @@ <translation id="7632948528260659758">Ажурирање следећих киоск апликација није успело:</translation> <translation id="7633724038415831385">Ово је једини тренутак када ћете чекати на ажурирање. На Chromebook-у се софтвер ажурира у позадини.</translation> <translation id="7634280112532283638">Умањење непожељног садржаја и превара</translation> -<translation id="7634566076839829401">Нешто није у реду. Пробајте поново.</translation> +<translation id="7634566076839829401">Дошло је до грешке. Пробајте поново.</translation> <translation id="7635048370253485243">Закачио је администратор</translation> <translation id="7636919061354591437">Инсталирај на овом уређају</translation> <translation id="7637253234491814483">Додирните сензор за отисак прста у горњем десном углу тастатуре, поред дугмета за укључивање. Подаци о отиску прста се безбедно чувају искључиво на уређају <ph name="DEVICE_TYPE" />.</translation> @@ -7048,6 +7082,7 @@ <translation id="7670483791111801022">Титлови</translation> <translation id="7671130400130574146">Користи системску траку наслова и ивице</translation> <translation id="767127784612208024">Додирните да бисте потврдили ресетовање</translation> +<translation id="7672504401554182757">Одаберите који уређај има приступни кôд за апликацију <ph name="APP_NAME" /></translation> <translation id="7672520070349703697"><ph name="HUNG_IFRAME_URL" />, на страници <ph name="PAGE_TITLE" />.</translation> <translation id="7674416868315480713">Деактивирај све портове који се прослеђују у Linux-у</translation> <translation id="7674537509496907005">Апликација: <ph name="APP_COUNT" /></translation> @@ -7091,6 +7126,7 @@ <translation id="7709152031285164251">Није успело – <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Пребаци...</translation> <translation id="7711900714716399411">Повежите телефон са рачунаром помоћу USB кабла. Ако је телефон већ повезан, искључите га, па га поново прикључите.</translation> +<translation id="7711968363685835633">Онемогући персонализоване конверзије и предлоге као и кориснички речник</translation> <translation id="7712739869553853093">Одштампајте дијалог прегледа</translation> <translation id="7714307061282548371">Колачићи са <ph name="DOMAIN" /> су дозвољени</translation> <translation id="7714464543167945231">Сертификат</translation> @@ -7157,11 +7193,13 @@ <translation id="7766807826975222231">Крени у обилазак</translation> <translation id="7766838926148951335">Прихвати дозволе</translation> <translation id="7767554953520855281">Детаљи су сакривени док делите екран</translation> +<translation id="7767972280546034736">Направите шифру за апликацију <ph name="APP_NAME" /></translation> <translation id="7768507955883790804">Сајтови аутоматски прате ово подешавање када их посетите</translation> <translation id="7768526219335215384"><ph name="ORIGIN" /> ће моћи да прегледа фајлове у фолдеру <ph name="FOLDERNAME" /></translation> <translation id="7768770796815395237">Промените</translation> <translation id="7768784765476638775">Изаберите за говор</translation> <translation id="7769748505895274502">Скупи недавно затворено</translation> +<translation id="7770072242481632881">Бирач бочне табле</translation> <translation id="7770406201819593386">Покрените Chrome OS Flex дијагностичке тестове.</translation> <translation id="7770450735129978837">Клик на десни тастер миша</translation> <translation id="7770612696274572992">Слика је копирана са неког другог уређаја</translation> @@ -7645,6 +7683,7 @@ <translation id="820568752112382238">Најпосећенији сајтови</translation> <translation id="8206745257863499010">Блузи</translation> <translation id="8206859287963243715">Мобилни уређај</translation> +<translation id="8207404892907560325">Одаберите приступни кôд</translation> <translation id="8208216423136871611">Не чувај</translation> <translation id="8210398899759134986">{MUTED_NOTIFICATIONS_COUNT,plural, =1{Ново обавештење}one{# ново обавештење}few{# нова обавештења}other{# нових обавештења}}</translation> <translation id="821119981794423735">Да бисте увезли лозинке у Google менаџер лозинки за <ph name="USER_EMAIL" />, изаберите CSV фајл</translation> @@ -7784,6 +7823,7 @@ <translation id="8338952601723052325">Веб-сајт програмера</translation> <translation id="833986336429795709">Изаберите апликацију да бисте отворили овај линк</translation> <translation id="8340547030807793004">Још радњи за <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Прегледајте <ph name="BEGIN_BOLD" />1 сајт<ph name="END_BOLD" /> који је недавно послао много обавештења}one{Прегледајте <ph name="BEGIN_BOLD" />{NUM_SITES} сајт<ph name="END_BOLD" /> који је недавно послао много обавештења}few{Прегледајте <ph name="BEGIN_BOLD" />{NUM_SITES} сајта<ph name="END_BOLD" /> која су недавно послала много обавештења}other{Прегледајте <ph name="BEGIN_BOLD" />{NUM_SITES} сајтова<ph name="END_BOLD" /> који су недавно послали много обавештења}}</translation> <translation id="8342221978608739536">Нисам покушао/ла</translation> <translation id="8342861492835240085">Изаберите колекцију</translation> <translation id="8345848587667658367">Сада можете да прегледате недавне слике, медије, обавештења и апликације на телефону</translation> @@ -7797,6 +7837,7 @@ <translation id="8353683614194668312">Може да:</translation> <translation id="8354034204605718473">PIN детета је додат</translation> <translation id="8356197132883132838"><ph name="TITLE" /> – <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Већ сте регистровали овај уређај. Не морате поново да га региструјете.</translation> <translation id="8357388086258943206">Грешка при инсталирању Linux-а</translation> <translation id="8358685469073206162">Желите ли да вратите странице?</translation> <translation id="8358912028636606457">Пребацивање звука картице није подржано на овом уређају.</translation> @@ -7816,6 +7857,7 @@ <translation id="8376137163494131156">Реците нам шта се дешава са Google Cast-ом.</translation> <translation id="8376384591331888629">Укључујући колачиће трећих страна на овом сајту</translation> <translation id="8376451933628734023">Ако ова веб-апликација покушава да вас превари да је нека друга апликација, деинсталирајте је.</translation> +<translation id="8377625247046155446">Овај приступни кôд ће се сачувати само на овом уређају. Он ће остати на овом уређају када затворите све прозоре без архивирања.</translation> <translation id="8378714024927312812">Овим управља организација</translation> <translation id="8379156816349755485">Када се пријавите, јединствени токен за потврду идентитета ће се сачувати и користити за сва будућа преузимања која испуњавају услове.</translation> <translation id="8379878387931047019">Овај уређај не подржава тип безбедносног кључа који захтева овај веб-сајт</translation> @@ -8648,6 +8690,7 @@ <ph name="LIST_ITEM" />Покрените Chrome дијагностику повезивости <ph name="END_LIST" /></translation> <translation id="916607977885256133">Слика у слици</translation> +<translation id="9166253503936244008">Скенирајте овај QR кôд помоћу уређаја који има приступни кôд који желите да користите за апликацију <ph name="APP_NAME" /></translation> <translation id="9167063903968449027">Прикажи листу за читање</translation> <translation id="9167450455589251456">Профил није подржан</translation> <translation id="9168436347345867845">Урадићу то касније</translation> @@ -8781,6 +8824,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Успостављање безбедне везе...</translation> <translation id="996803490569799917">Погледајте успомене са омиљеним особама и друго</translation> +<translation id="997143476478634194">Сајтови аутоматски прате ово подешавање када их посетите. Сајтови обично шаљу обавештења да би вас обавестили о ударним вестима или порукама ћаскања.</translation> <translation id="99731366405731005">Укључите <ph name="LINK1_BEGIN" />Chrome синхронизацију<ph name="LINK1_END" /> да бисте користили WiFi синхронизацију. <ph name="LINK2_BEGIN" />Сазнајте више<ph name="LINK2_END" /></translation> <translation id="998747458861718449">П&регледај</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 7bb0cc7..9fb6f924 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1906,6 +1906,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Watumiaji wanaosimamiwa wamezuiwa na msimamizi wako.</translation> <translation id="2722540561488096675">Kifaa chako kitazimwa baada ya <ph name="TIME_LEFT" />. Ondoa USB kabla ya kuwasha kifaa chako tena. Kisha, unaweza kuanza kutumia <ph name="DEVICE_OS" />.</translation> +<translation id="2722547199758472013">Kitambulisho: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">Kumbukumbu za WebRTC</translation> <translation id="272488616838512378">Ubadilishaji wa Vipimo</translation> <translation id="2725200716980197196">Muunganisho wa mtandao umerejeshwa</translation> @@ -3079,6 +3080,7 @@ <translation id="3828029223314399057">Tafuta katika alamisho</translation> <translation id="3828953470056652895">Nimesoma na ninakubali <ph name="BEGIN_LINK1" />Sheria na Masharti ya Google<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Sheria na Masharti ya Ziada ya Chrome na Mfumo wa Uendeshaji wa Chrome<ph name="END_LINK2" /> na <ph name="BEGIN_LINK3" />Sheria na Masharti ya Google Play<ph name="END_LINK3" />.</translation> <translation id="3829765597456725595">Faili ya kushiriki ya SMB</translation> +<translation id="3830268140528557982">kwenye <ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Msimamizi wako amewasha tena kiendelezi kimoja ambacho huenda ni hatari}other{Msimamizi wako amewasha tena viendelezi {NUM_EXTENSIONS} ambavyo huenda ni hatari}}</translation> <translation id="3831436149286513437">Mapendekezo ya utafutaji ya Hifadhi ya Google</translation> <translation id="3834728400518755610">Mabadiliko katika mipangilio ya maikrofoni yanahitaji uzime Linux. Zima Linux ili uendelee.</translation> @@ -5213,6 +5215,7 @@ <translation id="5884474295213649357">Kichupo hiki kimeunganishwa kwenye kifaa cha USB.</translation> <translation id="5885314688092915589">Shirika lako litadhibiti wasifu huu</translation> <translation id="5886009770935151472">Kidole cha 1</translation> +<translation id="5886112770923972514">Unganisha kwa haraka na uweke mipangilio ya Kuoanisha Haraka vifaa vilivyo karibu</translation> <translation id="5886384907280980632">Zima sasa</translation> <translation id="5889282057229379085">Upeo wa idadi ya mamlaka ya kati ya cheti: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Mitandao ya Wi-Fi inayopendelewa</translation> @@ -7813,6 +7816,7 @@ <translation id="8338952601723052325">Tovuti ya msanidi programu</translation> <translation id="833986336429795709">Ili ufungue kiungo hiki, chagua programu</translation> <translation id="8340547030807793004">Vitendo zaidi vya <ph name="DEVICE" /></translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Kagua <ph name="BEGIN_BOLD" />tovuti 1<ph name="END_BOLD" /> ambayo imetuma arifa nyingi hivi karibuni}other{Kagua <ph name="BEGIN_BOLD" />tovuti {NUM_SITES}<ph name="END_BOLD" /> ambazo zimetuma arifa nyingi hivi karibuni}}</translation> <translation id="8342221978608739536">Sijajaribu</translation> <translation id="8342861492835240085">Chagua mkusanyiko</translation> <translation id="8345848587667658367">Sasa unaweza kuangalia picha, programu, maudhui na arifa za hivi karibuni za simu yako</translation> @@ -8810,6 +8814,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Inaanzisha muunganisho salama...</translation> <translation id="996803490569799917">Tazama kumbukumbu za watu wako unaowapenda na zaidi</translation> +<translation id="997143476478634194">Tovuti hufuata mipangilio hii kiotomatiki unapozitembelea. Tovuti hutuma arifa kukujulisha kuhusu habari zinazojiri au ujumbe wa gumzo.</translation> <translation id="99731366405731005">Washa kipengele cha <ph name="LINK1_BEGIN" />Usawazishaji wa Chrome<ph name="LINK1_END" /> ili uweze kutumia kipengele cha Usawazishaji Wi-Fi. <ph name="LINK2_BEGIN" />Pata maelezo zaidi<ph name="LINK2_END" /></translation> <translation id="998747458861718449">Kagua</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index c80479a..6e3ddfc7 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1887,6 +1887,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">Denetlenen kullanıcılar yöneticiniz tarafından devre dışı bırakıldı.</translation> <translation id="2722540561488096675">Cihazınız <ph name="TIME_LEFT" /> sonra kapanacak. Cihazı tekrar açmadan önce USB'yi çıkarın. Daha sonra <ph name="DEVICE_OS" /> kullanmaya başlayabilirsiniz.</translation> +<translation id="2722547199758472013">Kimlik: <ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC günlükleri</translation> <translation id="272488616838512378">Birim Dönüştürme</translation> <translation id="2725200716980197196">Ağ bağlantısı geri yüklendi</translation> @@ -3058,6 +3059,7 @@ <translation id="3828029223314399057">Yer işaretlerinde ara</translation> <translation id="3828953470056652895"><ph name="BEGIN_LINK1" />Google Hizmet Şartları<ph name="END_LINK1" />, <ph name="BEGIN_LINK2" />Chrome ve ChromeOS Ek Hizmet Şartları<ph name="END_LINK2" /> ile <ph name="BEGIN_LINK3" />Play Hizmet Şartları<ph name="END_LINK3" />'nı okudum ve kabul ediyorum.</translation> <translation id="3829765597456725595">SMB dosya paylaşımı</translation> +<translation id="3830268140528557982"><ph name="RP_MAIN_ETLD_PLUS_ONE" /> alanında</translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{Yöneticiniz zararlı olabilecek 1 uzantıyı tekrar açtı}other{Yöneticiniz zararlı olabilecek {NUM_EXTENSIONS} uzantıyı tekrar açtı}}</translation> <translation id="3831436149286513437">Google Drive arama önerileri</translation> <translation id="3834728400518755610">Mikrofon ayarlarında yapılan değişiklik, Linux'un kapatılmasını gerektirir. Devam etmek için Linux'u kapatın.</translation> @@ -5189,6 +5191,7 @@ <translation id="5884474295213649357">Bu sekme bir USB cihazına bağlı.</translation> <translation id="5885314688092915589">Bu profil kuruluşunuz tarafından yönetilecektir.</translation> <translation id="5886009770935151472">1. parmak</translation> +<translation id="5886112770923972514">Yakındaki Hızlı Eşleme cihazlarına bağlanıp bunları hızlıca kurun</translation> <translation id="5886384907280980632">Şimdi kapat</translation> <translation id="5889282057229379085">Ara CA sayısı üst sınırı: <ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">Tercih edilen kablosuz ağlar</translation> @@ -7780,6 +7783,7 @@ <translation id="8338952601723052325">Geliştirici web sitesi</translation> <translation id="833986336429795709">Bu bağlantıyı açmak için bir uygulama seçin</translation> <translation id="8340547030807793004"><ph name="DEVICE" /> ile ilgili diğer işlemler</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{Son zamanlarda çok fazla bildirim gönderen <ph name="BEGIN_BOLD" />1 siteyi<ph name="END_BOLD" /> inceleyin}other{Son zamanlarda çok fazla bildirim gönderen <ph name="BEGIN_BOLD" />{NUM_SITES} siteyi<ph name="END_BOLD" /> inceleyin}}</translation> <translation id="8342221978608739536">Denemedim</translation> <translation id="8342861492835240085">Koleksiyon seçin</translation> <translation id="8345848587667658367">Artık telefonunuzdaki son fotoğrafları, medya içeriklerini, bildirimleri ve uygulamaları görüntüleyebilirsiniz</translation> @@ -8775,6 +8779,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">Güvenli bağlantı oluşturuluyor...</translation> <translation id="996803490569799917">En sevdiğiniz kişilerle olan anılarınızı ve daha fazlasını görün</translation> +<translation id="997143476478634194">Ziyaret ettiğinizde siteler otomatik olarak bu ayarı uygular. Siteler genellikle son dakika haberleri veya sohbet mesajları konusunda sizi bilgilendirmek için bildirim gönderir.</translation> <translation id="99731366405731005">Wi-Fi Senkronizasyonu'nu kullanmak için <ph name="LINK1_BEGIN" />Chrome Senkronizasyonu<ph name="LINK1_END" />'nu açın. <ph name="LINK2_BEGIN" />Daha fazla bilgi<ph name="LINK2_END" /></translation> <translation id="998747458861718449">İ&ncele</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 99a27df1..054631f 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1244,6 +1244,7 @@ <translation id="2135787500304447609">&Qaytarish</translation> <translation id="2136372518715274136">Yangi parolni kiriting</translation> <translation id="2136476978468204130">Kodli ibora xato kiritildi</translation> +<translation id="2137128126782078222"><ph name="WEBSITE" /> saytida bildirishnomalar chiqmasin</translation> <translation id="2137891579555018930">Ruxsat kutilmoqda...</translation> <translation id="2139919072249842737">Sozlash tugmasi</translation> <translation id="2140788884185208305">Quvvat darajasi</translation> @@ -2484,6 +2485,7 @@ <translation id="3281892622610078515">Izolyatsiya qilinadigan fayllar va dasturlar:</translation> <translation id="3282210178675490297">Varaq <ph name="APP_NAME" /> ilovasiga ulashilmoqda</translation> <translation id="3285322247471302225">Yangi &ichki oyna</translation> +<translation id="3285500645985761267">Aloqador saytlarga guruhdagi faoliyatni koʻrishga ruxsat berish</translation> <translation id="328571385944182268">Parollaringiz saqlansinmi?</translation> <translation id="3288047731229977326">Dasturchi rejimida ishga tushirilgan kengaytmalar kompyuteringizga ziyon yetkazishi mumkin. Agar dasturchi bo‘lmasangiz xavfsizlik maqsadlarida ularni o‘chirib qo‘yishingiz kerak.</translation> <translation id="3289668031376215426">Avtomatik bosh harf</translation> @@ -2758,6 +2760,7 @@ <translation id="3541823293333232175">Tayinlandi</translation> <translation id="3543393733900874979">Yangilash amalga oshmadi (xato: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">SHA-512 algoritmli X9.62 ECDSA imzosi</translation> +<translation id="3544058026430919413">Kompaniya saytlar guruhini jamlashi va cookielar yordamida guruhdagi faoliyatni ulashishi mumkin. Inkognito rejimidan chiqish.</translation> <translation id="3544879808695557954">Login (ixtiyoriy)</translation> <translation id="354602065659584722">Zararli dastur o‘chirildi</translation> <translation id="3547954654003013442">Proksi sozlamalari</translation> @@ -2897,6 +2900,7 @@ <translation id="3681548574519135185">Fokus chegarasi</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> ekraningizga ulanmoqchi</translation> <translation id="3685598397738512288">Linux tizimida USB sozlamalari</translation> +<translation id="3687598459967813435"><ph name="WEBSITE" /> saytida bildirishnoma chiqishiga doimiy ruxsat berish</translation> <translation id="368789413795732264">Faylni yozishda xatolik yuz berdi: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Ilovada ochilgan ma’lumotlarni fayl va jildlarga yozish</translation> <translation id="3688526734140524629">Boshqa versiyani tanlash</translation> @@ -4058,6 +4062,7 @@ <translation id="4779766576531456629">eSIM mobil tarmoqni qayta nomlash</translation> <translation id="4780321648949301421">Sahifani saqlab olish...</translation> <translation id="4781443161433589743">Chromening eng yuqori himoyasi ostidasiz</translation> +<translation id="4781584184731045253">Maʼlumotlar va ruxsatlarni tozalash</translation> <translation id="4782861709165039462">Barcha mikrofonlar qurilmalar jismoniy tugmasi orqali faolsizlantirilgan</translation> <translation id="4785719467058219317">Elektron kalitingiz bu sayt roʻyxatidan oʻtkazilmagan</translation> <translation id="4785914069240823137">Qirqib olishni bekor qilish</translation> @@ -4738,6 +4743,7 @@ <translation id="5449551289610225147">Parol noto‘g‘ri</translation> <translation id="5449588825071916739">Barcha ichki oynalarni xatcho‘pga qo‘shish</translation> <translation id="5449716055534515760">Oynani &yopish</translation> +<translation id="545133051331995777">Internetga ulanmagansiz</translation> <translation id="5452446625764825792">Endi siz telefoningizdagi oxirgi rasmlar, multimedia va ilovalarni koʻra olasiz</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (internetsiz ishlaydi)</translation> <translation id="5454166040603940656"><ph name="PROVIDER" /> yordamida</translation> @@ -4781,6 +4787,7 @@ <translation id="5487521232677179737">Tarixni tozalash</translation> <translation id="5488093641312826914">“<ph name="COPIED_ITEM_NAME" />” nusxa olindi</translation> <translation id="5488508217173274228">Sinxronizatsiyani shifrlash parametrlari</translation> +<translation id="5489077378642700219"><ph name="WEBSITE" /> saytida bildirishnoma chiqishiga ruxsat berilmasin, lekin keyinroq soʻralsin</translation> <translation id="5489435190927933437"><ph name="DOMAIN" /> uchun saqlangan parollar</translation> <translation id="5490721031479690399">Bluetooth qurilmani uzish</translation> <translation id="5490798133083738649">Linux mikrofondan foydalanishiga ruxsat berish</translation> @@ -5119,6 +5126,7 @@ <translation id="5805697420284793859">Oynalar menejeri</translation> <translation id="5806447147478173900">Ochilgan saytlar ishlatgan jami xotira: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (asosiy)</translation> +<translation id="5809835394668218762"><ph name="WEBSITE" /> uchun boshqa amallar</translation> <translation id="5810603387504252966">#borealis-enabled parametri chrome://flags orqali yoqilishi lozim</translation> <translation id="5810809306422959727">Bu hisobdan ota-ona nazorati uchun foydalanish mumkin emas.</translation> <translation id="5811614940486072060">Bu faylni yuklab olish tavsiya etilmaydi, chunki u zararli bo‘lishi mumkin</translation> @@ -5133,6 +5141,7 @@ <translation id="5826395379250998812"><ph name="DEVICE_TYPE" /> qurilmasiga telefoningizni ulang. <ph name="LINK_BEGIN" />Batafsil<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Yarim shaffof</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Guruhdagi boshqa saytlarni ochish</translation> <translation id="5827733057563115968">Keyingi soʻzni taklif qilish</translation> <translation id="5828545842856466741">Profil kiritish...</translation> <translation id="5828633471261496623">Chop etilmoqda...</translation> @@ -5248,6 +5257,7 @@ <translation id="5927232971138258197">Bu kengaytma <ph name="HOST" /> saytida oʻqishi va yozishi mumkin</translation> <translation id="592740088639760830">Bu konteynerni toʻxtatish</translation> <translation id="592880897588170157">PDF fayllarni Chrome brauzerida avtomatik ochmasdan yuklab olish</translation> +<translation id="5928969282301718193">Horizcha tamom</translation> <translation id="592919310198008711">Kengaytma ustiga bosganimda</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> domeni <ph name="DEVICE_TYPE" /> qurilmasini yangilashni talab qilmoqda.</translation> <translation id="5932224571077948991">Saytda yoqimsiz yoki befoyda reklamalar chiqadi</translation> @@ -5422,6 +5432,7 @@ <translation id="6087746524533454243">Brauzer haqida sahifasini qidiryapsizmi? Bu sahifaga kiring</translation> <translation id="6087960857463881712">Hayratdagi yuz</translation> <translation id="608912389580139775">Bu sahifani Saqlangan sahifalarga kiritish uchun Bukmark belgisini bosing</translation> +<translation id="6091116443517744502">internet aloqasini tekshiring va qayta urining</translation> <translation id="6091761513005122595">Umumiy ruxsat berildi.</translation> <translation id="6093803049406781019">Profilni oʻchirish</translation> <translation id="6093888419484831006">Yangilash bekor qilinmoqda...</translation> @@ -6086,6 +6097,7 @@ <translation id="6736243959894955139">Manzil</translation> <translation id="6737393581255281855">Ochilgan maʼlumotlarni tozalash</translation> <translation id="6737663862851963468">Kerberos chiptasini olib tashlash</translation> +<translation id="6738180164164974883">Tashqi cookielarni sozlashga ruxsat berish</translation> <translation id="6738430949033571771">Hisob tekshirilmoqda...</translation> <translation id="6739923123728562974">Yorliqni ish stolida ko‘rsatish</translation> <translation id="6740234557573873150">“<ph name="FILE_NAME" />” faylini yuklab olish vaqtincha to‘xtatildi</translation> @@ -6283,6 +6295,7 @@ <translation id="691106080621596509"><ph name="SITE_GROUP_NAME" /> va unga tegishli saytlardan saqlangan barcha maʼlumot, cookie fayllar va oʻrnatilgan ilovalar tozalab tashlanadi</translation> <translation id="6911734910326569517">Xotira sarfi</translation> <translation id="6912007319859991306">SIM karta PIN kodi</translation> +<translation id="6912380255120084882">Boshqa qurilmada urining</translation> <translation id="691289340230098384">Taglavha sozlamalari</translation> <translation id="6914783257214138813">Siz eksport qilgan faylni ko‘radigan har qanday kishi parollaringizni ham ko‘ra oladi.</translation> <translation id="6916590542764765824">Kengaytmalarni boshqarish</translation> @@ -6595,6 +6608,7 @@ <translation id="7222204278952406003">Chrome – qurilmangizdagi asosiy brauzer</translation> <translation id="7222232353993864120">Email manzili:</translation> <translation id="7222235798733126207">Saytlararo axborot ulashuvi cheklovi</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{<ph name="FPS_OWNER" />ning guruhida 1 ta sayt bor}other{<ph name="FPS_OWNER" />ning guruhida {MEMBERS} ta sayt bor}}</translation> <translation id="7225082563376899794">Parollarni kiritishda Windows Hello ishlating</translation> <translation id="7225179976675429563">Tarmoq turi ko‘rsatilmagan</translation> <translation id="7227458944009118910">Quyidagi ilovalar protokol havolalarini ham qayta ishlay oladi. Boshqa ilovalar ruxsat soʻraydi.</translation> @@ -7108,6 +7122,7 @@ <translation id="7709152031285164251">Xatolik: <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Translatsiya...</translation> <translation id="7711900714716399411">Telefonni kompyuterga USB kabel orqali ulang. Telefon allaqachon ulangan boʻlsa, kabelni chiqaring va qaytadan ulang.</translation> +<translation id="7711968363685835633">Konversiya va takliflar moslashtirilishini foydalanuvchi lugʻatlari kabi faolsizlashtirish</translation> <translation id="7712739869553853093">Bosmaga razm solish oynasi</translation> <translation id="7714307061282548371"><ph name="DOMAIN" /> cookie fayllariga ruxsat berildi.</translation> <translation id="7714464543167945231">Sertifikat</translation> @@ -7180,6 +7195,7 @@ <translation id="7768770796815395237">Oʻzgartirish</translation> <translation id="7768784765476638775">Teginib tinglash</translation> <translation id="7769748505895274502">Yaqinda yopilganlarni yigʻish</translation> +<translation id="7770072242481632881">Yon panel tanlagichi</translation> <translation id="7770406201819593386">ChromeOS Flex diagnostika testlarini ishga tushirish.</translation> <translation id="7770450735129978837">Sichqonchadagi oʻng klik</translation> <translation id="7770612696274572992">Rasm boshqa qurilmadan nusxalandi</translation> @@ -7814,6 +7830,7 @@ <translation id="8353683614194668312">Ruxsatlar:</translation> <translation id="8354034204605718473">Farzandingiz PIN kodi kiritildi</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Bu qurilma allaqachon qayd qilingan. Uni qaytadan registratsiya qilish shart emas.</translation> <translation id="8357388086258943206">Linux oʻrnatilishida xatolik yuz berdi</translation> <translation id="8358685469073206162">Sahifalar tiklansinmi?</translation> <translation id="8358912028636606457">Bu qurilma varaqdagi ovozni translatsiya qila olmaydi.</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index adec96c..01afd306 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1254,6 +1254,7 @@ <translation id="2135787500304447609">&Tiếp tục</translation> <translation id="2136372518715274136">Nhập mật khẩu mới</translation> <translation id="2136476978468204130">Cụm mật khẩu bạn đã nhập không chính xác</translation> +<translation id="2137128126782078222">Không cho phép thông báo từ <ph name="WEBSITE" /></translation> <translation id="2137891579555018930">Đang chờ cấp quyền...</translation> <translation id="2139919072249842737">Nút thiết lập</translation> <translation id="2140788884185208305">Tình trạng pin</translation> @@ -2492,6 +2493,7 @@ <translation id="3281892622610078515">Các tệp và chương trình cần cách ly:</translation> <translation id="3282210178675490297">Đang chia sẻ một thẻ với <ph name="APP_NAME" /></translation> <translation id="3285322247471302225">&Tab Mới</translation> +<translation id="3285500645985761267">Cho phép các trang web liên quan xem hoạt động của bạn trong nhóm</translation> <translation id="328571385944182268">Lưu mật khẩu của bạn?</translation> <translation id="3288047731229977326">Tiện ích chạy ở chế độ nhà phát triển có thể gây hại cho máy tính của bạn. Nếu bạn không phải là nhà phát triển, bạn nên vô hiệu hóa các tiện ích này chạy trong chế độ nhà phát triển để giữ an toàn.</translation> <translation id="3289668031376215426">Tự động viết hoa</translation> @@ -2766,6 +2768,7 @@ <translation id="3541823293333232175">Ðã gán</translation> <translation id="3543393733900874979">Cập nhật không thành công (lỗi: <ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">Chữ ký X9.62 ECDSA với SHA-512</translation> +<translation id="3544058026430919413">Một công ty có thể xác định nhóm các trang web được sử dụng cookie để chia sẻ hoạt động của bạn trong nhóm. Tính năng này bị tắt trong chế độ Ẩn danh.</translation> <translation id="3544879808695557954">Tên người dùng (không bắt buộc)</translation> <translation id="354602065659584722">Đã xóa phần mềm độc hại</translation> <translation id="3547954654003013442">Cài đặt proxy</translation> @@ -2904,6 +2907,7 @@ <translation id="3681548574519135185">Vòng tròn tiêu điểm</translation> <translation id="3683524264665795342">Yêu cầu chia sẻ màn hình <ph name="APP_NAME" /></translation> <translation id="3685598397738512288">Các tùy chọn USB của Linux</translation> +<translation id="3687598459967813435">Luôn cho phép thông báo từ <ph name="WEBSITE" /></translation> <translation id="368789413795732264">Đã có lỗi khi cố gắng ghi tệp: <ph name="ERROR_TEXT" />.</translation> <translation id="3688507211863392146">Ghi vào têp và thư mục bạn mở trong ứng dụng</translation> <translation id="3688526734140524629">Thay đổi kênh</translation> @@ -4064,6 +4068,7 @@ <translation id="4779766576531456629">Đổi tên mạng di động của eSIM</translation> <translation id="4780321648949301421">Lưu trang làm...</translation> <translation id="4781443161433589743">Bạn đang dùng chế độ bảo mật mạnh nhất của Chrome</translation> +<translation id="4781584184731045253">Xoá dữ liệu và quyền</translation> <translation id="4782861709165039462">Tất cả micrô đều bị tắt bằng công tắc phần cứng của thiết bị</translation> <translation id="4785719467058219317">Bạn đang sử dụng một khóa bảo mật chưa đăng ký với trang web này</translation> <translation id="4785914069240823137">Huỷ cắt</translation> @@ -4744,6 +4749,7 @@ <translation id="5449551289610225147">Mật khẩu không hợp lệ</translation> <translation id="5449588825071916739">Đánh dấu trang tất cả các thẻ</translation> <translation id="5449716055534515760">Đóng cửa &sổ</translation> +<translation id="545133051331995777">Không có kết nối mạng</translation> <translation id="5452446625764825792">Giờ đây, bạn có thể xem ứng dụng, nội dung nghe nhìn và ảnh gần đây có trên điện thoại của mình.</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (hoạt động khi không có mạng)</translation> <translation id="5454166040603940656">với <ph name="PROVIDER" /></translation> @@ -4787,6 +4793,7 @@ <translation id="5487521232677179737">Xóa dữ liệu</translation> <translation id="5488093641312826914">Đã sao chép '<ph name="COPIED_ITEM_NAME" />'</translation> <translation id="5488508217173274228">Các tùy chọn mã hóa đồng bộ hóa</translation> +<translation id="5489077378642700219">Không cho phép thông báo từ <ph name="WEBSITE" /> nhưng có thể hỏi sau</translation> <translation id="5489435190927933437">Các mật khẩu đã lưu cho <ph name="DOMAIN" /></translation> <translation id="5490721031479690399">Ngắt kết nối thiết bị Bluetooth</translation> <translation id="5490798133083738649">Cho phép Linux sử dụng micrô của bạn</translation> @@ -5124,6 +5131,7 @@ <translation id="5805697420284793859">Trình quản lý cửa sổ</translation> <translation id="5806447147478173900">Tổng bộ nhớ mà các trang web hiển thị sử dụng: <ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (Mặc định)</translation> +<translation id="5809835394668218762">Thao tác khác cho <ph name="WEBSITE" /></translation> <translation id="5810603387504252966">Bạn phải bật #borealis-enabled trong chrome://flags</translation> <translation id="5810809306422959727">Tài khoản này không đủ điều kiện để thêm các quyền kiểm soát của cha mẹ</translation> <translation id="5811614940486072060">Tệp này không được tải xuống theo cách thông thường và có thể nguy hiểm</translation> @@ -5138,6 +5146,7 @@ <translation id="5826395379250998812">Hãy kết nối <ph name="DEVICE_TYPE" /> với điện thoại của bạn. <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation> <translation id="5826993284769733527">Nửa trong suốt</translation> <translation id="5827266244928330802">Safari</translation> +<translation id="5827591412833386477">Hiển thị các trang web trong cùng một nhóm</translation> <translation id="5827733057563115968">Dự đoán từ tiếp theo</translation> <translation id="5828545842856466741">Thêm hồ sơ...</translation> <translation id="5828633471261496623">Đang in...</translation> @@ -5253,6 +5262,7 @@ <translation id="5927232971138258197">Tiện ích này có thể đọc và thay đổi <ph name="HOST" /></translation> <translation id="592740088639760830">Dừng vùng chứa này</translation> <translation id="592880897588170157">Tải tệp PDF xuống thay vì tự động mở trong Chrome</translation> +<translation id="5928969282301718193">Tất cả đã hoàn tất</translation> <translation id="592919310198008711">Khi tôi nhấp vào tiện ích</translation> <translation id="5932209916647644605"><ph name="MANAGER" /> yêu cầu bạn cập nhật ngay <ph name="DEVICE_TYPE" /> của mình.</translation> <translation id="5932224571077948991">Trang web hiển thị quảng cáo xâm nhập hoặc quảng cáo gây hiểu nhầm</translation> @@ -5426,6 +5436,7 @@ <translation id="6087746524533454243">Bạn đang tìm trình duyệt giới thiệu trang? Hãy truy cập</translation> <translation id="6087960857463881712">Khuôn mặt vui nhộn</translation> <translation id="608912389580139775">Để thêm trang này vào danh sách đọc, hãy nhấp vào biểu tượng Dấu trang</translation> +<translation id="6091116443517744502">vui lòng kiểm tra kết nối Internet của bạn và thử lại</translation> <translation id="6091761513005122595">Đã kết nối thành công với thư mục chia sẻ.</translation> <translation id="6093803049406781019">Xóa hồ sơ</translation> <translation id="6093888419484831006">Đang hủy cập nhật...</translation> @@ -6088,6 +6099,7 @@ <translation id="6736243959894955139">Địa chỉ</translation> <translation id="6737393581255281855">Xoá dữ liệu hiển thị?</translation> <translation id="6737663862851963468">Xóa vé Kerberos</translation> +<translation id="6738180164164974883">Cho phép đặt cookie của bên thứ ba</translation> <translation id="6738430949033571771">Đang xác minh tài khoản...</translation> <translation id="6739923123728562974">Hiển thị lối tắt trên màn hình</translation> <translation id="6740234557573873150">Đã tạm dừng <ph name="FILE_NAME" /></translation> @@ -6285,6 +6297,7 @@ <translation id="691106080621596509">Thao tác này sẽ xóa toàn bộ dữ liệu và cookie lưu trữ trong <ph name="SITE_GROUP_NAME" /> cũng như trong mọi trang web và ứng dụng đã cài đặt thuộc nhóm này</translation> <translation id="6911734910326569517">Mức sử dụng bộ nhớ</translation> <translation id="6912007319859991306">Mã PIN của SIM di động</translation> +<translation id="6912380255120084882">Thử dùng một thiết bị khác</translation> <translation id="691289340230098384">Tuỳ chọn phụ đề</translation> <translation id="6914783257214138813">Bất cứ ai có thể xem tệp đã xuất đều có thể biết mật khẩu của bạn.</translation> <translation id="6916590542764765824">Quản lý các tiện ích</translation> @@ -6595,6 +6608,7 @@ <translation id="7222204278952406003">Chrome là trình duyệt mặc định của bạn</translation> <translation id="7222232353993864120">Địa chỉ Email</translation> <translation id="7222235798733126207">Giới hạn hoạt động chia sẻ giữa các trang</translation> +<translation id="722408235435815623">{MEMBERS,plural, =1{1 trang web trong nhóm của <ph name="FPS_OWNER" />}other{{MEMBERS} trang web trong nhóm của <ph name="FPS_OWNER" />}}</translation> <translation id="7225082563376899794">Sử dụng Windows Hello khi điền mật khẩu</translation> <translation id="7225179976675429563">Thiếu loại mạng</translation> <translation id="7227458944009118910">Những ứng dụng được liệt kê bên dưới cũng có thể xử lý các đường liên kết giao thức. Các ứng dụng khác sẽ yêu cầu bạn cấp quyền.</translation> @@ -7107,6 +7121,7 @@ <translation id="7709152031285164251">Không thành công - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">&Truyền...</translation> <translation id="7711900714716399411">Kết nối điện thoại với máy tính bằng cáp USB. Nếu đã kết nối điện thoại từ trước, hãy rút cáp ra rồi cắm lại.</translation> +<translation id="7711968363685835633">Tắt tính năng chuyển đổi và đề xuất được cá nhân hoá cũng như từ điển người dùng</translation> <translation id="7712739869553853093">Hộp thoại Xem trước bản in</translation> <translation id="7714307061282548371">Cho phép các cookie từ <ph name="DOMAIN" /></translation> <translation id="7714464543167945231">Chứng chỉ</translation> @@ -7178,6 +7193,7 @@ <translation id="7768770796815395237">Thay đổi</translation> <translation id="7768784765476638775">Chọn để nói</translation> <translation id="7769748505895274502">Thu gọn thẻ đã đóng gần đây</translation> +<translation id="7770072242481632881">Bộ chọn bảng điều khiển bên</translation> <translation id="7770406201819593386">Chạy quá trình kiểm tra chẩn đoán ChromeOS Flex.</translation> <translation id="7770450735129978837">Nhấn chuột phải</translation> <translation id="7770612696274572992">Hình ảnh được sao chép từ thiết bị khác</translation> @@ -7814,6 +7830,7 @@ <translation id="8353683614194668312">Tiện ích/ứng dụng có thể:</translation> <translation id="8354034204605718473">Đã thêm mã PIN của con bạn</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /></translation> +<translation id="8356409598322585307">Bạn đã đăng ký thiết bị này. Bạn không phải đăng ký lại.</translation> <translation id="8357388086258943206">Lỗi khi cài đặt Linux</translation> <translation id="8358685469073206162">Bạn có muốn khôi phục trang không?</translation> <translation id="8358912028636606457">Thiết bị này không hỗ trợ truyền âm thanh của thẻ.</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 7bb7b41..c6f8c9a 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1879,6 +1879,7 @@ <translation id="2721334646575696520">Microsoft Edge</translation> <translation id="2721695630904737430">受监管用户已被您的管理员停用。</translation> <translation id="2722540561488096675">您的设备将在 <ph name="TIME_LEFT" />后关闭。届时,请先拔掉 USB,再重新开启您的设备。然后,您便可开始使用 <ph name="DEVICE_OS" /> 了。</translation> +<translation id="2722547199758472013">ID:<ph name="EXTENSION_ID" /></translation> <translation id="2724841811573117416">WebRTC日志</translation> <translation id="272488616838512378">单位换算</translation> <translation id="2725200716980197196">网络连接已恢复</translation> @@ -3050,6 +3051,7 @@ <translation id="3828029223314399057">搜索书签</translation> <translation id="3828953470056652895">我已阅读并同意接受 <ph name="BEGIN_LINK1" />Google 服务条款<ph name="END_LINK1" />、<ph name="BEGIN_LINK2" />Chrome 和 Chrome 操作系统附加服务条款<ph name="END_LINK2" />以及 <ph name="BEGIN_LINK3" />Play 服务条款<ph name="END_LINK3" />。</translation> <translation id="3829765597456725595">SMB 文件共享</translation> +<translation id="3830268140528557982">日期:<ph name="RP_MAIN_ETLD_PLUS_ONE" /></translation> <translation id="3830654885961023588">{NUM_EXTENSIONS,plural, =1{您的管理员重新开启了 1 个可能有害的扩展程序}other{您的管理员重新开启了 {NUM_EXTENSIONS} 个可能有害的扩展程序}}</translation> <translation id="3831436149286513437">Google 云端硬盘搜索建议</translation> <translation id="3834728400518755610">您必须关闭 Linux 才能更改麦克风设置。请关闭 Linux 以继续操作。</translation> @@ -5174,6 +5176,7 @@ <translation id="5884474295213649357">此标签页已连接到 USB 设备。</translation> <translation id="5885314688092915589">贵组织将管理这份资料</translation> <translation id="5886009770935151472">手指 1</translation> +<translation id="5886112770923972514">连接并快速设置附近的快速配对设备</translation> <translation id="5886384907280980632">立即关闭</translation> <translation id="5889282057229379085">中级 CA 证书数目的上限为:<ph name="NUM_INTERMEDIATE_CA" /></translation> <translation id="5891688036610113830">首选的 WLAN 网络</translation> @@ -7764,6 +7767,7 @@ <translation id="8338952601723052325">开发者网站</translation> <translation id="833986336429795709">要打开此链接,请选择一个应用</translation> <translation id="8340547030807793004">显示可对“<ph name="DEVICE" />”执行的更多操作</translation> +<translation id="8341557223534936723">{NUM_SITES,plural, =1{查看最近发送了很多通知的 <ph name="BEGIN_BOLD" />1 个网站<ph name="END_BOLD" />}other{查看最近发送了很多通知的 <ph name="BEGIN_BOLD" />{NUM_SITES} 个网站<ph name="END_BOLD" />}}</translation> <translation id="8342221978608739536">没试过</translation> <translation id="8342861492835240085">选择一个集合</translation> <translation id="8345848587667658367">您现在可以查看手机中近期的照片、媒体、通知和应用</translation> @@ -8758,6 +8762,7 @@ <translation id="995782501881226248">YouTube</translation> <translation id="996250603853062861">正在建立安全连接...</translation> <translation id="996803490569799917">查看与亲朋好友相聚时刻的回忆集锦</translation> +<translation id="997143476478634194">网站会在您访问时自动采用此设置。网站通常会传送通知,以便您知悉重大新闻或聊天消息。</translation> <translation id="99731366405731005">您需要开启 <ph name="LINK1_BEGIN" />Chrome 同步<ph name="LINK1_END" />才能使用 Wi-Fi 同步功能。<ph name="LINK2_BEGIN" />了解详情<ph name="LINK2_END" /></translation> <translation id="998747458861718449">检查(&N)</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 5b97fee..a350c103 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1254,7 +1254,7 @@ <translation id="2135787500304447609">繼續(&R)</translation> <translation id="2136372518715274136">輸入新密碼</translation> <translation id="2136476978468204130">您輸入的密碼短語不正確</translation> -<translation id="2137128126782078222">不允許接收來自 <ph name="WEBSITE" /> 的通知</translation> +<translation id="2137128126782078222">唔批准接收嚟自 <ph name="WEBSITE" /> 嘅通知</translation> <translation id="2137891579555018930">正在等待許可…</translation> <translation id="2139919072249842737">設定按鈕</translation> <translation id="2140788884185208305">電池壽命</translation> @@ -2493,7 +2493,7 @@ <translation id="3281892622610078515">要隔離的檔案和程式:</translation> <translation id="3282210178675490297">正在與 <ph name="APP_NAME" /> 共用此標籤</translation> <translation id="3285322247471302225">新分頁(&T)</translation> -<translation id="3285500645985761267">允許相關網站查看你在群組中的活動</translation> +<translation id="3285500645985761267">允許相關網站查看您在群組中的活動</translation> <translation id="328571385944182268">要儲存密碼嗎?</translation> <translation id="3288047731229977326">在開發人員模式中執行擴充功能可能會損害您的電腦。如果您不是開發人員,最好在開發人員模式中停用這些擴充功能,以策安全。</translation> <translation id="3289668031376215426">自動大寫</translation> @@ -2768,7 +2768,7 @@ <translation id="3541823293333232175">已指派</translation> <translation id="3543393733900874979">更新失敗 (錯誤:<ph name="ERROR_NUMBER" />)</translation> <translation id="3543597750097719865">使用 SHA-1 的 X9.62 ECDSA 簽名</translation> -<translation id="3544058026430919413">公司可定義網站群組,指定哪些網站能夠使用 Cookie 分享你在群組中的活動。網站群組不會在無痕模式下啟用。</translation> +<translation id="3544058026430919413">公司可定義網站群組,指定哪些網站可使用 Cookie 分享您在群組中的活動。網站群組不會在無痕模式下啟用。</translation> <translation id="3544879808695557954">使用者名稱 (選填)</translation> <translation id="354602065659584722">已移除有害的軟件</translation> <translation id="3547954654003013442">Proxy 設定</translation> @@ -2907,7 +2907,7 @@ <translation id="3681548574519135185">突顯環</translation> <translation id="3683524264665795342"><ph name="APP_NAME" /> 要求共用螢幕</translation> <translation id="3685598397738512288">Linux 的 USB 偏好設定</translation> -<translation id="3687598459967813435">一律允許接收來自 <ph name="WEBSITE" /> 的通知</translation> +<translation id="3687598459967813435">一律批准接收嚟自 <ph name="WEBSITE" /> 嘅通知</translation> <translation id="368789413795732264">嘗試寫入檔案時發生錯誤:<ph name="ERROR_TEXT" />。</translation> <translation id="3688507211863392146">寫入您在應用程式中開啟的檔案和資料夾</translation> <translation id="3688526734140524629">變更版本</translation> @@ -4749,7 +4749,7 @@ <translation id="5449551289610225147">密碼無效</translation> <translation id="5449588825071916739">將所有分頁加入書籤</translation> <translation id="5449716055534515760">關閉視窗(&D)</translation> -<translation id="545133051331995777">沒有網路連線</translation> +<translation id="545133051331995777">沒有網絡連線</translation> <translation id="5452446625764825792">您現可查看手機最近的相片、媒體和應用程式</translation> <translation id="5452976525201205853"><ph name="LANGUAGE" /> (可離線使用)</translation> <translation id="5454166040603940656">與 <ph name="PROVIDER" /></translation> @@ -4793,7 +4793,7 @@ <translation id="5487521232677179737">清除資料</translation> <translation id="5488093641312826914">已複製「<ph name="COPIED_ITEM_NAME" />」</translation> <translation id="5488508217173274228">同步加密選項</translation> -<translation id="5489077378642700219">不允許接收來自 <ph name="WEBSITE" /> 的通知,但稍後再詢問</translation> +<translation id="5489077378642700219">唔批准接收嚟自 <ph name="WEBSITE" /> 嘅通知,但遲啲再問我</translation> <translation id="5489435190927933437"><ph name="DOMAIN" /> 的已儲存密碼</translation> <translation id="5490721031479690399">解除連結藍牙裝置</translation> <translation id="5490798133083738649">允許 Linux 存取您的麥克風</translation> @@ -5129,7 +5129,7 @@ <translation id="5805697420284793859">視窗管理員</translation> <translation id="5806447147478173900">已顯示網站使用的總儲存空間:<ph name="TOTAL_USAGE" /></translation> <translation id="5806773519584576205">0° (預設)</translation> -<translation id="5809835394668218762">可對 <ph name="WEBSITE" /> 執行的其他動作</translation> +<translation id="5809835394668218762">可以對 <ph name="WEBSITE" /> 執行嘅其他操作</translation> <translation id="5810603387504252966">必須前往 chrome://flags 啟用 #borealis-enabled</translation> <translation id="5810809306422959727">此帳戶不符合家長監控設定的資格</translation> <translation id="5811614940486072060">此檔案不常下載,代表此檔案可能不安全</translation> @@ -5144,7 +5144,7 @@ <translation id="5826395379250998812">將 <ph name="DEVICE_TYPE" /> 連結至您的手機。<ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation> <translation id="5826993284769733527">半透明</translation> <translation id="5827266244928330802">Safari</translation> -<translation id="5827591412833386477">顯示屬於同一個群組的網站</translation> +<translation id="5827591412833386477">顯示屬於同一群組的網站</translation> <translation id="5827733057563115968">下一字預測</translation> <translation id="5828545842856466741">新增設定檔…</translation> <translation id="5828633471261496623">列印中…</translation> @@ -5433,7 +5433,7 @@ <translation id="6087746524533454243">要查看瀏覽器的「關於」頁面嗎?請前往</translation> <translation id="6087960857463881712">開懷大笑</translation> <translation id="608912389580139775">如要將網頁加入您的閱讀清單,請按一下「書籤」圖示</translation> -<translation id="6091116443517744502">請檢查網際網路連線,然後再試一次</translation> +<translation id="6091116443517744502">請檢查您的互聯網連線,然後再試一次</translation> <translation id="6091761513005122595">已成功連接共用裝置。</translation> <translation id="6093803049406781019">刪除設定檔</translation> <translation id="6093888419484831006">正在取消更新…</translation> @@ -6295,7 +6295,7 @@ <translation id="691106080621596509">此操作會清除 <ph name="SITE_GROUP_NAME" /> 儲存的所有資料和 Cookie、包含的所有網站,以及所有安裝的應用程式</translation> <translation id="6911734910326569517">記憶體使用量</translation> <translation id="6912007319859991306">流動網絡 SIM 卡 PIN</translation> -<translation id="6912380255120084882">試試其他裝置</translation> +<translation id="6912380255120084882">嘗試使用其他裝置</translation> <translation id="691289340230098384">字幕偏好設定</translation> <translation id="6914783257214138813">任何能查看匯出檔案的使用者都可看到您的密碼。</translation> <translation id="6916590542764765824">管理擴充功能</translation> @@ -7119,7 +7119,7 @@ <translation id="7709152031285164251">失敗 - <ph name="INTERRUPT_REASON" /></translation> <translation id="7710568461918838723">和 Cast…</translation> <translation id="7711900714716399411">使用 USB 連接線將手機連接電腦。如果手機已連接電腦,請拔除連接線再重新連接。</translation> -<translation id="7711968363685835633">停用個人化轉換、建議和使用者字典</translation> +<translation id="7711968363685835633">停用個人化轉換、建議和用戶字典</translation> <translation id="7712739869553853093">列印預覽對話框</translation> <translation id="7714307061282548371">已允許來自 <ph name="DOMAIN" /> 的 Cookie</translation> <translation id="7714464543167945231">憑證</translation> @@ -7191,7 +7191,7 @@ <translation id="7768770796815395237">變更</translation> <translation id="7768784765476638775">選取以朗讀</translation> <translation id="7769748505895274502">收合最近關閉的分頁</translation> -<translation id="7770072242481632881">側邊面板選取器</translation> +<translation id="7770072242481632881">側面板選取器</translation> <translation id="7770406201819593386">執行 ChromeOS Flex 診斷測試。</translation> <translation id="7770450735129978837">點擊滑鼠右鍵</translation> <translation id="7770612696274572992">從其他裝置複製的圖片</translation> @@ -7828,7 +7828,7 @@ <translation id="8353683614194668312">它可以:</translation> <translation id="8354034204605718473">已新增您子女的 PIN</translation> <translation id="8356197132883132838"><ph name="TITLE" /> - <ph name="COUNT" /> 個</translation> -<translation id="8356409598322585307">你已註冊這部裝置,因此不必再次註冊。</translation> +<translation id="8356409598322585307">您已註冊此裝置,因此無需再註冊。</translation> <translation id="8357388086258943206">安裝 Linux 時發生錯誤</translation> <translation id="8358685469073206162">您要還原網頁嗎?</translation> <translation id="8358912028636606457">此裝置不支援投放分頁音訊。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index 69bc092..b49061c 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -20,7 +20,7 @@ <translation id="1302523850133262269">ကျေးဇူးပြုပြီး Chrome က စနစ်၏ နောက်ဆုံး မွမ်းမံမှုများကို တပ်ဆင်ပေးနေတာကို စောင့်ပါ။</translation> <translation id="1335640173511558774">ဤစက်ကိုမသုံးမီ အောက်ပါ ‘ဝန်ဆောင်မှုစည်းမျဉ်းများ’ ကို ဖတ်ရှုပြီး လက်ခံရန် <ph name="MANAGER" /> က သတ်မှတ်ထားသည်။ ဤစည်းမျဉ်းများက ‘Google ChromeOS Flex စည်းမျဉ်းများ’ ကို ထပ်ထည့်ခြင်း၊ မွမ်းမံခြင်း သို့မဟုတ် ကန့်သတ်ခြင်း မရှိပါ။</translation> <translation id="1363996462118479832">လက်မှတ်ထိုးဝင်စဉ် အမှားဖြစ်သွားသောကြောင့် ChromeOS က သင့်ဒေတာကို စင့်ခ်လုပ်၍မရပါ။</translation> -<translation id="137466361146087520">Google Chrome စမ်းသပ်ဆော့ဖ်ဝဲ</translation> +<translation id="137466361146087520">Google Chrome စမ်းသပ်</translation> <translation id="1399397803214730675">ဒီကွန်ပျူတာ ထဲမှာ ပိုပြီး နောက်ကျသော Google Chrome ဗားရှင်း ရှိနေပါပြီ။ ဆော့ဝဲ အလုပ်မလုပ်လျှင်၊ ကျေးဇူးပြုပြီး Google Chrome ကို ဖြုတ်လိုက်ပြီး ထပ်စမ်းကြည့်ပါ။</translation> <translation id="139993653570221430">Chrome ဆက်တင်များတွင် အချိန်မရွေး စိတ်အလိုကျ ပြောင်းလဲနိုင်သည်။ လက်ရှိကြော်ငြာ ပြသသည့်နည်းလမ်းနှင့်တွဲ၍ စမ်းသပ်မှုများကို ပြုလုပ်သဖြင့် ပြောင်းလဲမှုများကို ချက်ချင်းမြင်နိုင်မည်မဟုတ်ပါ။</translation> <translation id="1434626383986940139">Chrome ၏ Canary စမ်းသပ်အက်ပ်များ</translation> @@ -51,7 +51,7 @@ <translation id="1812689907177901597">၎င်းကိုပိတ်ခြင်းဖြင့် Chrome တွင် လက်မှတ်ထိုးမဝင်ဘဲ Gmail ကဲ့သို့ Google ဝဘ်ဆိုက်များသို့ လက်မှတ်ထိုးဝင်နိုင်ပါသည်</translation> <translation id="1860536484129686729">ဤဝဘ်ဆိုက်အတွက် Chrome သည် သင်၏ကင်မရာကို အသုံးပြုခွင့်ရရန် လိုအပ်ပါသည်</translation> <translation id="1873233029667955273">Google Chrome သည် သင်၏ မူရင်းဘရောင်ဇာ မဟုတ်ပါ</translation> -<translation id="1874309113135274312">Google Chrome စမ်းသပ်ဆော့ဖ်ဝဲ (mDNS-In)</translation> +<translation id="1874309113135274312">Google Chrome စမ်းသပ် (mDNS-In)</translation> <translation id="1877026089748256423">Chrome မှာ ဟောင်းသွားပြီ</translation> <translation id="1919130412786645364">Chrome သို့ လက်မှတ်ထိုးဝင်ခွင့် ပေးပါ</translation> <translation id="1952239763774043237">နောက်ပိုင်းထွက်မည့် Google Chrome အပ်ဒိတ်များ ရယူရန် macOS 10.13 နှင့်အထက် လိုအပ်ပါမည်။ ဤကွန်ပျူတာက macOS 10.12 အသုံးပြုနေသည်။</translation> @@ -290,7 +290,7 @@ <translation id="6785872064505734160">Chrome ရှိ Google Assistant က ဝဘ်ဆိုက်များတွင် သင့်အတွက် အလိုအလျောက် ဖြည့်ပေးနိုင်သည်</translation> <translation id="683440813066116847">Google Chrome ကိန္နရီ အတွက် mDNS သွားလာမှု ခွင့်ပြုရေး အဝင် စည်းကမ်းချက်</translation> <translation id="6881299373831449287">Chrome ကို အပ်ဒိတ်လုပ်နေသည်</translation> -<translation id="6885412569789873916">Chrome စမ်းသပ်ဆော့ဖ်ဝဲ အက်ပ်များ</translation> +<translation id="6885412569789873916">Chrome စမ်းသပ် အက်ပ်များ</translation> <translation id="6933858244219479645">ChromeOS စနစ်</translation> <translation id="6943584222992551122">ဤပုဂ္ဂိုလ်၏ ကြည့်ရှုမှုဒေတာများကို ဤကိရိယာမှနေ၍ ဖျက်လိုက်ပါမည်။ ဒေတာကို ပြန်လည်ရယူရန် <ph name="USER_EMAIL" /> အဖြစ် Chrome သို့ လက်မှတ်ထိုးဝင်ပါ။</translation> <translation id="6967962315388095737">Google Chrome စမ်းသပ်ဆော့ဖ်ဝဲက mDNS အသွားအလာကို ခွင့်ပြုပေးနိုင်ရန်အတွက် ချမှတ်ထားသော အတွင်းစည်းမျဉ်း။</translation>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 708452c7d..0238503 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -3620,6 +3620,11 @@ flag_descriptions::kWebrtcAnalogAgcClippingControlName, flag_descriptions::kWebrtcAnalogAgcClippingControlDescription, kOsDesktop, FEATURE_VALUE_TYPE(features::kWebRtcAnalogAgcClippingControl)}, + {"enable-webrtc-allow-input-volume-adjustment", + flag_descriptions::kWebRtcAllowInputVolumeAdjustmentName, + flag_descriptions::kWebRtcAllowInputVolumeAdjustmentDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(features::kWebRtcAllowInputVolumeAdjustment)}, {"enable-webrtc-hide-local-ips-with-mdns", flag_descriptions::kWebrtcHideLocalIpsWithMdnsName, flag_descriptions::kWebrtcHideLocalIpsWithMdnsDecription, kOsDesktop, @@ -8578,6 +8583,12 @@ blink::features:: kThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframes)}, + {"enable-new-base-url-inheritance-behavior", + flag_descriptions::kNewBaseUrlInheritanceBehaviorName, + flag_descriptions::kNewBaseUrlInheritanceBehaviorDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kNewBaseUrlInheritanceBehavior)}, + #if BUILDFLAG(IS_CHROMEOS_ASH) {"enable-input-in-diagnostics-app", flag_descriptions::kEnableInputInDiagnosticsAppName, @@ -9648,13 +9659,6 @@ "ServiceWorkerSkipIgnorableFetchHandler")}, #if BUILDFLAG(IS_ANDROID) - {"reduce-gpu-priority-on-background", - flag_descriptions::kReduceGpuPriorityOnBackgroundName, - flag_descriptions::kReduceGpuPriorityOnBackgroundDescription, kOsAndroid, - FEATURE_VALUE_TYPE(::features::kReduceGpuPriorityOnBackground)}, -#endif - -#if BUILDFLAG(IS_ANDROID) {"binding-manager-use-not-perceptible-binding", flag_descriptions::kBindingManagerUseNotPerceptibleBindingName, flag_descriptions::kBindingManagerUseNotPerceptibleBindingDescription,
diff --git a/chrome/browser/android/webapps/OWNERS b/chrome/browser/android/webapps/OWNERS index 413ef7a..9094dac 100644 --- a/chrome/browser/android/webapps/OWNERS +++ b/chrome/browser/android/webapps/OWNERS
@@ -1,2 +1,3 @@ dominickn@chromium.org +eirage@chromium.org hartmanng@chromium.org
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index 4e62123..400ae43c 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -3365,7 +3365,7 @@ ~DownloadManagerWaiter() override { download_manager_->RemoveObserver(this); } void WaitForInitialized() { - if (initialized_) + if (initialized_ || download_manager_->IsManagerInitialized()) return; base::RunLoop run_loop; quit_closure_ = run_loop.QuitClosure(); @@ -3494,10 +3494,6 @@ content::DownloadManager* download_manager = web_contents->GetBrowserContext()->GetDownloadManager(); - std::unique_ptr<content::DownloadTestObserver> interrupted_observer( - new content::DownloadTestObserverInterrupted( - download_manager, 2, - content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); scoped_refptr<content::TestFileErrorInjector> error_injector( content::TestFileErrorInjector::Create(download_manager)); @@ -3508,22 +3504,30 @@ error_info.stream_offset = 0; error_injector->InjectError(error_info); - EXPECT_TRUE(content::ExecuteScript( - web_contents, - base::StringPrintf( - "startDownload('first', '%s?cookie=first')", - embedded_test_server()->GetURL(kDownloadPathPrefix).spec().c_str()))); + auto download_op = [&](std::string cookie) { + // DownloadTestObserverInterrupted does not seem to reliably wait for + // multiple failed downloads, so we perform one download at a time. + content::DownloadTestObserverInterrupted interrupted_observer( + download_manager, 1, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); - // Note that the second webview uses an in-memory partition. - EXPECT_TRUE(content::ExecuteScript( - web_contents, - base::StringPrintf( - "startDownload('second', '%s?cookie=second')", - embedded_test_server()->GetURL(kDownloadPathPrefix).spec().c_str()))); + EXPECT_TRUE(content::ExecuteScript( + web_contents, + base::StringPrintf( + "startDownload('%s', '%s?cookie=%s')", cookie.c_str(), + embedded_test_server()->GetURL(kDownloadPathPrefix).spec().c_str(), + cookie.c_str()))); + + // This maps to DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED. + interrupted_observer.WaitForFinished(); + }; // Both downloads should fail due to the error that was injected above to the - // download manager. This maps to DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED. - interrupted_observer->WaitForFinished(); + // download manager. + download_op("first"); + + // Note that the second webview uses an in-memory partition. + download_op("second"); // Wait for both downloads to be stored. task_runner->FastForwardUntilNoTasksRemain(); @@ -3531,19 +3535,7 @@ content::EnsureCookiesFlushed(profile()); } -// TODO(crbug.com/994789): Flaky on MSan, Linux, and ChromeOS. -// TODO(crbug.com/1204299): Flaky on Windows. Consistently failing on Mac. -#if defined(MEMORY_SANITIZER) || BUILDFLAG(IS_LINUX) || \ - BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) -#define MAYBE_DownloadCookieIsolation_CrossSession \ - DISABLED_DownloadCookieIsolation_CrossSession -#else -#define MAYBE_DownloadCookieIsolation_CrossSession \ - DownloadCookieIsolation_CrossSession -#endif // !BUILDFLAG(IS_CHROMEOS_ASH) - -IN_PROC_BROWSER_TEST_P(WebViewTest, - MAYBE_DownloadCookieIsolation_CrossSession) { +IN_PROC_BROWSER_TEST_P(WebViewTest, DownloadCookieIsolation_CrossSession) { embedded_test_server()->RegisterRequestHandler( base::BindRepeating(&HandleDownloadRequestWithCookie)); ASSERT_TRUE(StartEmbeddedTestServer()); // For serving guest pages. @@ -3594,20 +3586,21 @@ download->GetRerouteInfo())); } - std::unique_ptr<content::DownloadTestObserver> completion_observer( - new content::DownloadTestObserverTerminal( - download_manager, 2, - content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL)); + content::DownloadTestObserverTerminal completion_observer( + download_manager, 2, + content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL); for (auto* download : downloads) { ASSERT_TRUE(download->CanResume()); ASSERT_TRUE(download->GetFullPath().empty()); - EXPECT_EQ(download::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, - download->GetLastReason()); + ASSERT_TRUE(download::DOWNLOAD_INTERRUPT_REASON_CRASH == + download->GetLastReason() || + download::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED == + download->GetLastReason()); download->Resume(true); } - completion_observer->WaitForFinished(); + completion_observer.WaitForFinished(); // Of the two downloads, ?cookie=first will succeed and ?cookie=second will // fail. The latter fails because the underlying storage partition was not
diff --git a/chrome/browser/ash/account_manager/account_manager_ui_impl.cc b/chrome/browser/ash/account_manager/account_manager_ui_impl.cc index 4bb9967..de5ced5 100644 --- a/chrome/browser/ash/account_manager/account_manager_ui_impl.cc +++ b/chrome/browser/ash/account_manager/account_manager_ui_impl.cc
@@ -7,13 +7,11 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/settings_window_manager_chromeos.h" #include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h" -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h" #include "components/account_manager_core/account_addition_options.h" namespace ash { -using ::chromeos::InlineLoginDialogChromeOS; - AccountManagerUIImpl::AccountManagerUIImpl() = default; AccountManagerUIImpl::~AccountManagerUIImpl() = default;
diff --git a/chrome/browser/ash/arc/auth/arc_auth_service.cc b/chrome/browser/ash/arc/auth/arc_auth_service.cc index fd180b0..ef35ae2 100644 --- a/chrome/browser/ash/arc/auth/arc_auth_service.cc +++ b/chrome/browser/ash/arc/auth/arc_auth_service.cc
@@ -40,7 +40,7 @@ #include "chrome/browser/ui/app_list/arc/arc_data_removal_dialog.h" #include "chrome/browser/ui/settings_window_manager_chromeos.h" #include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h" -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h" #include "chrome/common/webui_url_constants.h" #include "components/account_manager_core/account_manager_facade.h" #include "components/account_manager_core/chromeos/account_manager_facade_factory.h"
diff --git a/chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.cc b/chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.cc index 39d82c4..7b9d6b7 100644 --- a/chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.cc +++ b/chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.cc
@@ -5,6 +5,10 @@ #include "chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.h" #include "chrome/browser/ash/arc/pip/arc_pip_bridge.h" +#include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h" +#include "chromeos/ui/base/window_properties.h" +#include "chromeos/ui/base/window_state_type.h" +#include "ui/aura/window.h" namespace arc { @@ -46,6 +50,17 @@ return nullptr; } +absl::optional<gfx::Rect> +ArcPictureInPictureWindowControllerImpl::GetWindowBounds() { + for (auto* window : ChromeShelfController::instance()->GetArcWindows()) { + if (window->GetProperty(chromeos::kWindowStateTypeKey) == + chromeos::WindowStateType::kPip) { + return window->GetBoundsInScreen(); + } + } + return absl::nullopt; +} + content::WebContents* ArcPictureInPictureWindowControllerImpl::GetChildWebContents() { return nullptr;
diff --git a/chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.h b/chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.h index 0ee482d..e5d7e27 100644 --- a/chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.h +++ b/chrome/browser/ash/arc/pip/arc_picture_in_picture_window_controller_impl.h
@@ -40,6 +40,7 @@ void CloseAndFocusInitiator() override; void OnWindowDestroyed(bool should_pause_video) override; content::WebContents* GetWebContents() override; + absl::optional<gfx::Rect> GetWindowBounds() override; content::WebContents* GetChildWebContents() override; private:
diff --git a/chrome/browser/ash/crosapi/local_printer_ash.cc b/chrome/browser/ash/crosapi/local_printer_ash.cc index d85d2ce2..72de4ff1 100644 --- a/chrome/browser/ash/crosapi/local_printer_ash.cc +++ b/chrome/browser/ash/crosapi/local_printer_ash.cc
@@ -109,7 +109,7 @@ const chromeos::Printer& printer, mojom::LocalPrinter::GetCapabilityCallback callback, ash::printing::oauth2::StatusCode status, - const std::string& /* access_token */) { + std::string /* access_token */) { if (status != ash::printing::oauth2::StatusCode::kOK) { // An error occurred. std::move(callback).Run(nullptr);
diff --git a/chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.cc b/chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.cc index 7356287..68270bb 100644 --- a/chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.cc +++ b/chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.cc
@@ -18,6 +18,7 @@ #include "base/run_loop.h" #include "base/strings/string_number_conversions.h" #include "base/test/bind.h" +#include "chrome/common/chrome_switches.h" #include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/platform/named_platform_channel.h" @@ -66,6 +67,12 @@ command_line.AppendSwitchASCII(ash::switches::kLacrosMojoSocketForTesting, socket_path); + // Sets a user data dir path. + CHECK(user_data_dir_.CreateUniqueTempDir()); + command_line.AppendSwitchPath(switches::kUserDataDir, + user_data_dir_.GetPath()); + command_line.AppendSwitch(ash::switches::kUseMyFilesInUserDataDirForTesting); + // Waits for socket connection to establish. // TODO(crbug.com/1368029): Separate logs generated during setup from those // generated during test. @@ -122,10 +129,6 @@ return g_instance; } -mojo::Remote<mojom::Crosapi>& AshCrosapiTestEnv::GetCrosapiRemote() { - return crosapi_remote_; -} - bool AshCrosapiTestEnv::IsValid() { return process_.IsValid() && crosapi_remote_.is_bound(); }
diff --git a/chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.h b/chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.h index 8e97fac..619c1fb 100644 --- a/chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.h +++ b/chrome/browser/ash/crosapi/test/ash_crosapi_tests_env.h
@@ -5,10 +5,15 @@ #ifndef CHROME_BROWSER_ASH_CROSAPI_TEST_ASH_CROSAPI_TESTS_ENV_H_ #define CHROME_BROWSER_ASH_CROSAPI_TEST_ASH_CROSAPI_TESTS_ENV_H_ +#include "base/files/scoped_temp_dir.h" #include "base/process/process.h" #include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "mojo/public/cpp/bindings/remote.h" +namespace base { +class FilePath; +} + namespace crosapi { // This is for setting up tests environment for CrosapiTestBase. @@ -21,14 +26,16 @@ static AshCrosapiTestEnv* GetInstance(); - mojo::Remote<mojom::Crosapi>& GetCrosapiRemote(); + mojo::Remote<mojom::Crosapi>& GetCrosapiRemote() { return crosapi_remote_; } + const base::FilePath& GetUserDataDir() { return user_data_dir_.GetPath(); } // Returns if process and crosapi are valid. bool IsValid(); private: - mojo::Remote<mojom::Crosapi> crosapi_remote_; + base::ScopedTempDir user_data_dir_; base::Process process_; + mojo::Remote<mojom::Crosapi> crosapi_remote_; }; } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/test/crosapi_test_base.cc b/chrome/browser/ash/crosapi/test/crosapi_test_base.cc index b35ea83..6ac1382a 100644 --- a/chrome/browser/ash/crosapi/test/crosapi_test_base.cc +++ b/chrome/browser/ash/crosapi/test/crosapi_test_base.cc
@@ -15,4 +15,7 @@ ASSERT_TRUE(AshCrosapiTestEnv::GetInstance()->IsValid()); } +const base::FilePath& CrosapiTestBase::GetUserDataDir() { + return AshCrosapiTestEnv::GetInstance()->GetUserDataDir(); +} } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/test/crosapi_test_base.h b/chrome/browser/ash/crosapi/test/crosapi_test_base.h index 02c6f57f..cf36f47 100644 --- a/chrome/browser/ash/crosapi/test/crosapi_test_base.h +++ b/chrome/browser/ash/crosapi/test/crosapi_test_base.h
@@ -10,6 +10,10 @@ #include "mojo/public/cpp/bindings/remote.h" #include "testing/gtest/include/gtest/gtest.h" +namespace base { +class FilePath; +} + namespace crosapi { // Base class for testing the behavior of crosapi on Ash-side only. @@ -40,6 +44,9 @@ remote.BindNewPipeAndPassReceiver()); return std::move(remote); } + + // A temp dir will be used as a user data dir. + const base::FilePath& GetUserDataDir(); }; } // namespace crosapi
diff --git a/chrome/browser/ash/file_manager/file_manager_jstest.cc b/chrome/browser/ash/file_manager/file_manager_jstest.cc index 9525cf5..c13956c8 100644 --- a/chrome/browser/ash/file_manager/file_manager_jstest.cc +++ b/chrome/browser/ash/file_manager/file_manager_jstest.cc
@@ -218,10 +218,6 @@ RunTestURL("foreground/js/metadata/metadata_model_unittest.js"); } -IN_PROC_BROWSER_TEST_F(FileManagerJsTest, MetadataProxyTest) { - RunTestURL("background/js/metadata_proxy_unittest.js"); -} - IN_PROC_BROWSER_TEST_F(FileManagerJsTest, MultiMenu) { RunTestURL("foreground/js/ui/multi_menu_unittest.js"); }
diff --git a/chrome/browser/ash/login/screens/edu_coexistence_login_browsertest.cc b/chrome/browser/ash/login/screens/edu_coexistence_login_browsertest.cc index 463911f8..a3e0b4f 100644 --- a/chrome/browser/ash/login/screens/edu_coexistence_login_browsertest.cc +++ b/chrome/browser/ash/login/screens/edu_coexistence_login_browsertest.cc
@@ -21,7 +21,7 @@ #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" #include "chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h" -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.h" #include "components/account_id/account_id.h" #include "content/public/test/browser_test.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/chrome/browser/ash/login/screens/edu_coexistence_login_screen.cc b/chrome/browser/ash/login/screens/edu_coexistence_login_screen.cc index 4138dc8..3bd2ff91 100644 --- a/chrome/browser/ash/login/screens/edu_coexistence_login_screen.cc +++ b/chrome/browser/ash/login/screens/edu_coexistence_login_screen.cc
@@ -15,7 +15,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h" -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.h" #include "ui/aura/window.h" #include "ui/gfx/geometry/rect.h"
diff --git a/chrome/browser/ash/login/screens/edu_coexistence_login_screen.h b/chrome/browser/ash/login/screens/edu_coexistence_login_screen.h index 4caefe11..d729f76 100644 --- a/chrome/browser/ash/login/screens/edu_coexistence_login_screen.h +++ b/chrome/browser/ash/login/screens/edu_coexistence_login_screen.h
@@ -13,7 +13,7 @@ #include "chrome/browser/ash/login/ui/login_display_host.h" // TODO(https://crbug.com/1164001): move to forward declaration. #include "chrome/browser/ash/login/wizard_context.h" -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.h" namespace gfx { class Rect; @@ -55,7 +55,7 @@ void WebDialogViewBoundsChanged(const gfx::Rect& bounds) override; ScreenExitCallback exit_callback_; - std::unique_ptr<chromeos::InlineLoginDialogChromeOSOnboarding::Delegate> + std::unique_ptr<InlineLoginDialogChromeOSOnboarding::Delegate> dialog_delegate_; base::ScopedObservation<LoginDisplayHost, LoginDisplayHost::Observer>
diff --git a/chrome/browser/ash/printing/oauth2/authorization_zone_impl.cc b/chrome/browser/ash/printing/oauth2/authorization_zone_impl.cc index e4f1f7d..2ea3bdd 100644 --- a/chrome/browser/ash/printing/oauth2/authorization_zone_impl.cc +++ b/chrome/browser/ash/printing/oauth2/authorization_zone_impl.cc
@@ -110,10 +110,9 @@ // Calls `callback` with `status` and `data` as parameters. When `status` equals // StatusCode::kOK, ignores `data` and passes an empty string instead. -void NoDataForOK(StatusCallback callback, - StatusCode status, - const std::string& data) { - std::move(callback).Run(status, (status == StatusCode::kOK) ? "" : data); +void NoDataForOK(StatusCallback callback, StatusCode status, std::string data) { + std::move(callback).Run(status, + (status == StatusCode::kOK) ? "" : std::move(data)); } } // namespace @@ -327,9 +326,9 @@ PendingAuthorization& pa = pending_authorizations_.emplace_back( std::move(wa.scopes), RandBase64String<kLengthOfState>(), RandBase64String<kLengthOfCodeVerifier>()); - const std::string auth_url = GetAuthorizationURL( - server_data_, pa.scopes, pa.state, pa.code_verifier); - std::move(wa.callback).Run(StatusCode::kOK, auth_url); + std::string auth_url = GetAuthorizationURL(server_data_, pa.scopes, + pa.state, pa.code_verifier); + std::move(wa.callback).Run(StatusCode::kOK, std::move(auth_url)); } waiting_authorizations_.clear(); } @@ -363,7 +362,7 @@ } void AuthorizationZoneImpl::OnInitializeCallback(StatusCode status, - const std::string& data) { + std::string data) { if (status == StatusCode::kOK) { AuthorizationProcedure(); return; @@ -378,7 +377,7 @@ void AuthorizationZoneImpl::OnSendTokenRequestCallback( AuthorizationServerSession* session, StatusCode status, - const std::string& data) { + std::string data) { // Find the session for which the request was completed. auto it_session = base::ranges::find( sessions_, session, &std::unique_ptr<AuthorizationServerSession>::get); @@ -386,23 +385,20 @@ // Get the list of callbacks to run and copy the data. std::vector<StatusCallback> callbacks = session->TakeWaitingList(); - // We have to make a copy of `data` here because it may be an error message - // owned by the session object deleted in the next if block. - const std::string data2 = data; // Erase the session if the request failed. if (status != StatusCode::kOK) { sessions_.erase(it_session); } // Run the callbacks. for (auto& callback : callbacks) { - std::move(callback).Run(status, data2); + std::move(callback).Run(status, data); } } void AuthorizationZoneImpl::OnTokenExchangeRequestCallback( const chromeos::Uri& ipp_endpoint, StatusCode status, - const std::string& data) { + std::string data) { if (status == StatusCode::kInvalidAccessToken) { // The access token used by IppEndpointFetcher is invalid. Find the session // the token came from and ask it to refresh the token. @@ -430,34 +426,31 @@ return; } // For all other statuses just send back the result. - ResultForIppEndpoint(ipp_endpoint, status, data); + ResultForIppEndpoint(ipp_endpoint, status, std::move(data)); } void AuthorizationZoneImpl::ResultForIppEndpoint( const chromeos::Uri& ipp_endpoint, StatusCode status, - const std::string& data) { + std::string data) { auto it = ipp_endpoints_.find(ipp_endpoint); DCHECK(it != ipp_endpoints_.end()); // The list of callbacks to run. std::vector<StatusCallback> callbacks = it->second->TakeWaitingList(); - // We have to make a copy of `data` here because it may be an error message - // owned by the ipp_endpoint object deleted in the next if block. - const std::string data2 = data; // Erase the IPP Endpoint in case of an error. if (status != StatusCode::kOK) { ipp_endpoints_.erase(it); } // Run the callbacks. for (auto& callback : callbacks) { - std::move(callback).Run(status, data2); + std::move(callback).Run(status, data); } } void AuthorizationZoneImpl::OnAccessTokenForEndpointCallback( const chromeos::Uri& ipp_endpoint, StatusCode status, - const std::string& data) { + std::string data) { auto it = ipp_endpoints_.find(ipp_endpoint); DCHECK(it != ipp_endpoints_.end()); IppEndpointTokenFetcher* endpoint = it->second.get(); @@ -484,7 +477,7 @@ break; default: // For all other statuses just send back the result. - ResultForIppEndpoint(ipp_endpoint, status, data); + ResultForIppEndpoint(ipp_endpoint, status, std::move(data)); break; } }
diff --git a/chrome/browser/ash/printing/oauth2/authorization_zone_impl.h b/chrome/browser/ash/printing/oauth2/authorization_zone_impl.h index 7b99ae26..19c558b 100644 --- a/chrome/browser/ash/printing/oauth2/authorization_zone_impl.h +++ b/chrome/browser/ash/printing/oauth2/authorization_zone_impl.h
@@ -65,30 +65,30 @@ void AuthorizationProcedure(); // Callback for AuthorizationServerData::Initialize(). - void OnInitializeCallback(StatusCode status, const std::string& data); + void OnInitializeCallback(StatusCode status, std::string data); // Callback for AuthorizationServerSession::SendFirstTokenRequest() and // AuthorizationServerSession::SendNextTokenRequest(). void OnSendTokenRequestCallback(AuthorizationServerSession* session, StatusCode status, - const std::string& data); + std::string data); // Callback for IppEndpointTokenFetcher::SendTokenExchangeRequest(...). void OnTokenExchangeRequestCallback(const chromeos::Uri& ipp_endpoint, StatusCode status, - const std::string& data); + std::string data); // Executes all callbacks from the waitlist of `ipp_endpoint`. Also, removes // `ipp_endpoint` when `status` != StatusCode::kOK. void ResultForIppEndpoint(const chromeos::Uri& ipp_endpoint, StatusCode status, - const std::string& data); + std::string data); // This callback is added to the waitlist of AuthorizationSession when // `ipp_endpoint` must wait for the access token from it. void OnAccessTokenForEndpointCallback(const chromeos::Uri& ipp_endpoint, StatusCode status, - const std::string& data); + std::string data); // Tries to find OAuth session for given IPP Endpoint and send Token Exchange // request to obtain an endpoint access token.
diff --git a/chrome/browser/ash/printing/oauth2/authorization_zones_manager.cc b/chrome/browser/ash/printing/oauth2/authorization_zones_manager.cc index d58633f..866a4a2 100644 --- a/chrome/browser/ash/printing/oauth2/authorization_zones_manager.cc +++ b/chrome/browser/ash/printing/oauth2/authorization_zones_manager.cc
@@ -42,7 +42,7 @@ const GURL& auth_server, const chromeos::Uri& ipp_endpoint, StatusCode status, - const std::string& data) { + std::string data) { if (status == StatusCode::kOK || status == StatusCode::kAuthorizationNeeded) { PRINTER_LOG(EVENT) << LogEntry((status == StatusCode::kOK) ? "" : data, method, auth_server, status, ipp_endpoint); @@ -50,7 +50,7 @@ PRINTER_LOG(ERROR) << LogEntry(data, method, auth_server, status, ipp_endpoint); } - std::move(callback).Run(status, data); + std::move(callback).Run(status, std::move(data)); } void AddLoggingToCallback(StatusCallback& callback,
diff --git a/chrome/browser/ash/printing/oauth2/authorization_zones_manager_unittest.cc b/chrome/browser/ash/printing/oauth2/authorization_zones_manager_unittest.cc index 55f7ec3..e978dc9e 100644 --- a/chrome/browser/ash/printing/oauth2/authorization_zones_manager_unittest.cc +++ b/chrome/browser/ash/printing/oauth2/authorization_zones_manager_unittest.cc
@@ -102,13 +102,13 @@ // Calls InitAuthorization(...) and waits for the callback. CallbackResult CallInitAuthorization(const GURL& auth_server, const std::string& scope) { - base::MockOnceCallback<void(StatusCode, const std::string&)> callback; + base::MockOnceCallback<void(StatusCode, std::string)> callback; CallbackResult cr; base::RunLoop loop; EXPECT_CALL(callback, Run) - .WillOnce([&cr, &loop](StatusCode status, const std::string& data) { + .WillOnce([&cr, &loop](StatusCode status, std::string data) { cr.status = status; - cr.data = data; + cr.data = std::move(data); loop.Quit(); }); auth_zones_manager_->InitAuthorization(auth_server, scope, callback.Get()); @@ -119,13 +119,13 @@ // Calls FinishAuthorization(...) and waits for the callback. CallbackResult CallFinishAuthorization(const GURL& auth_server, const GURL& redirect_url) { - base::MockOnceCallback<void(StatusCode, const std::string&)> callback; + base::MockOnceCallback<void(StatusCode, std::string)> callback; CallbackResult cr; base::RunLoop loop; EXPECT_CALL(callback, Run) - .WillOnce([&cr, &loop](StatusCode status, const std::string& data) { + .WillOnce([&cr, &loop](StatusCode status, std::string data) { cr.status = status; - cr.data = data; + cr.data = std::move(data); loop.Quit(); }); auth_zones_manager_->FinishAuthorization(auth_server, redirect_url, @@ -138,13 +138,13 @@ CallbackResult CallGetEndpointAccessToken(const GURL& auth_server, const chromeos::Uri& ipp_endpoint, const std::string& scope) { - base::MockOnceCallback<void(StatusCode, const std::string&)> callback; + base::MockOnceCallback<void(StatusCode, std::string)> callback; CallbackResult cr; base::RunLoop loop; EXPECT_CALL(callback, Run) - .WillOnce([&cr, &loop](StatusCode status, const std::string& data) { + .WillOnce([&cr, &loop](StatusCode status, std::string data) { cr.status = status; - cr.data = data; + cr.data = std::move(data); loop.Quit(); }); auth_zones_manager_->GetEndpointAccessToken(auth_server, ipp_endpoint, @@ -160,7 +160,7 @@ .WillOnce( [&results_to_report](const std::string&, StatusCallback callback) { std::move(callback).Run(results_to_report.status, - results_to_report.data); + std::move(results_to_report.data)); }); } @@ -170,7 +170,7 @@ EXPECT_CALL(*auth_zone, FinishAuthorization(redirect_url, testing::_)) .WillOnce([&results_to_report](const GURL&, StatusCallback callback) { std::move(callback).Run(results_to_report.status, - results_to_report.data); + std::move(results_to_report.data)); }); } @@ -183,7 +183,7 @@ .WillOnce([&results_to_report](const chromeos::Uri&, const std::string&, StatusCallback callback) { std::move(callback).Run(results_to_report.status, - results_to_report.data); + std::move(results_to_report.data)); }); } @@ -267,9 +267,9 @@ SaveAuthorizationServerAsTrustedBeforeInitialization) { GURL url_1("https://ala.ma.kota/albo/psa"); CallbackResult cr; - auto callback = [&cr](StatusCode status, const std::string& data) { + auto callback = [&cr](StatusCode status, std::string data) { cr.status = status; - cr.data = data; + cr.data = std::move(data); }; AuthZoneMock* auth_zone_1 = CallSaveAuthorizationServerAsTrusted(url_1); @@ -286,9 +286,9 @@ SaveAuthorizationServerAsTrustedAfterInitialization) { GURL url_1("https://ala.ma.kota/albo/psa"); CallbackResult cr; - auto callback = [&cr](StatusCode status, const std::string& data) { + auto callback = [&cr](StatusCode status, std::string data) { cr.status = status; - cr.data = data; + cr.data = std::move(data); }; WaitForTheCompletionOfInitialization();
diff --git a/chrome/browser/ash/printing/oauth2/status_code.h b/chrome/browser/ash/printing/oauth2/status_code.h index 0f13408..707ff3c5 100644 --- a/chrome/browser/ash/printing/oauth2/status_code.h +++ b/chrome/browser/ash/printing/oauth2/status_code.h
@@ -58,7 +58,7 @@ // When `status` is different than StatusCode::kOK, `data` may contain // an additional error message. using StatusCallback = - base::OnceCallback<void(StatusCode status, const std::string& data)>; + base::OnceCallback<void(StatusCode status, std::string data)>; } // namespace ash::printing::oauth2
diff --git a/chrome/browser/ash/printing/oauth2/test_authorization_server.cc b/chrome/browser/ash/printing/oauth2/test_authorization_server.cc index 2f05e07..1dce2a0 100644 --- a/chrome/browser/ash/printing/oauth2/test_authorization_server.cc +++ b/chrome/browser/ash/printing/oauth2/test_authorization_server.cc
@@ -81,14 +81,14 @@ return true; } -base::OnceCallback<void(StatusCode, const std::string&)> BindResult( +base::OnceCallback<void(StatusCode, std::string)> BindResult( CallbackResult& target) { target.status = StatusCode::kUnexpectedError; target.data.clear(); auto save_results = [](CallbackResult* target, StatusCode status, - const std::string& data) { + std::string data) { target->status = status; - target->data = data; + target->data = std::move(data); }; return base::BindOnce(save_results, base::Unretained(&target)); }
diff --git a/chrome/browser/ash/printing/printer_authenticator.cc b/chrome/browser/ash/printing/printer_authenticator.cc index dea0442..312b63e9 100644 --- a/chrome/browser/ash/printing/printer_authenticator.cc +++ b/chrome/browser/ash/printing/printer_authenticator.cc
@@ -34,13 +34,13 @@ base::StringPiece method, const GURL& auth_server, oauth2::StatusCode status, - const std::string& data) { + std::string data) { if (status == oauth2::StatusCode::kOK) { PRINTER_LOG(EVENT) << oauth2::LogEntry("", method, auth_server, status); } else { PRINTER_LOG(ERROR) << oauth2::LogEntry(data, method, auth_server, status); } - std::move(callback).Run(status, data); + std::move(callback).Run(status, std::move(data)); } } // namespace @@ -103,12 +103,12 @@ void PrinterAuthenticator::ToNextStep(PrinterAuthenticator::Step current_step, oauth2::StatusCode status, - const std::string& data) { + std::string data) { switch (current_step) { case Step::kGetAccessToken: if (status == oauth2::StatusCode::kOK) { // Success, return the endpoint access token. - std::move(callback_).Run(status, data); + std::move(callback_).Run(status, std::move(data)); return; } if (status == oauth2::StatusCode::kUntrustedAuthorizationServer) {
diff --git a/chrome/browser/ash/printing/printer_authenticator.h b/chrome/browser/ash/printing/printer_authenticator.h index 8427ab6..1d64ef8 100644 --- a/chrome/browser/ash/printing/printer_authenticator.h +++ b/chrome/browser/ash/printing/printer_authenticator.h
@@ -78,7 +78,7 @@ // `data` contain result of the completed step (`current_step`). void ToNextStep(Step current_step, oauth2::StatusCode status, - const std::string& data); + std::string data); // Shows a dialog to the user asking if the given `auth_url` is a trusted // Authorization Server. Calls `callback` when the dialog is closed. void ShowIsTrustedDialog(const GURL& auth_url,
diff --git a/chrome/browser/ash/printing/printer_authenticator_unittest.cc b/chrome/browser/ash/printing/printer_authenticator_unittest.cc index 9940227..22d7858d 100644 --- a/chrome/browser/ash/printing/printer_authenticator_unittest.cc +++ b/chrome/browser/ash/printing/printer_authenticator_unittest.cc
@@ -50,18 +50,17 @@ // Call PrintAuthenticator::ObtainAccessTokenIfNeeded() and returns result // reported by the callback. CallbackResult CallObtainAccessTokenIfNeeded() { - base::MockOnceCallback<void(oauth2::StatusCode, const std::string&)> - callback; + base::MockOnceCallback<void(oauth2::StatusCode, std::string)> callback; CallbackResult result; base::RunLoop loop; EXPECT_CALL(callback, Run) .InSequence(sequence_) - .WillOnce([&result, &loop](oauth2::StatusCode status, - const std::string& data) { - result.status = status; - result.data = data; - loop.Quit(); - }); + .WillOnce( + [&result, &loop](oauth2::StatusCode status, std::string data) { + result.status = status; + result.data = std::move(data); + loop.Quit(); + }); authenticator_->ObtainAccessTokenIfNeeded(callback.Get()); loop.Run(); return result; @@ -92,7 +91,7 @@ .InSequence(sequence_) .WillOnce([result](const GURL& auth_server, const std::string& scope, oauth2::StatusCallback callback) { - std::move(callback).Run(result.status, result.data); + std::move(callback).Run(result.status, std::move(result.data)); }); } @@ -104,7 +103,7 @@ .InSequence(sequence_) .WillOnce([result](const GURL& auth_server, const GURL& redirect_url, oauth2::StatusCallback callback) { - std::move(callback).Run(result.status, result.data); + std::move(callback).Run(result.status, std::move(result.data)); }); } @@ -118,7 +117,7 @@ const chromeos::Uri& ipp_endpoint, const std::string& scope, oauth2::StatusCallback callback) { - std::move(callback).Run(result.status, result.data); + std::move(callback).Run(result.status, std::move(result.data)); }); }
diff --git a/chrome/browser/extensions/api/storage/managed_value_store_cache.cc b/chrome/browser/extensions/api/storage/managed_value_store_cache.cc index 3b5ba0f..26d9b809 100644 --- a/chrome/browser/extensions/api/storage/managed_value_store_cache.cc +++ b/chrome/browser/extensions/api/storage/managed_value_store_cache.cc
@@ -7,14 +7,10 @@ #include <memory> #include <utility> -#include "base/bind.h" -#include "base/callback.h" -#include "base/callback_helpers.h" -#include "base/check_op.h" -#include "base/files/file_util.h" #include "base/memory/raw_ptr.h" #include "base/one_shot_event.h" #include "base/scoped_observation.h" +#include "base/sequence_checker.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/extensions/api/storage/policy_value_store.h" #include "chrome/browser/policy/profile_policy_connector.h" @@ -24,19 +20,15 @@ #include "components/policy/core/common/schema.h" #include "components/policy/core/common/schema_map.h" #include "components/policy/core/common/schema_registry.h" -#include "components/value_store/value_store_change.h" #include "components/value_store/value_store_factory.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "extensions/browser/api/storage/backend_task_runner.h" #include "extensions/browser/api/storage/value_store_util.h" #include "extensions/browser/extension_file_task_runner.h" -#include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry_observer.h" #include "extensions/browser/extension_system.h" -#include "extensions/common/api/storage.h" -#include "extensions/common/constants.h" #include "extensions/common/extension.h" #include "extensions/common/extension_set.h" #include "extensions/common/manifest.h" @@ -52,7 +44,6 @@ namespace extensions { class ExtensionRegistry; - namespace { // Only extension settings are stored in the managed namespace - not apps. @@ -74,7 +65,7 @@ ExtensionTracker(const ExtensionTracker&) = delete; ExtensionTracker& operator=(const ExtensionTracker&) = delete; - ~ExtensionTracker() override {} + ~ExtensionTracker() override = default; private: // ExtensionRegistryObserver implementation. @@ -133,7 +124,7 @@ // most once. if (!ExtensionSystem::Get(profile_)->ready().is_signaled()) return; - std::unique_ptr<ExtensionSet> added(new ExtensionSet); + auto added = std::make_unique<ExtensionSet>(); added->Insert(extension); LoadSchemas(std::move(added)); } @@ -183,26 +174,26 @@ void ManagedValueStoreCache::ExtensionTracker::LoadSchemasOnFileTaskRunner( std::unique_ptr<ExtensionSet> extensions, base::WeakPtr<ExtensionTracker> self) { - std::unique_ptr<policy::ComponentMap> components(new policy::ComponentMap); + auto components = std::make_unique<policy::ComponentMap>(); - for (ExtensionSet::const_iterator it = extensions->begin(); - it != extensions->end(); ++it) { - if (!(*it)->manifest()->FindStringPath( + for (const auto& it : *extensions) { + const Extension& extension = *it; + if (!extension.manifest()->FindStringPath( manifest_keys::kStorageManagedSchema)) { // TODO(joaodasilva): Remove this. http://crbug.com/325349 - (*components)[(*it)->id()] = policy::Schema(); + (*components)[extension.id()] = policy::Schema(); continue; } // The extension should have been validated, so assume the schema exists // and is valid. std::string error; policy::Schema schema = - StorageSchemaManifestHandler::GetSchema(it->get(), &error); + StorageSchemaManifestHandler::GetSchema(&extension, &error); // If the schema is invalid then proceed with an empty schema. The extension // will be listed in chrome://policy but won't be able to load any policies. if (!schema.valid()) schema = policy::Schema(); - (*components)[(*it)->id()] = schema; + (*components)[extension.id()] = schema; } content::GetUIThreadTaskRunner({})->PostTask( @@ -240,6 +231,7 @@ base::SequencedTaskRunnerHandle::Get(), std::move(observer))) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + DETACH_FROM_SEQUENCE(backend_sequence_checker_); policy_service_->AddObserver(policy_domain_, this); @@ -251,13 +243,18 @@ } ManagedValueStoreCache::~ManagedValueStoreCache() { - DCHECK(IsOnBackendSequence()); + DCHECK_CALLED_ON_VALID_SEQUENCE(backend_sequence_checker_); // Delete the PolicyValueStores on FILE. store_map_.clear(); } +policy::PolicyDomain ManagedValueStoreCache::policy_domain() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_); + return policy_domain_; +} + void ManagedValueStoreCache::ShutdownOnUI() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); + DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_); policy_service_->RemoveObserver(policy_domain_, this); extension_tracker_.reset(); } @@ -265,25 +262,25 @@ void ManagedValueStoreCache::RunWithValueStoreForExtension( StorageCallback callback, scoped_refptr<const Extension> extension) { - DCHECK(IsOnBackendSequence()); - std::move(callback).Run(GetStoreFor(extension->id())); + DCHECK_CALLED_ON_VALID_SEQUENCE(backend_sequence_checker_); + std::move(callback).Run(GetOrCreateStore(extension->id())); } void ManagedValueStoreCache::DeleteStorageSoon( const std::string& extension_id) { - DCHECK(IsOnBackendSequence()); + DCHECK_CALLED_ON_VALID_SEQUENCE(backend_sequence_checker_); // It's possible that the store exists, but hasn't been loaded yet // (because the extension is unloaded, for example). Open the database to // clear it if it exists. if (!HasStore(extension_id)) return; - GetStoreFor(extension_id)->DeleteStorage(); + GetOrCreateStore(extension_id)->DeleteStorage(); store_map_.erase(extension_id); } void ManagedValueStoreCache::OnPolicyServiceInitialized( policy::PolicyDomain domain) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); + DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_); if (domain != policy_domain_) return; @@ -298,9 +295,8 @@ return; const policy::PolicyMap empty_map; - for (const auto& component_id_and_schema : *map) { - const policy::PolicyNamespace ns(policy_domain_, - component_id_and_schema.first); + for (const auto& [extension_id, _] : *map) { + const policy::PolicyNamespace ns(policy_domain_, extension_id); // If there is no policy for |ns| then this will clear the previous store, // if there is one. OnPolicyUpdated(ns, empty_map, policy_service_->GetPolicies(ns)); @@ -310,7 +306,7 @@ void ManagedValueStoreCache::OnPolicyUpdated(const policy::PolicyNamespace& ns, const policy::PolicyMap& previous, const policy::PolicyMap& current) { - DCHECK_CURRENTLY_ON(BrowserThread::UI); + DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_); if (!policy_service_->IsInitializationComplete(policy_domain_)) { // OnPolicyUpdated is called whenever a policy changes, but it doesn't @@ -343,8 +339,6 @@ void ManagedValueStoreCache::UpdatePolicyOnBackend( const std::string& extension_id, const policy::PolicyMap& current_policy) { - DCHECK(IsOnBackendSequence()); - if (!HasStore(extension_id) && current_policy.empty()) { // Don't create the store now if there are no policies configured for this // extension. If the extension uses the storage.managed API then the store @@ -352,24 +346,22 @@ return; } - GetStoreFor(extension_id)->SetCurrentPolicy(current_policy); + GetOrCreateStore(extension_id)->SetCurrentPolicy(current_policy); } -PolicyValueStore* ManagedValueStoreCache::GetStoreFor( +PolicyValueStore* ManagedValueStoreCache::GetOrCreateStore( const std::string& extension_id) { - DCHECK(IsOnBackendSequence()); - auto it = store_map_.find(extension_id); if (it != store_map_.end()) return it->second.get(); // Create the store now, and serve the cached policy until the PolicyService // sends updated values. - std::unique_ptr<PolicyValueStore> store(new PolicyValueStore( + auto store = std::make_unique<PolicyValueStore>( extension_id, observer_, value_store_util::CreateSettingsStore(settings_namespace::MANAGED, kManagedModelType, extension_id, - storage_factory_))); + storage_factory_)); PolicyValueStore* raw_store = store.get(); store_map_[extension_id] = std::move(store);
diff --git a/chrome/browser/extensions/api/storage/managed_value_store_cache.h b/chrome/browser/extensions/api/storage/managed_value_store_cache.h index 0732ffa..dc056c1d 100644 --- a/chrome/browser/extensions/api/storage/managed_value_store_cache.h +++ b/chrome/browser/extensions/api/storage/managed_value_store_cache.h
@@ -12,6 +12,8 @@ #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/sequence_checker.h" +#include "base/thread_annotations.h" #include "components/policy/core/common/policy_namespace.h" #include "components/policy/core/common/policy_service.h" #include "extensions/browser/api/storage/settings_observer.h" @@ -43,8 +45,7 @@ public policy::PolicyService::Observer { public: // |factory| is used to create databases for the PolicyValueStores. - // |observers| is the list of SettingsObservers to notify when a ValueStore - // changes. + // |observer| is invoked/notified when a ValueStore changes. ManagedValueStoreCache(content::BrowserContext* context, scoped_refptr<value_store::ValueStoreFactory> factory, SettingsChangedCallback observer); @@ -54,8 +55,7 @@ ~ManagedValueStoreCache() override; - private: - class ExtensionTracker; + policy::PolicyDomain policy_domain() const; // ValueStoreCache implementation: void ShutdownOnUI() override; @@ -64,6 +64,9 @@ scoped_refptr<const Extension> extension) override; void DeleteStorageSoon(const std::string& extension_id) override; + private: + class ExtensionTracker; + // PolicyService::Observer implementation: void OnPolicyServiceInitialized(policy::PolicyDomain domain) override; void OnPolicyUpdated(const policy::PolicyNamespace& ns, @@ -76,36 +79,46 @@ // Posted by OnPolicyUpdated() to update a PolicyValueStore on the backend // sequence. void UpdatePolicyOnBackend(const std::string& extension_id, - const policy::PolicyMap& current_policy); + const policy::PolicyMap& current_policy) + VALID_CONTEXT_REQUIRED(backend_sequence_checker_); // Returns an existing PolicyValueStore for |extension_id|, or NULL. - PolicyValueStore* GetStoreFor(const std::string& extension_id); + PolicyValueStore* GetOrCreateStore(const std::string& extension_id) + VALID_CONTEXT_REQUIRED(backend_sequence_checker_); // Returns true if a backing store has been created for |extension_id|. - bool HasStore(const std::string& extension_id) const; + bool HasStore(const std::string& extension_id) const + VALID_CONTEXT_REQUIRED(backend_sequence_checker_); // The profile that owns the extension system being used. This is used to // get the PolicyService, the EventRouter and the ExtensionService. - raw_ptr<Profile> profile_; + raw_ptr<Profile> profile_ GUARDED_BY_CONTEXT(ui_sequence_checker_); // The policy domain. This is used for both updating the schema registry with // the list of extensions and for observing the policy updates. - policy::PolicyDomain policy_domain_; + policy::PolicyDomain policy_domain_ GUARDED_BY_CONTEXT(ui_sequence_checker_); // The |profile_|'s PolicyService. - raw_ptr<policy::PolicyService> policy_service_; + raw_ptr<policy::PolicyService> policy_service_ + GUARDED_BY_CONTEXT(ui_sequence_checker_); // Observes extension loading and unloading, and keeps the Profile's // PolicyService aware of the current list of extensions. - std::unique_ptr<ExtensionTracker> extension_tracker_; + std::unique_ptr<ExtensionTracker> extension_tracker_ + GUARDED_BY_CONTEXT(ui_sequence_checker_); - // These live on the FILE thread. - scoped_refptr<value_store::ValueStoreFactory> storage_factory_; - SequenceBoundSettingsChangedCallback observer_; + scoped_refptr<value_store::ValueStoreFactory> storage_factory_ + GUARDED_BY_CONTEXT(backend_sequence_checker_); + SequenceBoundSettingsChangedCallback observer_ + GUARDED_BY_CONTEXT(backend_sequence_checker_); - // All the PolicyValueStores live on the FILE thread, and |store_map_| can be - // accessed only on the FILE thread as well. - std::map<std::string, std::unique_ptr<PolicyValueStore>> store_map_; + // All the PolicyValueStores live on the FILE/backend thread, and |store_map_| + // can be accessed only on this thread as well. + std::map<std::string, std::unique_ptr<PolicyValueStore>> store_map_ + GUARDED_BY_CONTEXT(backend_sequence_checker_); + + SEQUENCE_CHECKER(ui_sequence_checker_); + SEQUENCE_CHECKER(backend_sequence_checker_); base::WeakPtrFactory<ManagedValueStoreCache> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/extensions/api/storage/managed_value_store_cache_unittest.cc b/chrome/browser/extensions/api/storage/managed_value_store_cache_unittest.cc new file mode 100644 index 0000000..6d072b85 --- /dev/null +++ b/chrome/browser/extensions/api/storage/managed_value_store_cache_unittest.cc
@@ -0,0 +1,400 @@ +// Copyright 2022 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/extensions/api/storage/managed_value_store_cache.h" + +#include "base/json/json_reader.h" +#include "base/memory/scoped_refptr.h" +#include "base/strings/stringprintf.h" +#include "base/test/repeating_test_future.h" +#include "base/test/test_future.h" +#include "chrome/browser/policy/schema_registry_service.h" +#include "chrome/test/base/testing_profile.h" +#include "components/policy/core/common/mock_configuration_policy_provider.h" +#include "components/policy/core/common/policy_service_impl.h" +#include "components/policy/core/common/policy_types.h" +#include "components/value_store/test_value_store_factory.h" +#include "components/value_store/value_store.h" +#include "content/public/test/browser_task_environment.h" +#include "extensions/browser/api/storage/backend_task_runner.h" +#include "extensions/common/extension.h" +#include "extensions/common/extension_builder.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace extensions { +namespace { + +using value_store::ValueStore; + +constexpr auto kAnyPolicyScope = policy::PolicyScope::POLICY_SCOPE_USER; +constexpr auto kAnyPolicySource = policy::PolicySource::POLICY_SOURCE_PLATFORM; +constexpr auto kAnotherPolicyDomain = + policy::PolicyDomain::POLICY_DOMAIN_SIGNIN_EXTENSIONS; + +policy::Schema CreateSchema(const std::string& value) { + std::string error; + policy::Schema result = policy::Schema::Parse(value, &error); + EXPECT_EQ(error, "") << "Error parsing schema '" << value << "'"; + return result; +} + +policy::Schema SchemaWithoutProperties() { + return CreateSchema(R"( + { + "type": "object", + "properties": { + } + } + )"); +} + +// A schema that has a single property with the given name. +policy::Schema SchemaWithProperty(const std::string& property) { + return CreateSchema(base::StringPrintf( + R"( + { + "type": "object", + "properties": { + "%s" : { "type": "string"}, + } + } + )", + property.c_str())); +} + +// A schema that has two properties with the given names. +policy::Schema SchemaWithProperties(const std::string& property1, + const std::string& property2) { + return CreateSchema(base::StringPrintf( + R"( + { + "type": "object", + "properties": { + "%s" : { "type": "string"}, + "%s" : { "type": "string"}, + } + } + )", + property1.c_str(), property2.c_str())); +} + +base::Value::Dict CreateDict(const std::string& json) { + auto dict = base::JSONReader::Read(json); + EXPECT_NE(dict, absl::nullopt) << "Invalid json: '" << json << "'"; + return std::move(dict.value()).TakeDict(); +} + +class PolicyBuilder { + public: + explicit PolicyBuilder(policy::PolicyDomain default_domain) + : domain_(default_domain) {} + ~PolicyBuilder() = default; + + PolicyBuilder& AddMandatoryPolicy(scoped_refptr<const Extension> extension, + const std::string& key, + const std::string& value) { + bundle_->Get({domain_, extension->id()}) + .Set(key, policy::POLICY_LEVEL_MANDATORY, kAnyPolicyScope, + kAnyPolicySource, base::Value(value), nullptr); + return *this; + } + + PolicyBuilder& AddRecommendedPolicy(scoped_refptr<const Extension> extension, + const std::string& key, + const std::string& value) { + bundle_->Get({domain_, extension->id()}) + .Set(key, policy::POLICY_LEVEL_RECOMMENDED, kAnyPolicyScope, + kAnyPolicySource, base::Value(value), nullptr); + return *this; + } + + PolicyBuilder& AddPolicyInDomain(scoped_refptr<const Extension> extension, + policy::PolicyDomain domain, + const std::string& key, + const std::string& value) { + bundle_->Get({domain, extension->id()}) + .Set(key, policy::POLICY_LEVEL_MANDATORY, kAnyPolicyScope, + kAnyPolicySource, base::Value(value), nullptr); + return *this; + } + + std::unique_ptr<policy::PolicyBundle> Build() { return std::move(bundle_); } + + private: + // The domain that will be used for any policy added (unless explicitly + // specified otherwise) + const policy::PolicyDomain domain_; + std::unique_ptr<policy::PolicyBundle> bundle_ = + std::make_unique<policy::PolicyBundle>(); +}; + +class FakeSettingsObserver { + public: + FakeSettingsObserver() = default; + FakeSettingsObserver(const FakeSettingsObserver&) = delete; + FakeSettingsObserver& operator=(const FakeSettingsObserver&) = delete; + ~FakeSettingsObserver() = default; + + void OnSettingsChanged(const std::string& extension_id, + StorageAreaNamespace storage_area, + base::Value changes) { + future_.AddValue(extension_id); + } + + std::string WaitForPolicyUpdate() { + EXPECT_TRUE(future_.Wait()) + << "Settings-changed-callback was never invoked"; + return future_.Take(); + } + + SettingsChangedCallback GetObserverCallback() { + return base::BindRepeating(&FakeSettingsObserver::OnSettingsChanged, + base::Unretained(this)); + } + + private: + base::test::RepeatingTestFuture<std::string> future_; +}; + +class ManagedValueStoreCacheTest : public testing::Test { + public: + ManagedValueStoreCacheTest() = default; + ~ManagedValueStoreCacheTest() override = default; + + // testing::Test implementation: + void SetUp() override { + policy_provider_ = std::make_unique< + testing::NiceMock<policy::MockConfigurationPolicyProvider>>(); + policy_provider_->SetDefaultReturns( + /*is_initialization_complete_return=*/true, + /*is_first_policy_load_complete_return=*/true); + + policy::PolicyServiceImpl::Providers providers{policy_provider_.get()}; + auto policy_service = + std::make_unique<policy::PolicyServiceImpl>(providers); + + TestingProfile::Builder builder; + builder.SetPolicyService(std::move(policy_service)); + profile_ = builder.Build(); + } + + void TearDown() override { + if (cache_) { + cache_->ShutdownOnUI(); + + // Even though the cache was created on the UI thread, it must be + // destroyed on the backend thread. + GetBackendTaskRunner()->DeleteSoon(FROM_HERE, std::move(cache_)); + } + } + + void CreateCache() { + DCHECK_EQ(cache_, nullptr); + cache_ = std::make_unique<ManagedValueStoreCache>( + profile_.get(), factory_, observer_.GetObserverCallback()); + } + + scoped_refptr<const Extension> CreateExtension(const std::string& id) { + return ExtensionBuilder(id).Build(); + } + + // Informs the Schema registry that the schema of this extension has been + // loaded from the disk. + void SetExtensionSchema(const Extension& extension, + const policy::Schema& schema) { + policy::SchemaRegistry* registry = + profile().GetPolicySchemaRegistryService()->registry(); + registry->RegisterComponent( + {policy::PolicyDomain::POLICY_DOMAIN_EXTENSIONS, extension.id()}, + schema); + } + + // Creates an extension with the given id, and register the given schema + // with this extension. This simulates that the schema has been loaded from + // the disk. + scoped_refptr<const Extension> CreateExtensionWithSchema( + const std::string& extension_id, + const policy::Schema& schema) { + auto extension = CreateExtension(extension_id); + SetExtensionSchema(*extension, schema); + return extension; + } + + // Sends the new policy values to the policy provider, and wait until the + // policy has been applied. + void UpdatePolicy(PolicyBuilder& new_policy_builder) { + UpdatePolicy(new_policy_builder.Build()); + } + + policy::PolicyDomain policy_domain() const { return cache_->policy_domain(); } + + PolicyBuilder GetPolicyBuilder() { + return PolicyBuilder(cache_->policy_domain()); + } + + // Sends the new policy values to the policy provider, and wait until the + // policy has been applied. + void UpdatePolicy(std::unique_ptr<policy::PolicyBundle> new_policy) { + EXPECT_NE(cache_, nullptr) << "Call CreateCache() first"; + policy_provider().UpdatePolicy(std::move(new_policy)); + observer().WaitForPolicyUpdate(); + } + + ValueStore& GetValueStoreForExtension( + scoped_refptr<const Extension> extension) { + base::test::TestFuture<ValueStore*> waiter; + + // Since RunWithValueStoreForExtension can only be invoked from the backend + // sequence, we have to do a few thread jumps: + // 1) Invoke RunWithValueStoreForExtension on the Backend sequence + // 2) This will invoke the base post task callback (on the backend + // sequence). + // 3) This callback will post a task to the current sequence. + // 4) That task will invoke the TestFuture's callback on the current + // sequence. + GetBackendTaskRunner()->PostTask( + FROM_HERE, + base::BindOnce( + &ManagedValueStoreCache::RunWithValueStoreForExtension, + base::Unretained(&cache()), + base::BindPostTask(base::SequencedTaskRunnerHandle::Get(), + waiter.GetCallback()), + extension)); + + EXPECT_TRUE(waiter.Wait()) + << "Timeout waiting for value store for extension " << extension->id(); + EXPECT_NE(waiter.Get(), nullptr) + << "Got nullptr as value store for extension " << extension->id(); + return *waiter.Get(); + } + + TestingProfile& profile() { return *profile_; } + + ManagedValueStoreCache& cache() { + EXPECT_NE(cache_, nullptr) << "Call CreateCache() first"; + return *cache_; + } + + policy::MockConfigurationPolicyProvider& policy_provider() { + return *policy_provider_; + } + FakeSettingsObserver& observer() { return observer_; } + + private: + content::BrowserTaskEnvironment task_environment_; + FakeSettingsObserver observer_; + scoped_refptr<value_store::ValueStoreFactory> factory_ = + base::MakeRefCounted<value_store::TestValueStoreFactory>(); + std::unique_ptr<policy::MockConfigurationPolicyProvider> policy_provider_; + std::unique_ptr<TestingProfile> profile_; + std::unique_ptr<ManagedValueStoreCache> cache_; +}; + +TEST_F(ManagedValueStoreCacheTest, + ShouldInformObserverWhenPolicyValuesAreUpdated) { + CreateCache(); + auto extension = + CreateExtensionWithSchema("ExtensionId-1", SchemaWithProperty("color")); + + policy_provider().UpdatePolicy( + GetPolicyBuilder() + .AddMandatoryPolicy(extension, "color", "blue") + .Build()); + + std::string extension_id = observer().WaitForPolicyUpdate(); + EXPECT_EQ(extension_id, extension->id()); +} + +TEST_F(ManagedValueStoreCacheTest, + ShouldStoreMandatoryPolicyValuesForAnExtension) { + CreateCache(); + auto extension = + CreateExtensionWithSchema("ExtensionId-1", SchemaWithProperty("color")); + + UpdatePolicy( + GetPolicyBuilder().AddMandatoryPolicy(extension, "color", "red")); + + ValueStore& value_store = GetValueStoreForExtension(extension); + EXPECT_EQ(value_store.Get("color").settings(), + CreateDict(R"( { "color": "red" } )")); +} + +TEST_F(ManagedValueStoreCacheTest, + ShouldIgnoreRecommendedPolicyValuesForAnExtension) { + CreateCache(); + auto extension = CreateExtensionWithSchema( + "ExtensionId-1", SchemaWithProperties("mandatory", "recommended")); + + UpdatePolicy(GetPolicyBuilder() + .AddMandatoryPolicy(extension, "mandatory", "<value>") + .AddRecommendedPolicy(extension, "recommended", "<value-2>") + .Build()); + + ValueStore& value_store = GetValueStoreForExtension(extension); + EXPECT_EQ(value_store.Get("recommended").settings(), CreateDict(R"( { } )")); +} + +TEST_F(ManagedValueStoreCacheTest, ShouldIgnorePoliciesInAnotherDomain) { + CreateCache(); + auto extension = CreateExtensionWithSchema("ExtensionId-1", + SchemaWithProperty("property")); + + UpdatePolicy(GetPolicyBuilder() + .AddPolicyInDomain(extension, policy_domain(), "property", + "right-domain") + .AddPolicyInDomain(extension, kAnotherPolicyDomain, + "property", "wrong-domain") + .Build()); + + ValueStore& value_store = GetValueStoreForExtension(extension); + EXPECT_EQ(value_store.Get("property").settings(), + CreateDict(R"( { "property" : "right-domain" } )")); +} + +TEST_F(ManagedValueStoreCacheTest, + ValueStoreShouldNotContainValuesOfOtherExtensions) { + CreateCache(); + auto extension1 = CreateExtensionWithSchema( + "extension-1", SchemaWithProperty("own-property")); + auto extension2 = CreateExtensionWithSchema( + "extension-2", SchemaWithProperty("other-extension-property")); + + UpdatePolicy( + GetPolicyBuilder() + .AddMandatoryPolicy(extension2, "other-extension-property", "value-2") + .Build()); + + ValueStore& value_store_1 = GetValueStoreForExtension(extension1); + EXPECT_EQ(value_store_1.Get("other-extension-property").settings(), + CreateDict(" {} ")); +} + +TEST_F(ManagedValueStoreCacheTest, FetchingUnknownValueShouldNotReturnAnError) { + CreateCache(); + auto extension1 = + CreateExtensionWithSchema("extension-1", SchemaWithoutProperties()); + + ValueStore& value_store = GetValueStoreForExtension(extension1); + + EXPECT_EQ(value_store.Get("unknown-property").status().code, ValueStore::OK); + EXPECT_EQ(value_store.Get("unknown-property").settings(), CreateDict(" {} ")); +} + +TEST_F(ManagedValueStoreCacheTest, FetchingUnsetValueShouldNotReturnAnError) { + CreateCache(); + auto extension1 = CreateExtensionWithSchema( + "extension-1", SchemaWithProperties("set-property", "unset-property")); + + UpdatePolicy(GetPolicyBuilder().AddMandatoryPolicy(extension1, "set-property", + "value")); + + ValueStore& value_store = GetValueStoreForExtension(extension1); + + EXPECT_EQ(value_store.Get("unset-property").status().code, ValueStore::OK); + EXPECT_EQ(value_store.Get("unset-property").settings(), CreateDict(" {} ")); +} + +} // namespace +} // namespace extensions
diff --git a/chrome/browser/extensions/webstore_installer.cc b/chrome/browser/extensions/webstore_installer.cc index 3b14d4ef..a71eb2f 100644 --- a/chrome/browser/extensions/webstore_installer.cc +++ b/chrome/browser/extensions/webstore_installer.cc
@@ -30,7 +30,6 @@ #include "base/task/task_runner_util.h" #include "base/time/time.h" #include "build/build_config.h" -#include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/download/download_crx_util.h" #include "chrome/browser/download/download_prefs.h" #include "chrome/browser/download/download_stats.h" @@ -50,9 +49,6 @@ #include "content/public/browser/download_manager.h" #include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" -#include "content/public/browser/notification_details.h" -#include "content/public/browser/notification_service.h" -#include "content/public/browser/notification_source.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" @@ -283,8 +279,6 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK(web_contents); - registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_INSTALL_ERROR, - content::Source<CrxInstaller>(nullptr)); extension_registry_observation_.Observe(ExtensionRegistry::Get(profile)); } @@ -341,20 +335,14 @@ DownloadNextPendingModule(); } -void WebstoreInstaller::Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) { - DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_INSTALL_ERROR, type); - - CrxInstaller* crx_installer = content::Source<CrxInstaller>(source).ptr(); - CHECK(crx_installer); - if (crx_installer != crx_installer_.get()) +void WebstoreInstaller::OnInstallerDone( + const absl::optional<CrxInstallError>& error) { + if (!error) { return; + } // TODO(rdevlin.cronin): Continue removing std::string errors and // replacing with std::u16string. See crbug.com/71980. - const extensions::CrxInstallError* error = - content::Details<const extensions::CrxInstallError>(details).ptr(); const std::string utf8_error = base::UTF16ToUTF8(error->message()); crx_installer_ = nullptr; // ReportFailure releases a reference to this object so it must be the @@ -726,6 +714,8 @@ crx_installer_->set_expected_id(approval->extension_id); crx_installer_->set_is_gallery_install(true); crx_installer_->set_allow_silent_install(true); + crx_installer_->set_installer_callback(base::BindOnce( + &WebstoreInstaller::OnInstallerDone, weak_ptr_factory_.GetWeakPtr())); crx_installer_->InstallCrx(download.GetFullPath()); }
diff --git a/chrome/browser/extensions/webstore_installer.h b/chrome/browser/extensions/webstore_installer.h index 89a283e..c8b9026 100644 --- a/chrome/browser/extensions/webstore_installer.h +++ b/chrome/browser/extensions/webstore_installer.h
@@ -22,8 +22,6 @@ #include "components/download/public/common/download_interrupt_reasons.h" #include "components/download/public/common/download_item.h" #include "content/public/browser/browser_thread.h" -#include "content/public/browser/notification_observer.h" -#include "content/public/browser/notification_registrar.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry_observer.h" #include "extensions/common/manifest_handlers/shared_module_info.h" @@ -47,8 +45,7 @@ class Manifest; // Downloads and installs extensions from the web store. -class WebstoreInstaller : public content::NotificationObserver, - public ExtensionRegistryObserver, +class WebstoreInstaller : public ExtensionRegistryObserver, public download::DownloadItem::Observer, public base::RefCountedThreadSafe< WebstoreInstaller, @@ -195,11 +192,6 @@ // Starts downloading and installing the extension. void Start(); - // content::NotificationObserver. - void Observe(int type, - const content::NotificationSource& source, - const content::NotificationDetails& details) override; - // ExtensionRegistryObserver. void OnExtensionInstalled(content::BrowserContext* browser_context, const Extension* extension, @@ -265,7 +257,9 @@ // Records stats regarding an interrupted webstore download item. void RecordInterrupt(const download::DownloadItem* download) const; - content::NotificationRegistrar registrar_; + // Called when crx_installer_->InstallCrx() finishes. + void OnInstallerDone(const absl::optional<CrxInstallError>& error); + base::ScopedObservation<ExtensionRegistry, ExtensionRegistryObserver> extension_registry_observation_{this}; base::WeakPtr<content::WebContents> web_contents_; @@ -290,6 +284,8 @@ // depedences). int total_modules_ = 0; bool download_started_ = false; + + base::WeakPtrFactory<WebstoreInstaller> weak_ptr_factory_{this}; }; } // namespace extensions
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 1bdf7265..27a1c21 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -2393,7 +2393,7 @@ { "name": "enable-generic-sensor-extra-classes", "owners": [ "reillyg@chromium.org", "raphael.kubo.da.costa@intel.com" ], - "expiry_milestone": 108 + "expiry_milestone": 112 }, { "name": "enable-get-display-media-set", @@ -2715,6 +2715,11 @@ "expiry_milestone": 130 }, { + "name": "enable-new-base-url-inheritance-behavior", + "owners": [ "wjmaclean", "creis", "alexmos", "domenic" ], + "expiry_milestone": 115 + }, + { "name": "enable-new-download-api", "owners": [ "sdefresne", "bling-flags@google.com" ], "expiry_milestone": 130 @@ -3359,6 +3364,11 @@ "expiry_milestone": -1 }, { + "name": "enable-webrtc-allow-input-volume-adjustment", + "owners": [ "alessiob", "silen" ], + "expiry_milestone": 123 + }, + { "name": "enable-webrtc-analog-agc-clipping-control", "owners": [ "alessiob", "silen", "minyue" ], "expiry_milestone": 103 @@ -3923,8 +3933,8 @@ }, { "name": "google-mobile-services-passwords", - "owners": [ "fhorschig@chromium.org", "vasilii" ], - "expiry_milestone": 108 + "owners": [ "maxan@google.com", "vasilii" ], + "expiry_milestone": 112 }, { "name": "google-mobile-services-passwords-error-messages", @@ -3932,7 +3942,7 @@ "ioanap", "izuzic@google.com" ], - "expiry_milestone": 110 + "expiry_milestone": 112 }, { "name": "google-mobile-services-passwords-reenrollment", @@ -5495,7 +5505,7 @@ { "name": "password-notes", "owners": ["mamir", "derinel@google.com"], - "expiry_milestone": 108 + "expiry_milestone": 111 }, { "name": "password-scripts-fetching", @@ -5835,11 +5845,6 @@ "expiry_milestone": 112 }, { - "name": "reduce-gpu-priority-on-background", - "owners": [ "boliu" ], - "expiry_milestone": 108 - }, - { "name": "reduce-horizontal-fling-velocity", "owners": [ "flackr", "input-dev" ], "expiry_milestone": 95
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 38ee30b..9ed4dd9a 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -2924,6 +2924,14 @@ "the frame has zero viewport intersection, a non-zero area, and is " "not display:none."; +const char kNewBaseUrlInheritanceBehaviorName[] = + "Enable new base url inheritance behaviors for srcdoc and about:blank"; +const char kNewBaseUrlInheritanceBehaviorDescription[] = + "When enabled, about:blank and srcdoc frames will use newly proposed " + "behaviors around inheriting their base urls, as discussed on " + "https://crbug.com/1356658. Note: this is automatically enabled when " + "'isolate sandboxed iframes' is enabled."; + const char kTouchDragDropName[] = "Touch initiated drag and drop"; const char kTouchDragDropDescription[] = "Touch drag and drop can be initiated through long press on a draggable " @@ -3191,6 +3199,14 @@ const char kWebrtcAnalogAgcClippingControlDescription[] = "WebRTC Agc1 analog clipping controller to reduce saturation."; +const char kWebRtcAllowInputVolumeAdjustmentName[] = + "Allow WebRTC to adjust the input volume."; +const char kWebRtcAllowInputVolumeAdjustmentDescription[] = + "Allow the Audio Processing Module in WebRTC to adjust the input volume " + "during a real-time call. Disable if microphone muting or clipping issues " + "are observed when the browser is running and used for a real-time call. " + "This flag is experimental and may be removed at any time."; + const char kWebrtcHwDecodingName[] = "WebRTC hardware video decoding"; const char kWebrtcHwDecodingDescription[] = "Support in WebRTC for decoding video streams using platform hardware."; @@ -3898,12 +3914,6 @@ "Enables showing UI which allows for easy reverting of the decision to " "never save passwords on a certain webiste"; -const char kReduceGpuPriorityOnBackgroundName[] = - "Reduce GPU process priority when in background"; -const char kReduceGpuPriorityOnBackgroundDescription[] = - "Enable to reduce GPU process priority when Chrome is the background. " - "This hints to Android OS to kill GPU process first to free memory."; - const char kReengagementNotificationName[] = "Enable re-engagement notifications"; const char kReengagementNotificationDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 7f92541..f5a6656 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1646,6 +1646,9 @@ extern const char kThrottleDisplayNoneAndVisibilityHiddenCrossOriginIframesDescription[]; +extern const char kNewBaseUrlInheritanceBehaviorName[]; +extern const char kNewBaseUrlInheritanceBehaviorDescription[]; + extern const char kTouchDragDropName[]; extern const char kTouchDragDropDescription[]; @@ -1796,6 +1799,9 @@ extern const char kWebrtcAnalogAgcClippingControlName[]; extern const char kWebrtcAnalogAgcClippingControlDescription[]; +extern const char kWebRtcAllowInputVolumeAdjustmentName[]; +extern const char kWebRtcAllowInputVolumeAdjustmentDescription[]; + extern const char kWebrtcHwDecodingName[]; extern const char kWebrtcHwDecodingDescription[]; @@ -2224,9 +2230,6 @@ extern const char kRecoverFromNeverSaveAndroidName[]; extern const char kRecoverFromNeverSaveAndroidDescription[]; -extern const char kReduceGpuPriorityOnBackgroundName[]; -extern const char kReduceGpuPriorityOnBackgroundDescription[]; - extern const char kReengagementNotificationName[]; extern const char kReengagementNotificationDescription[];
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactory.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactory.java index 9a852578..39095fe 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactory.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactory.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.incognito.reauth; import android.content.Context; +import android.content.Intent; import androidx.activity.OnBackPressedCallback; import androidx.annotation.NonNull; @@ -66,6 +67,8 @@ * Non-null for {@link FullScreenIncognitoReauthCoordinator}. */ private @Nullable LayoutManager mLayoutManager; + /** An {@link Intent} which allows to opens regular overview mode from a non-tabbed Activity. */ + private @Nullable Intent mShowRegularOverviewIntent; /** * A test-only variable used to mock the menu delegate instead of creating one. @@ -89,6 +92,7 @@ * @param incognitoReauthTopToolbarDelegate A {@link IncognitoReauthTopToolbarDelegate} to use * for disabling/enabling few top toolbar elements inside tab switcher. * @param layoutManager {@link LayoutManager} to use for showing the regular overview mode. + * @param showRegularOverviewIntent An {@link Intent} to show the regular overview mode. * @param isTabbedActivity A boolean to indicate if the re-auth screen being fired from */ public IncognitoReauthCoordinatorFactory(@NonNull Context context, @@ -99,7 +103,8 @@ @Nullable OneshotSupplier<TabSwitcherCustomViewManager> tabSwitcherCustomViewManagerOneshotSupplier, @Nullable IncognitoReauthTopToolbarDelegate incognitoReauthTopToolbarDelegate, - @Nullable LayoutManager layoutManager, boolean isTabbedActivity) { + @Nullable LayoutManager layoutManager, @Nullable Intent showRegularOverviewIntent, + boolean isTabbedActivity) { mContext = context; mTabModelSelector = tabModelSelector; mModalDialogManager = modalDialogManager; @@ -107,6 +112,7 @@ mSettingsLauncher = settingsLauncher; mIncognitoReauthTopToolbarDelegate = incognitoReauthTopToolbarDelegate; mLayoutManager = layoutManager; + mShowRegularOverviewIntent = showRegularOverviewIntent; mIsTabbedActivity = isTabbedActivity; if (isTabbedActivity) { @@ -118,6 +124,9 @@ })); } else { assert tabSwitcherCustomViewManagerOneshotSupplier == null; + assert mShowRegularOverviewIntent + != null : "A valid intent is required to be able to" + + " open regular overview mode from inside non-tabbed Activity."; } } @@ -149,8 +158,7 @@ mLayoutManager.showLayout(LayoutType.TAB_SWITCHER, /*animate=*/false); }; } else { - // TODO(crbug.com/1227656): Add implementation for iCCT case. - return () -> {}; + return () -> mContext.startActivity(mShowRegularOverviewIntent); } } @@ -166,11 +174,8 @@ * @return {@link Runnable} to use when the user presses back while the re-auth is being shown. */ Runnable getBackPressRunnable() { - if (mIsTabbedActivity) { - return getSeeOtherTabsRunnable(); - } else { - return () -> {}; - } + // Both "See other tabs" and back-press shares the same logic. + return getSeeOtherTabsRunnable(); } /**
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactoryTest.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactoryTest.java index d1786297..9744df0 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactoryTest.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactoryTest.java
@@ -14,6 +14,7 @@ import static org.chromium.base.test.util.Batch.UNIT_TESTS; import android.content.Context; +import android.content.Intent; import androidx.activity.OnBackPressedCallback; import androidx.test.filters.SmallTest; @@ -45,6 +46,8 @@ /** * Robolectric tests for {@link IncognitoReauthCoordinatorFactory}. + * + * TODO(crbug.com/1227656): Remove parameterization to improve readability of the tests. */ @RunWith(ParameterizedRobolectricTestRunner.class) @Config(manifest = Config.NONE) @@ -68,6 +71,8 @@ @Mock private LayoutManager mLayoutManagerMock; @Mock + private Intent mIntentMock; + @Mock private TabModel mIncognitoTabModelMock; @Mock private IncognitoReauthManager.IncognitoReauthCallback mIncognitoReauthCallbackMock; @@ -106,7 +111,8 @@ mIncognitoReauthCoordinatorFactory = new IncognitoReauthCoordinatorFactory(mContextMock, mTabModelSelectorMock, mModalDialogManagerMock, mIncognitoReauthManagerMock, mSettingsLauncherMock, mTabSwitcherCustomViewManagerSupplier, - mIncognitoReauthTopToolbarDelegateMock, mLayoutManagerMock, mIsTabbedActivity); + mIncognitoReauthTopToolbarDelegateMock, mLayoutManagerMock, mIntentMock, + mIsTabbedActivity); mIncognitoReauthCoordinatorFactory.mIncognitoReauthMenuDelegateForTesting = mIncognitoReauthMenuDelegateMock; } @@ -138,7 +144,9 @@ verify(mLayoutManagerMock, times(1)) .showLayout(eq(LayoutType.TAB_SWITCHER), /*animate= */ eq(false)); } else { - // TODO(crbug.com/1227656): Add tests for iCCT. + doNothing().when(mContextMock).startActivity(mIntentMock); + seeOtherTabsRunnable.run(); + verify(mContextMock, times(1)).startActivity(mIntentMock); } } @@ -170,7 +178,9 @@ verify(mLayoutManagerMock, times(1)) .showLayout(eq(LayoutType.TAB_SWITCHER), /*animate= */ eq(false)); } else { - // TODO(crbug.com/1227656): Add tests for iCCT. + doNothing().when(mContextMock).startActivity(mIntentMock); + backPressRunnable.run(); + verify(mContextMock, times(1)).startActivity(mIntentMock); } }
diff --git a/chrome/browser/performance_manager/mechanisms/page_discarder_browsertest.cc b/chrome/browser/performance_manager/mechanisms/page_discarder_browsertest.cc index 3ca1f81..1c3f7e0 100644 --- a/chrome/browser/performance_manager/mechanisms/page_discarder_browsertest.cc +++ b/chrome/browser/performance_manager/mechanisms/page_discarder_browsertest.cc
@@ -27,10 +27,10 @@ content::WindowedNotificationObserver load( content::NOTIFICATION_NAV_ENTRY_COMMITTED, content::NotificationService::AllSources()); - content::OpenURLParams page( - embedded_test_server()->GetURL("a.com", "/foo.html"), content::Referrer(), - WindowOpenDisposition::NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_TYPED, - false); + content::OpenURLParams page(embedded_test_server()->GetURL("/title1.html"), + content::Referrer(), + WindowOpenDisposition::NEW_BACKGROUND_TAB, + ui::PAGE_TRANSITION_TYPED, false); auto* contents = browser()->OpenURL(page); load.Wait();
diff --git a/chrome/browser/picture_in_picture/document_picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/document_picture_in_picture_window_controller_browsertest.cc index 87da954..613b6184 100644 --- a/chrome/browser/picture_in_picture/document_picture_in_picture_window_controller_browsertest.cc +++ b/chrome/browser/picture_in_picture/document_picture_in_picture_window_controller_browsertest.cc
@@ -321,6 +321,25 @@ base::RunLoop().RunUntilIdle(); } +// Window controller bounds should be same as the web content bounds. +#if BUILDFLAG(IS_CHROMEOS_LACROS) +// Document PiP is not supported in Lacros yet. +#define MAYBE_CheckWindowBoundsSameAsWebContents \ + DISABLED_CheckWindowBoundsSameAsWebContents +#else +#define MAYBE_CheckWindowBoundsSameAsWebContents \ + CheckWindowBoundsSameAsWebContents +#endif +IN_PROC_BROWSER_TEST_F(DocumentPictureInPictureWindowControllerBrowserTest, + MAYBE_CheckWindowBoundsSameAsWebContents) { + LoadTabAndEnterPictureInPicture(browser()); + auto* web_contents = window_controller()->GetChildWebContents(); + ASSERT_TRUE(web_contents); + + EXPECT_EQ(web_contents->GetContainerBounds(), + window_controller()->GetWindowBounds()); +} + // Make sure that document PiP fails without a secure context. // Unlike other tests, this one does work on Lacros. // TODO(crbug.com/1328840): Consider replacing this with a web platform test.
diff --git a/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc b/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc index ada91b8..97deab01 100644 --- a/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc +++ b/chrome/browser/picture_in_picture/video_picture_in_picture_window_controller_browsertest.cc
@@ -107,6 +107,7 @@ MOCK_METHOD0(ToggleCamera, void()); MOCK_METHOD0(HangUp, void()); MOCK_CONST_METHOD0(GetSourceBounds, const gfx::Rect&()); + MOCK_METHOD0(GetWindowBounds, absl::optional<gfx::Rect>()); }; const base::FilePath::CharType kPictureInPictureWindowSizePage[] =
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 621b03d..f4cddfb 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -200,7 +200,7 @@ #include "chrome/browser/extensions/api/shared_storage/shared_storage_private_api.h" #include "chrome/browser/ui/ash/projector/projector_app_client_impl.h" #include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h" -#include "chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) #endif // BUILDFLAG(ENABLE_EXTENSIONS) @@ -1469,7 +1469,7 @@ ash::FamilyUserMetricsService::RegisterProfilePrefs(registry); ash::FamilyUserSessionMetrics::RegisterProfilePrefs(registry); crosapi::NetworkSettingsServiceAsh::RegisterProfilePrefs(registry); - chromeos::InlineLoginHandlerChromeOS::RegisterProfilePrefs(registry); + ash::InlineLoginHandlerChromeOS::RegisterProfilePrefs(registry); ash::first_run::RegisterProfilePrefs(registry); ash::file_system_provider::RegisterProfilePrefs(registry); ash::full_restore::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc index 6f98ab6..996350aa 100644 --- a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc +++ b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc
@@ -63,6 +63,10 @@ return out << "kDiceWebSigninInterceptionBubble"; case ProfileKeepAliveOrigin::kHistoryMenuBridge: return out << "kHistoryMenuBridge"; + case ProfileKeepAliveOrigin::kLacrosMainProfile: + return out << "kLacrosMainProfile"; + case ProfileKeepAliveOrigin::kProfileCreationSamlFlow: + return out << "kProfileCreationSamlFlow"; } NOTREACHED(); return out << static_cast<int>(origin);
diff --git a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h index 053b5040..6822614 100644 --- a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h +++ b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h
@@ -122,7 +122,16 @@ // something to show after the profile is destroyed. macOS-specific. kHistoryMenuBridge = 28, - kMaxValue = kHistoryMenuBridge, + // Protect Lacros Main Profile from being destroyed. Value expected to be set + // for main profile and never removed. Lacros main profile shouldn't be + // destroyed. + kLacrosMainProfile = 29, + + // This profile is being created, and the SAML flow needs to be completed to + // finish signin in the user's account. + kProfileCreationSamlFlow = 30, + + kMaxValue = kProfileCreationSamlFlow, }; std::ostream& operator<<(std::ostream& out,
diff --git a/chrome/browser/profiles/profile_browsertest.cc b/chrome/browser/profiles/profile_browsertest.cc index 83017d1..6ab6a85 100644 --- a/chrome/browser/profiles/profile_browsertest.cc +++ b/chrome/browser/profiles/profile_browsertest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "base/no_destructor.h" #include "chrome/browser/profiles/profile.h" #include <stddef.h> @@ -42,6 +43,7 @@ #include "chrome/browser/profiles/profile_impl.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_observer.h" +#include "chrome/browser/profiles/profile_test_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -914,32 +916,28 @@ class ProfileBrowserTestWithDestroyProfile : public ProfileBrowserTest { public: ProfileBrowserTestWithDestroyProfile() { + keep_alive_ = std::make_unique<ScopedKeepAlive>( + KeepAliveOrigin::BROWSER, KeepAliveRestartOption::DISABLED); + scoped_feature_list_.InitAndEnableFeature( features::kDestroyProfileOnBrowserClose); } private: base::test::ScopedFeatureList scoped_feature_list_; + + std::unique_ptr<ScopedKeepAlive> keep_alive_; }; +// Main profile is not yet destroyed on Lacros, test below to test destroying +// secondary profiles on Lacros`LacrosSecondaryProfilesDestroyOnBrowserClose`. +#if !BUILDFLAG(IS_CHROMEOS_LACROS) // Verifies the regular Profile doesn't get destroyed as long as there's an OTR // Profile around. IN_PROC_BROWSER_TEST_F(ProfileBrowserTestWithDestroyProfile, OTRProfileKeepsRegularProfileAlive) { - ProfileManager* profile_manager = g_browser_process->profile_manager(); - - // Closing all windows (as we're about to do) triggers BrowserProcess - // shutdown, which makes ~ScopedProfileKeepAlive() a no-op. We don't want that - // for this test, because we check HasKeepAliveForTesting(). - // - // Instantiate a second Profile, just so the KeepAliveRegistry refcount stays - // above 0. - base::ScopedAllowBlockingForTesting allow_blocking; - Profile* profile2 = profile_manager->GetProfile( - profile_manager->user_data_dir().AppendASCII("Profile 2")); - CreateBrowser(profile2); - Profile* regular_profile = browser()->profile(); + ProfileManager* profile_manager = g_browser_process->profile_manager(); EXPECT_FALSE(profile_manager->HasKeepAliveForTesting( regular_profile, ProfileKeepAliveOrigin::kOffTheRecordProfile)); @@ -974,6 +972,56 @@ EXPECT_TRUE(regular_watcher.destroyed()); EXPECT_TRUE(otr_watcher.destroyed()); } +#endif // !BUILDFLAG(IS_CHROMEOS_LACROS) + +#if BUILDFLAG(IS_CHROMEOS_LACROS) +// Test secondary profiles deleted on browser close on lacros. +// Main profile remains alive. +IN_PROC_BROWSER_TEST_F(ProfileBrowserTestWithDestroyProfile, + LacrosSecondaryProfilesDestroyOnBrowserClose) { + Profile* main_profile = browser()->profile(); + ASSERT_TRUE(Profile::IsMainProfilePath(main_profile->GetPath())); + + ProfileManager* profile_manager = g_browser_process->profile_manager(); + // Create a secondary profile. + Profile* secondary_profile = profiles::testing::CreateProfileSync( + profile_manager, profile_manager->GenerateNextProfileDirectoryPath()); + ASSERT_FALSE(Profile::IsMainProfilePath(secondary_profile->GetPath())); + + // Creates a browser for the secondary profile. + Browser* secondary_browser = CreateBrowser(secondary_profile); + Browser* main_browser = browser(); + + EXPECT_TRUE(profile_manager->HasKeepAliveForTesting( + main_profile, ProfileKeepAliveOrigin::kLacrosMainProfile)); + EXPECT_FALSE(profile_manager->HasKeepAliveForTesting( + secondary_profile, ProfileKeepAliveOrigin::kLacrosMainProfile)); + + // Destruction Watchers for both profiles. + ProfileDestructionWatcher main_watcher; + ProfileDestructionWatcher secondary_watcher; + main_watcher.Watch(main_profile); + secondary_watcher.Watch(secondary_profile); + + // Close both browsers. + CloseBrowserSynchronously(secondary_browser); + CloseBrowserSynchronously(main_browser); + base::RunLoop().RunUntilIdle(); + + // Main profile has no more active browsers. + EXPECT_FALSE(profile_manager->HasKeepAliveForTesting( + main_profile, ProfileKeepAliveOrigin::kBrowserWindow)); + // But still has the `ProfileKeepAliveOrigin::kLacrosMainProfile` KeepAlive + EXPECT_TRUE(profile_manager->HasKeepAliveForTesting( + main_profile, ProfileKeepAliveOrigin::kLacrosMainProfile)); + // So the profile is not destroyed on browser close. + EXPECT_FALSE(main_watcher.destroyed()); + + // The secondary profile is destroyed on browser close. + EXPECT_TRUE(secondary_watcher.destroyed()); +} +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + #endif // !BUILDFLAG(IS_CHROMEOS_ASH) // Tests Profile::GetAllOffTheRecordProfiles
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index 9b6a595..b54db02 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -1789,6 +1789,17 @@ // ProfileInfo's constructor is private, can't make_unique(). std::unique_ptr<ProfileInfo> info(new ProfileInfo()); info->unowned_profile_ = profile; + +#if BUILDFLAG(IS_CHROMEOS_LACROS) + // Lacros primary profile should not be destroyed, this KeepAlive will be + // set and not expected to be removed at any point. On Secondary profiles, we + // do not set it to allow the profiles to be destroyed. + if (base::FeatureList::IsEnabled(features::kDestroyProfileOnBrowserClose) && + Profile::IsMainProfilePath(info->unowned_profile_->GetPath())) { + info->keep_alives[ProfileKeepAliveOrigin::kLacrosMainProfile] = 1; + } +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + return info; }
diff --git a/chrome/browser/profiles/profile_manager.h b/chrome/browser/profiles/profile_manager.h index aedd5c3..54aecf1 100644 --- a/chrome/browser/profiles/profile_manager.h +++ b/chrome/browser/profiles/profile_manager.h
@@ -348,6 +348,11 @@ std::map<ProfileKeepAliveOrigin, int> GetKeepAlivesByPath( const base::FilePath& path); + // Removes the kWaitingForFirstBrowserWindow keepalive. This allows a + // Profile* to be deleted from now on, even if it never had a visible + // browser window. + void ClearFirstBrowserWindowKeepAlive(const Profile* profile); + protected: // Creates a new profile by calling into the profile's profile creation // method. Virtual so that unittests can return a TestingProfile instead @@ -444,11 +449,6 @@ void RecordZombieMetrics(); - // Removes the kWaitingForFirstBrowserWindow keepalive. This allows a - // Profile* to be deleted from now on, even if it never had a visible - // browser window. - void ClearFirstBrowserWindowKeepAlive(const Profile* profile); - // Helper for RemoveKeepAlive() and ClearFirstBrowserWindowFlag(). If the // refcount to this Profile is zero, calls RemoveKeepAlive(). void DeleteProfileIfNoKeepAlive(const ProfileInfo* info);
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_af.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_af.xtb index 66c14b2..d96faed 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_af.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_af.xtb
@@ -562,6 +562,7 @@ <translation id="4780458943471935919">Rollees na volgende bladsy</translation> <translation id="4784215347943747396">Beheer die toestel met net 1 of 2 skakelaars</translation> <translation id="4786285211967466855">Geen vorige vlak 1-opskrif nie</translation> +<translation id="4786591486270126089">Skakel stem outomaties oor op grond van taal</translation> <translation id="4787577491510559358">Sê formatering van huidige item hardop</translation> <translation id="479989351350248267">deursoek</translation> <translation id="4804818685124855865">Ontkoppel</translation> @@ -950,6 +951,7 @@ <translation id="7492497529767769458">Gaan na volgende afdeling. Voorbeelde sluit die Statuslaai en Lanseerder in.</translation> <translation id="7505149250476994901">Sê "cap" (hoofletter) voor letter</translation> <translation id="7533226154149229506">Ligte ougoud</translation> +<translation id="7541021454094606506">vee alles uit</translation> <translation id="7543255924852002459">Gooi etiket weg</translation> <translation id="7552432549459840808">Nuttige Chrome-kortpaaie</translation> <translation id="7553679324939294712">voeg <ph name="INSERT_PHRASE" /> voor <ph name="BEFORE_PHRASE" /> in</translation>
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 0e838b1..7e54fc5 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_bs.xtb
@@ -562,6 +562,7 @@ <translation id="4780458943471935919">Klizanje na sljedeću stranicu</translation> <translation id="4784215347943747396">Kontrolirajte uređaj sa samo 1 ili 2 prekidača</translation> <translation id="4786285211967466855">Nema prethodnog naslova 1. nivoa</translation> +<translation id="4786591486270126089">Automatski prebaci glas na temelju jezika</translation> <translation id="4787577491510559358">Najava formatiranja za trenutnu stavku</translation> <translation id="479989351350248267">pretraži</translation> <translation id="4804818685124855865">Prekini vezu</translation> @@ -950,6 +951,7 @@ <translation id="7492497529767769458">Prelazak u sljedeći odjeljak. Primjeri uključuju Statusnu traku i Pokretač.</translation> <translation id="7505149250476994901">Recite "veliko" prije slova</translation> <translation id="7533226154149229506">Svijetla zlatnožuta</translation> +<translation id="7541021454094606506">izbriši sve</translation> <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>
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 350cc47..a7d8536a 100644 --- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hr.xtb +++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_hr.xtb
@@ -562,6 +562,7 @@ <translation id="4780458943471935919">Pomicanje na sljedeću stranicu</translation> <translation id="4784215347943747396">Kontrolirajte uređaj samo s jednim prekidačem ili dva prekidača</translation> <translation id="4786285211967466855">Nema prethodnog naslova 1. razine</translation> +<translation id="4786591486270126089">Automatski prebaci glas na temelju jezika</translation> <translation id="4787577491510559358">Izgovori formatiranje za trenutačnu stavku</translation> <translation id="479989351350248267">search</translation> <translation id="4804818685124855865">Prekini vezu</translation> @@ -950,6 +951,7 @@ <translation id="7492497529767769458">Prelazak na sljedeći odjeljak. Primjeri uključuju traku statusa i Pokretač.</translation> <translation id="7505149250476994901">Recite "cap" (veliko slovo) prije slova</translation> <translation id="7533226154149229506">Svijetla zlatnožuta</translation> +<translation id="7541021454094606506">izbriši sve</translation> <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>
diff --git a/chrome/browser/resources/chromeos/assistant_optin/modulization_utils.gni b/chrome/browser/resources/chromeos/assistant_optin/modulization_utils.gni index 8825201d..9307df8 100644 --- a/chrome/browser/resources/chromeos/assistant_optin/modulization_utils.gni +++ b/chrome/browser/resources/chromeos/assistant_optin/modulization_utils.gni
@@ -26,6 +26,11 @@ ] assistant_migrated_imports = [ + # NOTE: Migrated imports from OOBE need to omit 'login' in the folder structure. + # This is because the folder 'login' (chromeos/login) is not shown in the WebUI file + # structure. + "chrome/browser/resources/chromeos/components/oobe_cr_lottie.html", + "ui/webui/resources/cr_elements/cr_dialog/cr_dialog.html", "ui/webui/resources/cr_elements/cr_lottie/cr_lottie.html", "ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html",
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index 51faf64b..15a863e 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -219,7 +219,6 @@ "components/display_manager_types.m.js", "components/long_touch_detector.m.js", "components/network_select_login.m.js", - "components/oobe_cr_lottie.m.js", "components/oobe_icons.m.js", "components/oobe_network_icons.m.js", "components/oobe_select.m.js", @@ -269,6 +268,7 @@ "components/hd_iron_icon.js", "components/notification_card.js", "components/oobe_a11y_option.js", + "components/oobe_cr_lottie.js", "components/oobe_i18n_dropdown.js", "components/progress_list_item.js", "components/security_token_pin.js",
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn index 8d22c02..12134b0 100644 --- a/chrome/browser/resources/chromeos/login/components/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -32,7 +32,7 @@ ":oobe_a11y_option", ":oobe_apps_list.m", ":oobe_carousel.m", - ":oobe_cr_lottie.m", + ":oobe_cr_lottie", ":oobe_i18n_dropdown", ":oobe_icons.m", ":oobe_network_icons.m", @@ -60,7 +60,6 @@ ":network_select_login_module", ":oobe_apps_list_module", ":oobe_carousel_module", - ":oobe_cr_lottie_module", ":oobe_icons_module", ":oobe_icons_module", ":oobe_network_icons_module", @@ -194,15 +193,15 @@ extra_deps = [ ":oobe_carousel_module" ] } -js_library("oobe_cr_lottie.m") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.m.js" ] +js_library("oobe_cr_lottie") { + sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.js" ] deps = [ "behaviors:oobe_i18n_behavior.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] externs_list = [ "//ui/webui/resources/cr_elements/cr_lottie/cr_lottie_externs.js" ] - extra_deps = [ ":oobe_cr_lottie_module" ] + extra_deps = [ ":web_components" ] } js_library("oobe_network_icons.m") { @@ -306,15 +305,6 @@ namespace_rewrites = oobe_namespace_rewrites } -polymer_modulizer("oobe_cr_lottie") { - js_file = "oobe_cr_lottie.js" - html_file = "oobe_cr_lottie.html" - html_type = "dom-module" - auto_imports = oobe_auto_imports - migrated_imports = oobe_migrated_imports - namespace_rewrites = oobe_namespace_rewrites -} - polymer_modulizer("oobe_network_icons") { js_file = "oobe_network_icons.m.js" html_file = "oobe_network_icons.html" @@ -361,6 +351,7 @@ "hd_iron_icon.js", "notification_card.js", "oobe_a11y_option.js", + "oobe_cr_lottie.js", "oobe_i18n_dropdown.js", "progress_list_item.js", "security_token_pin.js",
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn b/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn index f90df95..855a3ff7 100644 --- a/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/components/dialogs/BUILD.gn
@@ -51,7 +51,7 @@ deps = [ ":oobe_adaptive_dialog.m", ":oobe_content_dialog.m", - "..:oobe_cr_lottie.m", + "..:oobe_cr_lottie", "../behaviors:oobe_dialog_host_behavior.m", "../behaviors:oobe_i18n_behavior.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.html b/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.html index cc80eea..0963501 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.html +++ b/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.html
@@ -1,53 +1,46 @@ -<link rel="import" href="chrome://resources/html/polymer.html"> +<!-- +Copyright 2022 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> -<link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html"> -<link rel="import" href="chrome://resources/cr_elements/cr_lottie/cr_lottie.html"> - -<link rel="import" href="./oobe_icons.html"> -<link rel="import" href="./behaviors/oobe_i18n_behavior.html"> - -<dom-module id="oobe-cr-lottie"> - <template> - <style> - :host { - height: 100%; - width: 100%; - } - #container { - height: 100%; - position: relative; - width: 100%; - } - #animation { - height: 100%; - position: absolute; - width: 100%; - } - #playPauseIcon { - bottom: 0; - left: 0; - margin: auto; - opacity: 0; /* We use opacity to hide/show the element so it stays in - the tab index */ - position: absolute; - right: 0; - top: 0; - } - #playPauseIcon:focus, - :host(:hover) #playPauseIcon { - opacity: 1; - } - cr-icon-button { - --cr-icon-button-icon-size: 40px; - --cr-icon-button-size: 48px; - } - </style> - <div id="container"> - <cr-lottie id="animation" animation-url="[[animationUrl]]"> - </cr-lottie> - <cr-icon-button id="playPauseIcon" iron-icon="[[getIcon_(playing)]]" - aria-label$="[[getAria_(locale, playing)]]"></cr-icon-button> - </div> - </template> - <script src="oobe_cr_lottie.js"></script> -</dom-module> +<style> + :host { + height: 100%; + width: 100%; + } + #container { + height: 100%; + position: relative; + width: 100%; + } + #animation { + height: 100%; + position: absolute; + width: 100%; + } + #playPauseIcon { + bottom: 0; + left: 0; + margin: auto; + opacity: 0; /* We use opacity to hide/show the element so it stays in + the tab index */ + position: absolute; + right: 0; + top: 0; + } + #playPauseIcon:focus, + :host(:hover) #playPauseIcon { + opacity: 1; + } + cr-icon-button { + --cr-icon-button-icon-size: 40px; + --cr-icon-button-size: 48px; + } +</style> +<div id="container"> + <cr-lottie id="animation" animation-url="[[animationUrl]]"> + </cr-lottie> + <cr-icon-button id="playPauseIcon" iron-icon="[[getIcon_(playing)]]" + aria-label$="[[getAria_(locale, playing)]]"></cr-icon-button> +</div>
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.js b/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.js index b4a1411..513cd1fe 100644 --- a/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.js +++ b/chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.js
@@ -2,19 +2,24 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -/* #js_imports_placeholder */ - /** * @fileoverview Polymer element for displaying pausable lottie animation. */ +import '//resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import '//resources/cr_elements/cr_lottie/cr_lottie.js'; +import './oobe_icons.m.js'; + +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {OobeI18nBehavior, OobeI18nBehaviorInterface} from './behaviors/oobe_i18n_behavior.m.js'; + /** * @constructor * @extends {PolymerElement} * @implements {OobeI18nBehaviorInterface} */ -const OobeCrLottieBase = - Polymer.mixinBehaviors([OobeI18nBehavior], Polymer.Element); +const OobeCrLottieBase = mixinBehaviors([OobeI18nBehavior], PolymerElement); /** * @typedef {{ @@ -23,26 +28,29 @@ */ OobeCrLottieBase.$; -/* #export */ class OobeCrLottie extends OobeCrLottieBase { +/** @polymer */ +export class OobeCrLottie extends OobeCrLottieBase { static get is() { return 'oobe-cr-lottie'; } - /* #html_template_placeholder */ + static get template() { + return html`{__html_template__}`; + } + static get properties() { return { playing: { type: Boolean, observer: 'onPlayingChanged_', + value: false, }, - animationUrl: String, - }; - } - constructor() { - super(); - this.playing = false; - this.animationUrl = ''; + animationUrl: { + type: String, + value: '', + }, + }; } ready() {
diff --git a/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni b/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni index 0610df3..0e8a8a63 100644 --- a/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni +++ b/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni
@@ -118,6 +118,7 @@ "chrome/browser/resources/chromeos/login/components/hd_iron_icon.html", "chrome/browser/resources/chromeos/login/components/notification_card.html", "chrome/browser/resources/chromeos/login/components/oobe_a11y_option.html", + "chrome/browser/resources/chromeos/login/components/oobe_cr_lottie.html", "chrome/browser/resources/chromeos/login/components/oobe_i18n_dropdown.html", "chrome/browser/resources/chromeos/login/components/progress_list_item.html", "chrome/browser/resources/chromeos/login/components/security_token_pin.html",
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn index f5c4cb63..2dcf412 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -110,7 +110,7 @@ js_library("app_downloading") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js" ] deps = [ - "../../components:oobe_cr_lottie.m", + "../../components:oobe_cr_lottie", "../../components/behaviors:login_screen_behavior.m", "../../components/behaviors:oobe_dialog_host_behavior.m", "../../components/behaviors:oobe_i18n_behavior.m", @@ -239,7 +239,7 @@ sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js" ] deps = [ "../../components:display_manager_types.m", - "../../components:oobe_cr_lottie.m", + "../../components:oobe_cr_lottie", "../../components/behaviors:login_screen_behavior.m", "../../components/behaviors:multi_step_behavior.m", "../../components/behaviors:oobe_i18n_behavior.m", @@ -256,7 +256,7 @@ js_library("gesture_navigation") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js" ] deps = [ - "../../components:oobe_cr_lottie.m", + "../../components:oobe_cr_lottie", "../../components/behaviors:login_screen_behavior.m", "../../components/behaviors:multi_step_behavior.m", "../../components/behaviors:oobe_i18n_behavior.m", @@ -363,7 +363,7 @@ deps = [ "../../components:display_manager_types.m", "../../components:oobe_a11y_option", - "../../components:oobe_cr_lottie.m", + "../../components:oobe_cr_lottie", "../../components/behaviors:login_screen_behavior.m", "../../components/behaviors:multi_step_behavior.m", "../../components/behaviors:oobe_i18n_behavior.m",
diff --git a/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js b/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js index f5c7568..4cf6ed1b 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js +++ b/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js
@@ -9,7 +9,7 @@ import '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; -import '../../components/oobe_cr_lottie.m.js'; +import '../../components/oobe_cr_lottie.js'; import '../../components/buttons/oobe_text_button.m.js'; import '../../components/common_styles/common_styles.m.js'; import '../../components/common_styles/oobe_dialog_host_styles.m.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js index 1fa25a4..91e59b9 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js +++ b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
@@ -23,7 +23,7 @@ import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.m.js'; import {OobeTextButton} from '../../components/buttons/oobe_text_button.m.js'; import {OOBE_UI_STATE, SCREEN_GAIA_SIGNIN} from '../../components/display_manager_types.m.js'; -import {OobeCrLottie} from '../../components/oobe_cr_lottie.m.js'; +import {OobeCrLottie} from '../../components/oobe_cr_lottie.js'; /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js b/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js index 13cda5b..7d1d2cd6 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js +++ b/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js
@@ -3,7 +3,7 @@ // found in the LICENSE file. import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; -import '../../components/oobe_cr_lottie.m.js'; +import '../../components/oobe_cr_lottie.js'; import '../../components/common_styles/common_styles.m.js'; import '../../components/common_styles/oobe_dialog_host_styles.m.js'; import '../../components/dialogs/oobe_adaptive_dialog.m.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js b/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js index c489bee..8af5417 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js +++ b/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js
@@ -10,7 +10,7 @@ import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; import '//resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js'; import '//resources/cr_elements/cr_toggle/cr_toggle.js'; -import '../../components/oobe_cr_lottie.m.js'; +import '../../components/oobe_cr_lottie.js'; import '../../components/oobe_icons.m.js'; import '../../components/common_styles/common_styles.m.js'; import '../../components/common_styles/oobe_dialog_host_styles.m.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn index b00e97e1..7b578e4 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
@@ -190,7 +190,7 @@ deps = [ ":welcome_dialog.m", "../..:display_manager.m", - "../../components:oobe_cr_lottie.m", + "../../components:oobe_cr_lottie", "../../components:oobe_select.m", "../../components:oobe_types.m", "../../components/behaviors:login_screen_behavior.m", @@ -212,7 +212,7 @@ sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.m.js" ] deps = [ "../../components:long_touch_detector.m", - "../../components:oobe_cr_lottie.m", + "../../components:oobe_cr_lottie", "../../components/behaviors:oobe_i18n_behavior.m", "../../components/buttons:oobe_icon_button.m", "../../components/buttons:oobe_text_button.m",
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index 97414f2..f4c28232 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -408,6 +408,7 @@ ":global_scroll_target_behavior", ":icon", ":lazy_load", + ":main_page_behavior", ":metrics_recorder", ":os_icons", ":os_page_visibility", @@ -456,6 +457,15 @@ ] } +js_library("main_page_behavior") { + deps = [ + "..:router", + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/js:assert", + "//ui/webui/resources/js:util", + ] +} + js_library("metrics_recorder") { deps = [ "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings_webui_js",
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.html b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.html index 8e948a6..a25542c 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.html +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.html
@@ -300,6 +300,20 @@ </div> </template> </template> + + <!-- APN row item --> + <template is="dom-if" if="[[shouldShowApnRow_(managedProperties_, + isApnRevampEnabled_)]]"> + <cr-link-row + id="apnSubpageButton" + class="hr" + label="[[i18n('OncCellular-APN-AccessPointName')]]" + sub-label="[[getApnRowSubLabel_(managedProperties_)]]" + on-click="onApnRowClicked_" + role-description="$i18n{subpageArrowRoleDescription}"> + </cr-link-row> + </template> + <template is="dom-if" if="[[hasAdvancedSection_(managedProperties_, propertiesReceived_, showMeteredToggle_, deviceState_)]]"> @@ -414,7 +428,8 @@ </template> <!-- APN --> - <template is="dom-if" if="[[isCellular_(managedProperties_)]]"> + <template is="dom-if" if="[[shouldShowApnList_(managedProperties_, + isApnRevampEnabled_)]]"> <network-apnlist on-apn-change="onApnChange_" managed-properties="[[managedProperties_]]" disabled="[[disabled_]]">
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js index 134bf35..6977d293 100644 --- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js +++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
@@ -336,6 +336,18 @@ }, }, + /** + * Return true if apnRevamp feature flag is enabled. + * @private + */ + isApnRevampEnabled_: { + type: Boolean, + value() { + return loadTimeData.valueExists('apnRevamp') && + loadTimeData.getBoolean('apnRevamp'); + }, + }, + /** @private */ advancedExpanded_: Boolean, @@ -1308,7 +1320,7 @@ } /** - * @param {!ManagedProperties} managedProperties + * @param {!ManagedProperties|undefined} managedProperties * @return {boolean} * @private */ @@ -1376,6 +1388,24 @@ } /** + * @return {boolean} + * @private + */ + shouldShowApnRow_() { + return this.isApnRevampEnabled_ && + this.isCellular_(this.managedProperties_); + } + + /** + * @return {boolean} + * @private + */ + shouldShowApnList_() { + return !this.isApnRevampEnabled_ && + this.isCellular_(this.managedProperties_); + } + + /** * @param {!ManagedProperties|undefined} * managedProperties * @param {!GlobalPolicy|undefined} globalPolicy @@ -1970,6 +2000,25 @@ this.setMojoNetworkProperties_(config); } + /** + * @return {string} + * @private + */ + getApnRowSubLabel_() { + if (!this.isCellular_(this.managedProperties_) || + !this.managedProperties_.typeProperties.cellular.connectedApn) { + return ''; + } + + return this.managedProperties_.typeProperties.cellular.connectedApn + .accessPointName; + } + + /** + * @private + * TODO: implement + */ + onApnRowClicked_() {} /** * Event triggered when the IP Config or NameServers element changes.
diff --git a/chrome/browser/resources/settings/chromeos/main_page_behavior.js b/chrome/browser/resources/settings/chromeos/main_page_behavior.js new file mode 100644 index 0000000..17f6deca --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/main_page_behavior.js
@@ -0,0 +1,381 @@ +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {assert} from 'chrome://resources/js/assert.js'; +import {beforeNextRender} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {MinimumRoutes, Route, Router} from '../router.js'; + +import {ensureLazyLoaded} from './ensure_lazy_loaded.js'; + +/** + * @enum {string} + * A categorization of every possible Settings URL, necessary for implementing + * a finite state machine. + */ +export const RouteState = { + // Initial state before anything has loaded yet. + INITIAL: 'initial', + // A dialog that has a dedicated URL (e.g. /importData). + DIALOG: 'dialog', + // A section (basically a scroll position within the top level page, e.g, + // /appearance. + SECTION: 'section', + // A subpage, or sub-subpage e.g, /searchEngins. + SUBPAGE: 'subpage', + // The top level Settings page, '/'. + TOP_LEVEL: 'top-level', +}; + +/** + * @param {?Route=} route + * @return {!RouteState} + */ +function classifyRoute(route) { + if (!route) { + return RouteState.INITIAL; + } + const routes = + /** @type {!MinimumRoutes} */ (Router.getInstance().getRoutes()); + if (route === routes.BASIC || route === routes.ABOUT) { + return RouteState.TOP_LEVEL; + } + if (route.isSubpage()) { + return RouteState.SUBPAGE; + } + if (route.isNavigableDialog) { + return RouteState.DIALOG; + } + return RouteState.SECTION; +} + +/** + * Responds to route changes by expanding, collapsing, or scrolling to + * sections on the page. Expanded sections take up the full height of the + * container. At most one section should be expanded at any given time. + * @polymerBehavior + */ +export const MainPageBehavior = { + /** @type {?HTMLElement} */ + scroller: null, + + /** + * A map holding all valid state transitions. + * @private {!Map<!RouteState, !RouteState>} + */ + validTransitions_: (function() { + const allStates = new Set([ + RouteState.DIALOG, + RouteState.SECTION, + RouteState.SUBPAGE, + RouteState.TOP_LEVEL, + ]); + + return new Map([ + [RouteState.INITIAL, allStates], + [ + RouteState.DIALOG, + new Set([ + RouteState.SECTION, + RouteState.SUBPAGE, + RouteState.TOP_LEVEL, + ]), + ], + [RouteState.SECTION, allStates], + [RouteState.SUBPAGE, allStates], + [RouteState.TOP_LEVEL, allStates], + ]); + })(), + + /** @override */ + attached() { + this.scroller = this.domHost ? this.domHost.parentNode : document.body; + }, + + /** + * Method to be defined by users of MainPageBehavior. + * @param {!Route} route + * @return {boolean} Whether the given route is part of |this| page. + */ + containsRoute(route) { + return false; + }, + + /** + * @param {!Route} route + * @return {boolean} + * @private + */ + shouldExpandAdvanced_(route) { + const routes = + /** @type {!MinimumRoutes} */ (Router.getInstance().getRoutes()); + return (this.tagName === 'OS-SETTINGS-PAGE') && routes.ADVANCED && + routes.ADVANCED.contains(route); + }, + + /** + * Finds the settings section corresponding to the given route. If the + * section is lazily loaded it force-renders it. + * Note: If the section resides within "advanced" settings, a + * 'hide-container' event is fired (necessary to avoid flashing). Callers + * are responsible for firing a 'show-container' event. + * @param {!Route} route + * @return {!Promise<!HTMLElement>} + * @private + */ + ensureSectionForRoute_(route) { + const section = this.getSection(route.section); + if (section !== null) { + return Promise.resolve(section); + } + + // The function to use to wait for <dom-if>s to render. + const waitFn = beforeNextRender.bind(null, this); + + return new Promise(resolve => { + if (this.shouldExpandAdvanced_(route)) { + this.fire('hide-container'); + waitFn(() => { + this.$$('#advancedPageTemplate').get().then(() => { + resolve(this.getSection(route.section)); + }); + }); + } else { + waitFn(() => { + resolve(this.getSection(route.section)); + }); + } + }); + }, + + /** + * @param {!Route} route + * @private + */ + enterSubpage_(route) { + this.lastScrollTop_ = this.scroller.scrollTop; + this.scroller.scrollTop = 0; + this.classList.add('showing-subpage'); + this.fire('subpage-expand'); + + // Explicitly load the lazy_load.html module, since all subpages reside in + // the lazy loaded module. + + // Polymer 3 codepath, do not delete next line comment. + ensureLazyLoaded(); + + this.ensureSectionForRoute_(route).then(section => { + section.classList.add('expanded'); + // Fire event used by a11y tests only. + this.fire('settings-section-expanded'); + + this.fire('show-container'); + }); + }, + + /** + * @param {!Route} oldRoute + * @return {!Promise<void>} + * @private + */ + enterMainPage_(oldRoute) { + const oldSection = this.getSection(oldRoute.section); + oldSection.classList.remove('expanded'); + this.classList.remove('showing-subpage'); + return new Promise((res, rej) => { + requestAnimationFrame(() => { + if (Router.getInstance().lastRouteChangeWasPopstate()) { + this.scroller.scrollTop = this.lastScrollTop_; + } + this.fire('showing-main-page'); + res(); + }); + }); + }, + + /** + * @param {!Route} route + * @private + */ + scrollToSection_(route) { + this.ensureSectionForRoute_(route).then(section => { + this.fire('showing-section', section); + this.fire('show-container'); + }); + }, + + /** + * Detects which state transition is appropriate for the given new/old + * routes. + * @param {!Route} newRoute + * @param {!Route=} oldRoute + * @private + */ + getStateTransition_(newRoute, oldRoute) { + const containsNew = this.containsRoute(newRoute); + const containsOld = this.containsRoute(oldRoute); + + if (!containsNew && !containsOld) { + // Nothing to do, since none of the old/new routes belong to this page. + return null; + } + + // Case where going from |this| page to an unrelated page. For example: + // |this| is os-settings-page AND + // oldRoute is /searchEngines AND + // newRoute is /help. + if (containsOld && !containsNew) { + return [classifyRoute(oldRoute), RouteState.TOP_LEVEL]; + } + + // Case where return from an unrelated page to |this| page. For example: + // |this| is os-settings-page AND + // oldRoute is /help AND + // newRoute is /searchEngines + if (!containsOld && containsNew) { + return [RouteState.TOP_LEVEL, classifyRoute(newRoute)]; + } + + // Case where transitioning between routes that both belong to |this| + // page. + return [classifyRoute(oldRoute), classifyRoute(newRoute)]; + }, + + /** + * @param {!Route} newRoute + * @param {!Route=} oldRoute + */ + currentRouteChanged(newRoute, oldRoute) { + const transition = this.getStateTransition_(newRoute, oldRoute); + if (transition === null) { + return; + } + + const oldState = transition[0]; + const newState = transition[1]; + assert(this.validTransitions_.get(oldState).has(newState)); + + if (oldState === RouteState.TOP_LEVEL) { + if (newState === RouteState.SECTION) { + this.scrollToSection_(newRoute); + } else if (newState === RouteState.SUBPAGE) { + this.enterSubpage_(newRoute); + } + // Nothing to do here for the case of RouteState.DIALOG or TOP_LEVEL. + // The latter happens when navigating from '/?search=foo' to '/' + // (clearing search results). + return; + } + + if (oldState === RouteState.SECTION) { + if (newState === RouteState.SECTION) { + this.scrollToSection_(newRoute); + } else if (newState === RouteState.SUBPAGE) { + this.enterSubpage_(newRoute); + } else if (newState === RouteState.TOP_LEVEL) { + this.scroller.scrollTop = 0; + } + // Nothing to do here for the case of RouteState.DIALOG. + return; + } + + if (oldState === RouteState.SUBPAGE) { + if (newState === RouteState.SECTION) { + this.enterMainPage_(oldRoute); + + // Scroll to the corresponding section, only if the user explicitly + // navigated to a section (via the menu). + if (!Router.getInstance().lastRouteChangeWasPopstate()) { + this.scrollToSection_(newRoute); + } + } else if (newState === RouteState.SUBPAGE) { + // Handle case where the two subpages belong to + // different sections, but are linked to each other. For example + // /storage and /accounts (in ChromeOS). + if (!oldRoute.contains(newRoute) && !newRoute.contains(oldRoute)) { + this.enterMainPage_(oldRoute).then(() => { + this.enterSubpage_(newRoute); + }); + return; + } + + // Handle case of subpage to sub-subpage navigation. + if (oldRoute.contains(newRoute)) { + this.scroller.scrollTop = 0; + return; + } + // When going from a sub-subpage to its parent subpage, scroll + // position is automatically restored, because we focus the + // sub-subpage entry point. + } else if (newState === RouteState.TOP_LEVEL) { + this.enterMainPage_(oldRoute); + } else if (newState === RouteState.DIALOG) { + // The only known case currently for such a transition is from + // /storage to /clearBrowserData. + this.enterMainPage_(oldRoute); + } + return; + } + + if (oldState === RouteState.INITIAL) { + if (newState === RouteState.SECTION) { + this.scrollToSection_(newRoute); + } else if (newState === RouteState.SUBPAGE) { + this.enterSubpage_(newRoute); + } + // Nothing to do here for the case of RouteState.DIALOG and TOP_LEVEL. + return; + } + + if (oldState === RouteState.DIALOG) { + if (newState === RouteState.SUBPAGE) { + // The only known case currently for such a transition is from + // /clearBrowserData back to /storage. + this.enterSubpage_(newRoute); + } + // Nothing to do for all other cases. + } + }, + + /** + * TODO(dpapad): Rename this to |querySection| to distinguish it from + * ensureSectionForRoute_() which force-renders the section as needed. + * Helper function to get a section from the local DOM. + * @param {string} section Section name of the element to get. + * @return {?HTMLElement} + */ + getSection(section) { + if (!section) { + return null; + } + return /** @type {?HTMLElement} */ ( + this.$$(`settings-section[section="${section}"]`)); + }, +}; + +/** @interface */ +export class MainPageBehaviorInterface { + constructor() { + /** @type {?HTMLElement} */ + this.scroller; + } + + /** + * @param {!Route} route + * @return {boolean} Whether the given route is part of |this| page. + */ + containsRoute(route) {} + + /** + * @param {!Route} newRoute + * @param {!Route=} oldRoute + */ + currentRouteChanged(newRoute, oldRoute) {} + + /** + * @param {string} section Section name of the element to get. + * @return {?HTMLElement} + */ + getSection(section) {} +}
diff --git a/chrome/browser/resources/settings/chromeos/main_page_mixin.ts b/chrome/browser/resources/settings/chromeos/main_page_mixin.ts deleted file mode 100644 index f5847c3e..0000000 --- a/chrome/browser/resources/settings/chromeos/main_page_mixin.ts +++ /dev/null
@@ -1,354 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {assert} from 'chrome://resources/js/assert_ts.js'; -import {beforeNextRender, dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {MinimumRoutes, Route, RouteObserverMixin, RouteObserverMixinInterface, Router} from '../router.js'; - -import {castExists} from './assert_extras.js'; -import {ensureLazyLoaded} from './ensure_lazy_loaded.js'; -import {SettingsIdleLoadElement} from './os_settings_page/settings_idle_load.js'; - -/** - * A categorization of every possible Settings URL, necessary for implementing - * a finite state machine. - */ -enum RouteState { - // Initial state before anything has loaded yet. - INITIAL = 'initial', - // A dialog that has a dedicated URL (e.g. /importData). - DIALOG = 'dialog', - // A section (basically a scroll position within the top level page, e.g, - // /appearance. - SECTION = 'section', - // A subpage, or sub-subpage e.g, /searchEngins. - SUBPAGE = 'subpage', - // The top level Settings page, '/'. - TOP_LEVEL = 'top-level', -} - -function classifyRoute(route: Route|undefined): RouteState { - if (!route) { - return RouteState.INITIAL; - } - const routes = Router.getInstance().getRoutes() as MinimumRoutes; - if (route === routes.BASIC || route === routes.ABOUT) { - return RouteState.TOP_LEVEL; - } - if (route.isSubpage()) { - return RouteState.SUBPAGE; - } - if (route.isNavigableDialog) { - return RouteState.DIALOG; - } - return RouteState.SECTION; -} - -const ALL_STATES = new Set([ - RouteState.DIALOG, - RouteState.SECTION, - RouteState.SUBPAGE, - RouteState.TOP_LEVEL, -]); - -/** - * A map holding all valid state transitions. - */ -const VALID_TRANSITIONS = new Map([ - [RouteState.INITIAL, ALL_STATES], - [ - RouteState.DIALOG, - new Set([ - RouteState.SECTION, - RouteState.SUBPAGE, - RouteState.TOP_LEVEL, - ]), - ], - [RouteState.SECTION, ALL_STATES], - [RouteState.SUBPAGE, ALL_STATES], - [RouteState.TOP_LEVEL, ALL_STATES], -]); - -type Constructor<T> = new (...args: any[]) => T; - -export interface MainPageMixinInterface extends RouteObserverMixinInterface { - scroller: HTMLElement|null; - containsRoute(route: Route|undefined): boolean; - currentRouteChanged(newRoute: Route, oldRoute?: Route): void; - querySection(section: string): HTMLElement|null; - loadAdvancedPage(): Promise<Element>; -} - -/** - * Responds to route changes by expanding, collapsing, or scrolling to - * sections on the page. Expanded sections take up the full height of the - * container. At most one section should be expanded at any given time. - */ -export const MainPageMixin = dedupingMixin( - <T extends Constructor<PolymerElement>>(superClass: T): T& - Constructor<MainPageMixinInterface> => { - const superclassBase = RouteObserverMixin(superClass) as T & - Constructor<RouteObserverMixinInterface>; - - class MainPageMixinInternal extends superclassBase implements - MainPageMixinInterface { - scroller: HTMLElement|null = null; - // Do not initialize manually. This is initialized by Polymer. - domHost: HTMLElement|null; - private lastScrollTop_: number = 0; - - override connectedCallback() { - this.scroller = - this.domHost ? this.domHost.parentElement : document.body; - - // Purposefully calling this after |scroller| has been initialized. - // currentRouteChanged() expects |scroller| to be defined and is - // called by this super method in RouteObserverMixin. - super.connectedCallback(); - } - - /** - * Method to be overridden by users of MainPageMixin. - * @return Whether the given route is part of |this| page. - */ - containsRoute(_route: Route|undefined): boolean { - return false; - } - - private shouldExpandAdvanced_(route: Route): boolean { - const routes = Router.getInstance().getRoutes() as MinimumRoutes; - return (this.tagName === 'OS-SETTINGS-PAGE') && routes.ADVANCED && - routes.ADVANCED.contains(route); - } - - loadAdvancedPage(): Promise<Element> { - return this.shadowRoot! - .querySelector<SettingsIdleLoadElement>( - '#advancedPageTemplate')!.get(); - } - - /** - * Finds the settings section corresponding to the given route. If the - * section is lazily loaded it force-renders it. - * Note: If the section resides within "advanced" settings, a - * 'hide-container' event is fired (necessary to avoid flashing). - * Callers are responsible for firing a 'show-container' event. - */ - private ensureSectionForRoute_(route: Route): Promise<HTMLElement> { - const section = this.querySection(route.section); - if (section) { - return Promise.resolve(section); - } - - // The function to use to wait for <dom-if>s to render. - const waitFn = beforeNextRender.bind(null, this); - - return new Promise(resolve => { - if (this.shouldExpandAdvanced_(route)) { - this.dispatchCustomEvent('hide-container'); - waitFn(() => { - this.loadAdvancedPage().then(() => { - resolve(this.querySection(route.section)!); - }); - }); - } else { - waitFn(() => { - resolve(this.querySection(route.section)!); - }); - } - }); - } - - private async enterSubpage_(route: Route) { - this.lastScrollTop_ = this.scroller!.scrollTop; - this.scroller!.scrollTop = 0; - this.classList.add('showing-subpage'); - this.dispatchCustomEvent('subpage-expand'); - - // Explicitly load the lazy_load.html module, since all subpages - // reside in the lazy loaded module. - ensureLazyLoaded(); - - const section = await this.ensureSectionForRoute_(route); - section.classList.add('expanded'); - // Fire event used by a11y tests only. - this.dispatchCustomEvent('settings-section-expanded'); - this.dispatchCustomEvent('show-container'); - } - - private enterMainPage_(oldRoute: Route): Promise<void> { - const oldSection = castExists(this.querySection(oldRoute.section)); - oldSection.classList.remove('expanded'); - this.classList.remove('showing-subpage'); - return new Promise((resolve) => { - requestAnimationFrame(() => { - if (Router.getInstance().lastRouteChangeWasPopstate()) { - this.scroller!.scrollTop = this.lastScrollTop_; - } - this.dispatchCustomEvent('showing-main-page'); - resolve(); - }); - }); - } - - private async scrollToSection_(route: Route) { - const section = await this.ensureSectionForRoute_(route); - this.dispatchCustomEvent('showing-section', {detail: section}); - this.dispatchCustomEvent('show-container'); - } - - /** - * Detects which state transition is appropriate for the given new/old - * routes. - */ - private getStateTransition_(newRoute: Route, oldRoute?: Route) { - const containsNew = this.containsRoute(newRoute); - const containsOld = this.containsRoute(oldRoute); - - if (!containsNew && !containsOld) { - // Nothing to do, since none of the old/new routes belong to this - // page. - return null; - } - - // Case where going from |this| page to an unrelated page. - // For example: - // |this| is os-settings-page AND - // oldRoute is /searchEngines AND - // newRoute is /help. - if (containsOld && !containsNew) { - return [classifyRoute(oldRoute), RouteState.TOP_LEVEL]; - } - - // Case where return from an unrelated page to |this| page. - // For example: - // |this| is os-settings-page AND - // oldRoute is /help AND - // newRoute is /searchEngines - if (!containsOld && containsNew) { - return [RouteState.TOP_LEVEL, classifyRoute(newRoute)]; - } - - // Case where transitioning between routes that both belong to |this| - // page. - return [classifyRoute(oldRoute), classifyRoute(newRoute)]; - } - - override currentRouteChanged(newRoute: Route, oldRoute?: Route) { - const transition = this.getStateTransition_(newRoute, oldRoute); - if (transition === null) { - return; - } - - const oldState = transition[0]; - const newState = transition[1]; - assert(VALID_TRANSITIONS.get(oldState)!.has(newState)); - - if (oldState === RouteState.TOP_LEVEL) { - if (newState === RouteState.SECTION) { - this.scrollToSection_(newRoute); - } else if (newState === RouteState.SUBPAGE) { - this.enterSubpage_(newRoute); - } - // Nothing to do here for the case of RouteState.DIALOG or - // TOP_LEVEL. The latter happens when navigating from '/?search=foo' - // to '/' (clearing search results). - return; - } - - if (oldState === RouteState.SECTION) { - if (newState === RouteState.SECTION) { - this.scrollToSection_(newRoute); - } else if (newState === RouteState.SUBPAGE) { - this.enterSubpage_(newRoute); - } else if (newState === RouteState.TOP_LEVEL) { - this.scroller!.scrollTop = 0; - } - // Nothing to do here for the case of RouteState.DIALOG. - return; - } - - if (oldState === RouteState.SUBPAGE) { - assert(oldRoute); - if (newState === RouteState.SECTION) { - this.enterMainPage_(oldRoute); - - // Scroll to the corresponding section, only if the user - // explicitly navigated to a section (via the menu). - if (!Router.getInstance().lastRouteChangeWasPopstate()) { - this.scrollToSection_(newRoute); - } - } else if (newState === RouteState.SUBPAGE) { - // Handle case where the two subpages belong to - // different sections, but are linked to each other. For example - // /storage and /accounts (in ChromeOS). - if (!oldRoute.contains(newRoute) && - !newRoute.contains(oldRoute)) { - this.enterMainPage_(oldRoute).then(() => { - this.enterSubpage_(newRoute); - }); - return; - } - - // Handle case of subpage to sub-subpage navigation. - if (oldRoute.contains(newRoute)) { - this.scroller!.scrollTop = 0; - return; - } - // When going from a sub-subpage to its parent subpage, scroll - // position is automatically restored, because we focus the - // sub-subpage entry point. - } else if (newState === RouteState.TOP_LEVEL) { - this.enterMainPage_(oldRoute); - } else if (newState === RouteState.DIALOG) { - // The only known case currently for such a transition is from - // /storage to /clearBrowserData. - this.enterMainPage_(oldRoute); - } - return; - } - - if (oldState === RouteState.INITIAL) { - if (newState === RouteState.SECTION) { - this.scrollToSection_(newRoute); - } else if (newState === RouteState.SUBPAGE) { - this.enterSubpage_(newRoute); - } - // Nothing to do here for the case of RouteState.DIALOG and - // TOP_LEVEL. - return; - } - - if (oldState === RouteState.DIALOG) { - if (newState === RouteState.SUBPAGE) { - // The only known case currently for such a transition is from - // /clearBrowserData back to /storage. - this.enterSubpage_(newRoute); - } - // Nothing to do for all other cases. - } - } - - /** - * Helper function to get a section from the local DOM. - */ - querySection(section: string): HTMLElement|null { - if (!section) { - return null; - } - return this.shadowRoot!.querySelector( - `settings-section[section="${section}"]`); - } - - private dispatchCustomEvent( - name: string, options?: CustomEventInit<unknown>) { - const event = new CustomEvent( - name, {bubbles: true, composed: true, ...options}); - this.dispatchEvent(event); - } - } - - return MainPageMixinInternal; - });
diff --git a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.ts b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.ts index 87f8638b..d534ec3 100644 --- a/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_about_page/os_about_page.ts
@@ -37,9 +37,10 @@ import {Setting} from '../../mojom-webui/setting.mojom-webui.js'; import {Route, Router} from '../../router.js'; import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js'; -import {MainPageMixin, MainPageMixinInterface} from '../main_page_mixin.js'; +import {MainPageBehavior, MainPageBehaviorInterface} from '../main_page_behavior.js'; import {recordSettingChange} from '../metrics_recorder.js'; import {routes} from '../os_route.js'; +import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js'; import {AboutPageBrowserProxy, AboutPageBrowserProxyImpl, AboutPageUpdateInfo, BrowserChannel, browserChannelToI18nId, RegulatoryInfo, TpmFirmwareUpdateStatusChangedEvent, UpdateStatus, UpdateStatusChangedEvent} from './about_page_browser_proxy.js'; import {getTemplate} from './os_about_page.html.js'; @@ -61,11 +62,13 @@ mixinBehaviors( [ DeepLinkingBehavior, + MainPageBehavior, + RouteObserverBehavior, ], - MainPageMixin(I18nMixin(WebUIListenerMixin(PolymerElement)))) as { - new (): PolymerElement & WebUIListenerMixinInterface & - I18nMixinInterface & MainPageMixinInterface & - DeepLinkingBehaviorInterface, + I18nMixin(WebUIListenerMixin(PolymerElement))) as { + new (): PolymerElement & DeepLinkingBehaviorInterface & + WebUIListenerMixinInterface & MainPageBehaviorInterface & + RouteObserverBehaviorInterface & I18nMixinInterface, }; class OsSettingsAboutPageElement extends OsSettingsAboutPageBaseElement { @@ -334,9 +337,12 @@ } override currentRouteChanged(newRoute: Route, oldRoute?: Route) { - // MainPageMixin#currentRouteChanged() should be the super class method + // super.currentRouteChanged() does not produce desired results since + // RouteObserverBehavior has higher precedence than MainPageBehavior given + // this element's behavior list order. In order to trigger the + // MainPageBehavior method, we must directly call it. // See https://crbug.com/1324103 for more details. - super.currentRouteChanged(newRoute, oldRoute); + MainPageBehavior.currentRouteChanged.call(this, newRoute, oldRoute); // Does not apply to this page. if (newRoute !== routes.ABOUT_ABOUT) {
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni index 44f3289..ae71a57 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.gni +++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -145,7 +145,7 @@ "chromeos/internet_page/internet_page_browser_proxy.js", "chromeos/kerberos_page/kerberos_accounts_browser_proxy.js", "chromeos/lazy_load.js", - "chromeos/main_page_mixin.ts", + "chromeos/main_page_behavior.js", "chromeos/metrics_recorder.js", "chromeos/multidevice_page/multidevice_browser_proxy.js", "chromeos/multidevice_page/multidevice_constants.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.ts b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.ts index 4be0526..bf8a0a09 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings_page/os_settings_page.ts
@@ -28,22 +28,28 @@ import '../os_bluetooth_page/os_bluetooth_page.js'; import '../os_icons.js'; -import {WebUIListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; +import {WebUIListenerMixin, WebUIListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {beforeNextRender, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {beforeNextRender, microTask, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {Route, Router} from '../../router.js'; import {castExists} from '../assert_extras.js'; -import {MainPageMixin} from '../main_page_mixin.js'; +import {MainPageBehavior, MainPageBehaviorInterface} from '../main_page_behavior.js'; import {AndroidAppsBrowserProxyImpl, AndroidAppsInfo} from '../os_apps_page/android_apps_browser_proxy.js'; import {OSPageVisibility} from '../os_page_visibility.js'; import {routes} from '../os_route.js'; +import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js'; import {getTemplate} from './os_settings_page.html.js'; +import {SettingsIdleLoadElement} from './settings_idle_load.js'; -const OsSettingsPageElementBase = - MainPageMixin(WebUIListenerMixin(PolymerElement)); +const OsSettingsPageElementBase = mixinBehaviors( + [MainPageBehavior, RouteObserverBehavior], + WebUIListenerMixin(PolymerElement)) as { + new (): PolymerElement & WebUIListenerMixinInterface & + MainPageBehaviorInterface & RouteObserverBehaviorInterface, +}; class OsSettingsPageElement extends OsSettingsPageElementBase { static get is() { @@ -206,8 +212,7 @@ assert(!this.hasExpandedSection_); } - // MainPageMixin#currentRouteChanged() should be the super class method - super.currentRouteChanged(newRoute, oldRoute); + MainPageBehavior.currentRouteChanged.call(this, newRoute, oldRoute); } override containsRoute(route: Route) { @@ -247,6 +252,11 @@ this.hasExpandedSection_ = true; } + private getAdvancedPageTemplate_(): SettingsIdleLoadElement { + return castExists(this.shadowRoot!.querySelector<SettingsIdleLoadElement>( + '#advancedPageTemplate')); + } + /** * Render the advanced page now (don't wait for idle). */ @@ -258,7 +268,7 @@ // In Polymer2, async() does not wait long enough for layout to complete. // beforeNextRender() must be used instead. beforeNextRender(this, () => { - this.loadAdvancedPage(); + this.getAdvancedPageTemplate_().get(); }); } @@ -274,7 +284,7 @@ if (!this.advancedToggleExpanded) { this.advancedToggleExpanded = true; microTask.run(() => { - this.loadAdvancedPage().then(() => { + this.getAdvancedPageTemplate_().get().then(() => { const event = new CustomEvent('scroll-to-top', { bubbles: true, composed: true,
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts index 8ab15d404..22543a4 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts
@@ -456,7 +456,7 @@ */ private onMenuClose_() { if (!this.getDrawer_().wasCanceled()) { - // If a navigation happened, MainPageMixin#currentRouteChanged + // If a navigation happened, MainPageBehavior#currentRouteChanged // handles focusing the corresponding section when we call // settings.NavigateTo(). this.navigateToActiveRoute_();
diff --git a/chrome/browser/resources/signin/signin_error/signin_error_app.html b/chrome/browser/resources/signin/signin_error/signin_error_app.html index db79065..dbb78f8 100644 --- a/chrome/browser/resources/signin/signin_error/signin_error_app.html +++ b/chrome/browser/resources/signin/signin_error/signin_error_app.html
@@ -34,7 +34,7 @@ hidden="[[hideNormalError_]]"> <p>$i18nRaw{signinErrorMessage}</p> <a id="learnMoreLink" href="#" on-click="onLearnMore_" - hidden="[[isSystemProfile_]]"> + hidden="[[fromProfilePicker_]]"> $i18nRaw{signinErrorLearnMore} </a> </div>
diff --git a/chrome/browser/resources/signin/signin_error/signin_error_app.ts b/chrome/browser/resources/signin/signin_error/signin_error_app.ts index bb651dd..bab273a 100644 --- a/chrome/browser/resources/signin/signin_error/signin_error_app.ts +++ b/chrome/browser/resources/signin/signin_error/signin_error_app.ts
@@ -29,9 +29,9 @@ static get properties() { return { - isSystemProfile_: { + fromProfilePicker_: { type: Boolean, - value: () => loadTimeData.getBoolean('isSystemProfile'), + value: () => loadTimeData.getBoolean('fromProfilePicker'), }, switchButtonUnavailable_: { @@ -68,7 +68,7 @@ }; } - private isSystemProfile_: boolean; + private fromProfilePicker_: boolean; private switchButtonUnavailable_: boolean; private hideNormalError_: boolean; private hideProfileBlockingErrors_: boolean[];
diff --git a/chrome/browser/sharing/sharing_device_source_sync.cc b/chrome/browser/sharing/sharing_device_source_sync.cc index 792e3c7f..2a8b7af 100644 --- a/chrome/browser/sharing/sharing_device_source_sync.cc +++ b/chrome/browser/sharing/sharing_device_source_sync.cc
@@ -26,26 +26,13 @@ using sync_pb::SharingSpecificFields; namespace { -bool IsDesktop(sync_pb::SyncEnums::DeviceType type) { - switch (type) { - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_CROS: - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_LINUX: - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_MAC: - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_WIN: - return true; - case sync_pb::SyncEnums_DeviceType_TYPE_PHONE: - case sync_pb::SyncEnums_DeviceType_TYPE_TABLET: - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_UNSET: - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_OTHER: - return false; - } -} bool IsStale(const syncer::DeviceInfo& device) { if (base::FeatureList::IsEnabled(kSharingMatchPulseInterval)) { base::TimeDelta pulse_delta = base::Hours( - IsDesktop(device.device_type()) ? kSharingPulseDeltaDesktopHours.Get() - : kSharingPulseDeltaAndroidHours.Get()); + device.form_factor() == syncer::DeviceInfo::FormFactor::kDesktop + ? kSharingPulseDeltaDesktopHours.Get() + : kSharingPulseDeltaAndroidHours.Get()); base::Time min_updated_time = base::Time::Now() - device.pulse_interval() - pulse_delta; return device.last_updated_timestamp() < min_updated_time;
diff --git a/chrome/browser/sharing/sharing_service_proxy_android.cc b/chrome/browser/sharing/sharing_service_proxy_android.cc index d15c234..6b0bc453 100644 --- a/chrome/browser/sharing/sharing_service_proxy_android.cc +++ b/chrome/browser/sharing/sharing_service_proxy_android.cc
@@ -90,7 +90,7 @@ env, j_device_info, base::android::ConvertUTF8ToJavaString(env, device_info->guid()), base::android::ConvertUTF8ToJavaString(env, device_info->client_name()), - device_info->device_type(), + static_cast<int>(device_info->form_factor()), device_info->last_updated_timestamp().ToJavaTime()); } }
diff --git a/chrome/browser/sharing/sharing_utils.cc b/chrome/browser/sharing/sharing_utils.cc index 9a32c6e..14ce9a6 100644 --- a/chrome/browser/sharing/sharing_utils.cc +++ b/chrome/browser/sharing/sharing_utils.cc
@@ -109,22 +109,22 @@ } SharingDevicePlatform GetDevicePlatform(const syncer::DeviceInfo& device_info) { - switch (device_info.device_type()) { - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_CROS: + switch (device_info.os_type()) { + case syncer::DeviceInfo::OsType::kChromeOsLacros: + case syncer::DeviceInfo::OsType::kChromeOsAsh: return SharingDevicePlatform::kChromeOS; - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_LINUX: + case syncer::DeviceInfo::OsType::kLinux: return SharingDevicePlatform::kLinux; - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_MAC: + case syncer::DeviceInfo::OsType::kMac: return SharingDevicePlatform::kMac; - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_WIN: + case syncer::DeviceInfo::OsType::kWindows: return SharingDevicePlatform::kWindows; - case sync_pb::SyncEnums_DeviceType_TYPE_PHONE: - case sync_pb::SyncEnums_DeviceType_TYPE_TABLET: - if (device_info.manufacturer_name() == "Apple Inc.") - return SharingDevicePlatform::kIOS; + case syncer::DeviceInfo::OsType::kAndroid: return SharingDevicePlatform::kAndroid; - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_UNSET: - case sync_pb::SyncEnums::DeviceType::SyncEnums_DeviceType_TYPE_OTHER: + case syncer::DeviceInfo::OsType::kIOS: + return SharingDevicePlatform::kIOS; + case syncer::DeviceInfo::OsType::kUnknown: + case syncer::DeviceInfo::OsType::kFuchsia: return SharingDevicePlatform::kUnknown; } }
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java index 67a8fb6..4862c2d2 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillBridge.java
@@ -73,10 +73,11 @@ } @CalledByNative - private void showCredentials(GURL url, boolean isOriginSecure, Credential[] credentials, - WebAuthnCredential[] webAuthnCredentials, boolean submitCredential) { - mTouchToFillComponent.showCredentials(url, isOriginSecure, Arrays.asList(credentials), - Arrays.asList(webAuthnCredentials), submitCredential); + private void showCredentials(GURL url, boolean isOriginSecure, + WebAuthnCredential[] webAuthnCredentials, Credential[] credentials, + boolean submitCredential) { + mTouchToFillComponent.showCredentials(url, isOriginSecure, + Arrays.asList(webAuthnCredentials), Arrays.asList(credentials), submitCredential); } @Override
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillCoordinator.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillCoordinator.java index 4129c72..65084ab 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillCoordinator.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillCoordinator.java
@@ -42,10 +42,11 @@ } @Override - public void showCredentials(GURL url, boolean isOriginSecure, List<Credential> credentials, - List<WebAuthnCredential> webAuthnCredentials, boolean triggerSubmission) { + public void showCredentials(GURL url, boolean isOriginSecure, + List<WebAuthnCredential> webAuthnCredentials, List<Credential> credentials, + boolean triggerSubmission) { mMediator.showCredentials( - url, isOriginSecure, credentials, webAuthnCredentials, triggerSubmission); + url, isOriginSecure, webAuthnCredentials, credentials, triggerSubmission); } /**
diff --git a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java index 609a5e7..f0a9e76 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java +++ b/chrome/browser/touch_to_fill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillMediator.java
@@ -80,8 +80,9 @@ mDesiredIconSize = desiredIconSize; } - void showCredentials(GURL url, boolean isOriginSecure, List<Credential> credentials, - List<WebAuthnCredential> webAuthnCredentials, boolean triggerSubmission) { + void showCredentials(GURL url, boolean isOriginSecure, + List<WebAuthnCredential> webAuthnCredentials, List<Credential> credentials, + boolean triggerSubmission) { assert credentials != null; mModel.set(ON_CLICK_MANAGE, this::onManagePasswordSelected); mModel.set(MANAGE_BUTTON_TEXT, getManageButtonText(credentials, webAuthnCredentials));
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_af.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_af.xtb index 0a2b11b..40d9781 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_af.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_af.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="af"> <translation id="1220509181886849806">Gebruik gestoorde wagwoord?</translation> +<translation id="1580351948163139119">Wagwoord vir <ph name="USERNAME" /></translation> <translation id="1717486229951421299">Lys eiebewyse wat met aanraking ingevul moet word, is teen halwe hoogte oopgemaak.</translation> <translation id="207576718733492531">Lys eiebewyse wat met aanraking ingevul moet word, is toegemaak.</translation> <translation id="2359808026110333948">Gaan voort</translation> @@ -16,5 +17,6 @@ <translation id="5441504010984421144">Lys eiebewyse wat met aanraking ingevul moet word, is teen volle hoogte oopgemaak.</translation> <translation id="5591247451101092906">Gebruik gestoorde wagwoord of wagwoordsleutel?</translation> <translation id="5624120631404540903">Bestuur wagwoorde</translation> +<translation id="7736236483645733578">Wagwoordsleutel vir <ph name="USERNAME" />, gebruik jou skermslot.</translation> <translation id="804577341878669140">Gaan voort met rekening</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb index f13f800..f8ae160 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ar.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">تم فتح قائمة بيانات الاعتماد التي يتم ملؤها باللمس على طول النصف السفلي من الشاشة.</translation> <translation id="207576718733492531">تم إغلاق قائمة بيانات الاعتماد التي يتم ملؤها باللمس.</translation> <translation id="2359808026110333948">متابعة</translation> +<translation id="2364266287022099258">هل تريد استخدام مفتاح المرور المحفوظ؟</translation> <translation id="2410754283952462441">اختيار حساب</translation> <translation id="3399357656427473483">قائمة ببيانات الاعتماد التي يتم ملؤها باللمس</translation> <translation id="3653689374478248324">سيتم تسجيل دخولك إلى <ph name="SITE_NAME" />.</translation> <translation id="3950820424414687140">تسجيل الدخول</translation> <translation id="4598345735110653698">إدارة مفاتيح المرور</translation> <translation id="4907224763885298217">استخدام قفل الشاشة</translation> +<translation id="5012523644916800014">إدارة كلمات المرور ومفاتيح المرور</translation> <translation id="5441504010984421144">تم فتح قائمة بيانات الاعتماد التي يجب ملؤها باللمس على طول الشاشة.</translation> +<translation id="5591247451101092906">هل تريد استخدام كلمة المرور أو مفتاح المرور المحفوظَين؟</translation> <translation id="5624120631404540903">إدارة كلمات المرور</translation> <translation id="804577341878669140">المتابعة باستخدام حساب</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bn.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bn.xtb index 4a15ff50..d302c05 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bn.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bn.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা হাফ স্ক্রিন জুড়ে খুলেছে।</translation> <translation id="207576718733492531">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা বন্ধ রয়েছে।</translation> <translation id="2359808026110333948">চালিয়ে যান</translation> +<translation id="2364266287022099258">সেভ করা 'পাসকী' ব্যবহার করবেন?</translation> <translation id="2410754283952462441">একটি অ্যাকাউন্ট বেছে নিন</translation> <translation id="3399357656427473483">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা।</translation> <translation id="3653689374478248324">আপনি <ph name="SITE_NAME" />-এ সাইন-ইন করবেন</translation> <translation id="3950820424414687140">সাইন-ইন করুন</translation> <translation id="4598345735110653698">'পাসকী' ম্যানেজ করুন</translation> <translation id="4907224763885298217">আপনার স্ক্রিন লক ব্যবহার করুন</translation> +<translation id="5012523644916800014">পাসওয়ার্ড ও 'পাসকী' ম্যানেজ করুন</translation> <translation id="5441504010984421144">টাচ করে পূরণ করা যাবে এমন ক্রেডেনশিয়ালের তালিকা ফুল স্ক্রিন জুড়ে খুলেছে।</translation> +<translation id="5591247451101092906">সেভ থাকা পাসওয়ার্ড বা 'পাসকী' ব্যবহার করবেন?</translation> <translation id="5624120631404540903">পাসওয়ার্ডগুলি পরিচালনা করুন</translation> <translation id="804577341878669140">এই অ্যাকাউন্ট ব্যবহার করে চালিয়ে যেতে চান:</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bs.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bs.xtb index df7de11..600c4af 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bs.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_bs.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="bs"> <translation id="1220509181886849806">Koristiti sačuvanu lozinku?</translation> +<translation id="1580351948163139119">Zaporka za <ph name="USERNAME" />.</translation> <translation id="1717486229951421299">Lista akreditiva za popunjavanje dodirom je otvorena na pola visine.</translation> <translation id="207576718733492531">Lista akreditiva za popunjavanje dodirom je zatvorena.</translation> <translation id="2359808026110333948">Nastavi</translation> @@ -16,5 +17,6 @@ <translation id="5441504010984421144">Lista akreditiva za popunjavanje dodirom je otvorena na cijelom ekranu.</translation> <translation id="5591247451101092906">Koristiti sačuvanu lozinku ili pristupni ključ?</translation> <translation id="5624120631404540903">Upravljajte lozinkama</translation> +<translation id="7736236483645733578">Pristupni ključ za <ph name="USERNAME" />, upotrijebite zaključavanje zaslona.</translation> <translation id="804577341878669140">Nastavite s računom</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cs.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cs.xtb index d0890cb3..bc32962 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cs.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cs.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Seznam identifikačních údajů k vyplnění při klepnutí je otevřený na polovinu výšky.</translation> <translation id="207576718733492531">Seznam identifikačních údajů k vyplnění při klepnutí je zavřený.</translation> <translation id="2359808026110333948">Pokračovat</translation> +<translation id="2364266287022099258">Použít uložený přístupový klíč?</translation> <translation id="2410754283952462441">Vyberte účet</translation> <translation id="3399357656427473483">Seznam identifikačních údajů k vyplnění při klepnutí.</translation> <translation id="3653689374478248324">Budete přihlášeni na web <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Přihlaste se</translation> <translation id="4598345735110653698">Spravovat přístupové klíče</translation> <translation id="4907224763885298217">Použít zámek obrazovky</translation> +<translation id="5012523644916800014">Spravovat hesla a přístupové klíče</translation> <translation id="5441504010984421144">Seznam identifikačních údajů k vyplnění při klepnutí je otevřený na celou výšku.</translation> +<translation id="5591247451101092906">Použít uložené heslo nebo přístupový klíč?</translation> <translation id="5624120631404540903">Spravovat hesla</translation> <translation id="804577341878669140">Pokračovat s účtem</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cy.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cy.xtb index d5c3ea6..933abba 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cy.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_cy.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Rhestr o fanylion adnabod i'w llenwi ar ôl agor ar hanner uchder.</translation> <translation id="207576718733492531">Mae'r rhestr o fanylion adnabod sydd i'w llenwi wrth gyffwrdd ar gau.</translation> <translation id="2359808026110333948">Parhau</translation> +<translation id="2364266287022099258">Defnyddio cod pas sydd wedi'i gadw?</translation> <translation id="2410754283952462441">Dewiswch gyfrif</translation> <translation id="3399357656427473483">Rhestr o fanylion adnabod sydd i'w llenwi wrth gyffwrdd.</translation> <translation id="3653689374478248324">Byddwch yn mewngofnodi i <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Mewngofnodwch</translation> <translation id="4598345735110653698">Rheoli codau pas</translation> <translation id="4907224763885298217">Defnyddio'ch clo sgrîn</translation> +<translation id="5012523644916800014">Rheoli cyfrineiriau a chodau pas</translation> <translation id="5441504010984421144">Rhestr o fanylion adnabod i'w llenwi ar ôl agor ar uchder llawn.</translation> +<translation id="5591247451101092906">Defnyddio cyfrinair neu god pas sydd wedi'i gadw?</translation> <translation id="5624120631404540903">Rheoli cyfrineiriau</translation> <translation id="804577341878669140">Parhau gyda'r cyfrif</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb index 7d0de9f..d812558 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_da.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Listen over loginoplysninger, der udfyldes ved berøring, er åbnet i halv højde.</translation> <translation id="207576718733492531">Listen over loginoplysninger, der udfyldes ved berøring, er lukket.</translation> <translation id="2359808026110333948">Fortsæt</translation> +<translation id="2364266287022099258">Vil du bruge den gemte adgangsnøgle?</translation> <translation id="2410754283952462441">Vælg en konto</translation> <translation id="3399357656427473483">Liste over loginoplysninger, der udfyldes ved berøring.</translation> <translation id="3653689374478248324">Du logger ind på <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Log ind</translation> <translation id="4598345735110653698">Administrer adgangskoder</translation> <translation id="4907224763885298217">Brug din skærmlås</translation> +<translation id="5012523644916800014">Administrer adgangskoder og adgangsnøgler</translation> <translation id="5441504010984421144">Listen over loginoplysninger, der udfyldes ved berøring, er åbnet i fuld højde.</translation> +<translation id="5591247451101092906">Vil du bruge din gemte adgangskode eller adgangsnøgle?</translation> <translation id="5624120631404540903">Administrer adgangskoder</translation> <translation id="804577341878669140">Fortsæt med konto</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_de.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_de.xtb index ecbc3b974..89c7ffc8 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_de.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_de.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist halb geöffnet.</translation> <translation id="207576718733492531">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist geschlossen.</translation> <translation id="2359808026110333948">Weiter</translation> +<translation id="2364266287022099258">Gespeicherten Passkey verwenden?</translation> <translation id="2410754283952462441">Konto auswählen</translation> <translation id="3399357656427473483">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist geöffnet.</translation> <translation id="3653689374478248324">Du meldest dich bei <ph name="SITE_NAME" /> an</translation> <translation id="3950820424414687140">Anmelden</translation> <translation id="4598345735110653698">Passkeys verwalten</translation> <translation id="4907224763885298217">Displaysperre verwenden</translation> +<translation id="5012523644916800014">Passwörter und Passkeys verwalten</translation> <translation id="5441504010984421144">Die Liste der Anmeldedaten, die bei Berührung ausgefüllt werden, ist ganz geöffnet.</translation> +<translation id="5591247451101092906">Gespeichertes Passwort oder gespeicherten Passkey verwenden?</translation> <translation id="5624120631404540903">Passwörter verwalten</translation> <translation id="804577341878669140">Mit Konto fortfahren</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_et.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_et.xtb index 2ec4f0acf..7cde4d9 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_et.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_et.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Loend mandaatidest, mis tuleb puudutusega täita, on avatud poolele kõrgusele.</translation> <translation id="207576718733492531">Loend mandaatidest, mis tuleb puudutusega täita, on suletud.</translation> <translation id="2359808026110333948">Jätka</translation> +<translation id="2364266287022099258">Kas kasutada salvestatud pääsukoodi?</translation> <translation id="2410754283952462441">Konto valimine</translation> <translation id="3399357656427473483">Loend mandaatidest, mis tuleb puudutusega täita.</translation> <translation id="3653689374478248324">Logite sisse saidile <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Logige sisse</translation> <translation id="4598345735110653698">Pääsukoodide haldamine</translation> <translation id="4907224763885298217">Kasutage ekraanilukku</translation> +<translation id="5012523644916800014">Paroolide ja pääsukoodide haldamine</translation> <translation id="5441504010984421144">Loend mandaatidest, mis tuleb puudutusega täita, on avatud täiskõrgusele.</translation> +<translation id="5591247451101092906">Kas kasutada salvestatud parooli või pääsukoodi?</translation> <translation id="5624120631404540903">Paroolide haldamine</translation> <translation id="804577341878669140">Jätkake selle kontoga</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fi.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fi.xtb index 18930f52..8b33a4c3 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fi.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_fi.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Kosketuksella täytettävien kirjautumistietojen lista avattu puolen näytön korkeudella.</translation> <translation id="207576718733492531">Kosketuksella täytettävien kirjautumistietojen lista on suljettu.</translation> <translation id="2359808026110333948">Jatka</translation> +<translation id="2364266287022099258">Käytetäänkö tallennettua avainkoodia?</translation> <translation id="2410754283952462441">Valitse tili</translation> <translation id="3399357656427473483">Kosketuksella täytettävien kirjautumistietojen lista</translation> <translation id="3653689374478248324">Kirjaudut sisään osoitteeseen <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Kirjaudu sisään</translation> <translation id="4598345735110653698">Hallinnoi avainkoodeja</translation> <translation id="4907224763885298217">Avaa näytön lukitus</translation> +<translation id="5012523644916800014">Muokkaa salasanoja ja avainkoodeja</translation> <translation id="5441504010984421144">Kosketuksella täytettävien kirjautumistietojen lista avattu koko näytön korkeudella.</translation> +<translation id="5591247451101092906">Käytetäänkö tallennettua salasanaa vai avainkoodia?</translation> <translation id="5624120631404540903">Hallitse salasanoja</translation> <translation id="804577341878669140">Jatka tilin avulla</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hr.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hr.xtb index f0c3510..38d56f4 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hr.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_hr.xtb
@@ -2,6 +2,7 @@ <!DOCTYPE translationbundle> <translationbundle lang="hr"> <translation id="1220509181886849806">Upotrijebiti spremljenu zaporku?</translation> +<translation id="1580351948163139119">Zaporka za <ph name="USERNAME" />.</translation> <translation id="1717486229951421299">Popis vjerodajnica za unos dodirom otvoren je na pola visine.</translation> <translation id="207576718733492531">Popis vjerodajnica za unos dodirom zatvoren je.</translation> <translation id="2359808026110333948">Nastavi</translation> @@ -16,5 +17,6 @@ <translation id="5441504010984421144">Popis vjerodajnica za unos dodirom otvoren je preko cijelog zaslona.</translation> <translation id="5591247451101092906">Želite li koristiti spremljenu zaporku ili pristupni ključ?</translation> <translation id="5624120631404540903">Upravljanje zaporkama</translation> +<translation id="7736236483645733578">Pristupni ključ za <ph name="USERNAME" />, upotrijebite zaključavanje zaslona.</translation> <translation id="804577341878669140">Nastavite uz račun</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb index a41851c0..e9f1099 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_id.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Daftar kredensial yang terisi dengan gestur sentuhan sedang terbuka setengah.</translation> <translation id="207576718733492531">Daftar kredensial yang terisi dengan gestur sentuhan sedang tertutup.</translation> <translation id="2359808026110333948">Lanjutkan</translation> +<translation id="2364266287022099258">Gunakan kunci sandi tersimpan?</translation> <translation id="2410754283952462441">Pilih akun</translation> <translation id="3399357656427473483">Daftar kredensial yang terisi dengan gestur sentuhan.</translation> <translation id="3653689374478248324">Anda akan login ke <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Login</translation> <translation id="4598345735110653698">Kelola kunci sandi</translation> <translation id="4907224763885298217">Gunakan kunci layar</translation> +<translation id="5012523644916800014">Kelola sandi dan kunci sandi</translation> <translation id="5441504010984421144">Daftar kredensial yang terisi dengan gestur sentuhan sedang terbuka sepenuhnya.</translation> +<translation id="5591247451101092906">Gunakan sandi atau kunci sandi tersimpan?</translation> <translation id="5624120631404540903">Kelola sandi</translation> <translation id="804577341878669140">Lanjutkan dengan akun</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb index fbb26169..a81e62b 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ja.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">タップ操作で入力する認証情報のリストが画面の下半分に表示されています。</translation> <translation id="207576718733492531">タップ操作で入力する認証情報のリストは閉じています。</translation> <translation id="2359808026110333948">続行</translation> +<translation id="2364266287022099258">保存したパスキーを使用しますか?</translation> <translation id="2410754283952462441">アカウントの選択</translation> <translation id="3399357656427473483">タップ操作で入力する認証情報のリスト。</translation> <translation id="3653689374478248324"><ph name="SITE_NAME" /> にログインします</translation> <translation id="3950820424414687140">ログイン</translation> <translation id="4598345735110653698">パスキーを管理</translation> <translation id="4907224763885298217">画面ロックを使用する</translation> +<translation id="5012523644916800014">パスワードとパスキーを管理</translation> <translation id="5441504010984421144">タップ操作で入力する認証情報のリストが画面全体に表示されています。</translation> +<translation id="5591247451101092906">保存したパスワードまたはパスキーを使用しますか?</translation> <translation id="5624120631404540903">パスワードを管理</translation> <translation id="804577341878669140">次のアカウントで続行</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb index 023978e..207ca07 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ko.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">터치 시 작성되는 사용자 인증 정보 목록이 절반 높이로 열렸습니다.</translation> <translation id="207576718733492531">터치 시 작성되는 사용자 인증 정보 목록이 닫혔습니다.</translation> <translation id="2359808026110333948">계속</translation> +<translation id="2364266287022099258">저장된 패스키를 사용하시겠습니까?</translation> <translation id="2410754283952462441">계정 선택</translation> <translation id="3399357656427473483">터치 시 작성되는 사용자 인증 정보 목록입니다.</translation> <translation id="3653689374478248324"><ph name="SITE_NAME" />에 로그인합니다</translation> <translation id="3950820424414687140">로그인</translation> <translation id="4598345735110653698">패스키 관리</translation> <translation id="4907224763885298217">화면 잠금 사용</translation> +<translation id="5012523644916800014">비밀번호 및 패스키 관리</translation> <translation id="5441504010984421144">터치 시 작성되는 사용자 인증 정보 목록이 전체 높이로 열렸습니다.</translation> +<translation id="5591247451101092906">저장된 비밀번호 또는 패스키를 사용하시겠습니까?</translation> <translation id="5624120631404540903">비밀번호 관리</translation> <translation id="804577341878669140">계정을 사용하여 로그인</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb index 54297b04..6f95bc7 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ky.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Эсептик дайындардын басып коюп толтурула турган тизмеси жарымына чейин ачылды.</translation> <translation id="207576718733492531">Эсептик дайындардын басып коюп толтурула турган тизмеси жабык.</translation> <translation id="2359808026110333948">Улантуу</translation> +<translation id="2364266287022099258">Сакталган мүмкүндүк алуу ачкычы колдонулсунбу?</translation> <translation id="2410754283952462441">Аккаунт тандоо</translation> <translation id="3399357656427473483">Эсептик дайындардын басып коюп толтурула турган тизмеси.</translation> <translation id="3653689374478248324"><ph name="SITE_NAME" /> сайтына киресиз</translation> <translation id="3950820424414687140">Кирүү</translation> <translation id="4598345735110653698">Мүмкүндүк алуу ачкычтарын тескөө</translation> <translation id="4907224763885298217">Экранды бөгөттөөнү колдонуңуз</translation> +<translation id="5012523644916800014">Сырсөздөрдү жана мүмкүндүк алуу ачкычтарын тескөө</translation> <translation id="5441504010984421144">Эсептик дайындардын басып коюп толтурула турган тизмеси толугу менен ачылды.</translation> +<translation id="5591247451101092906">Сакталган сырсөз же мүмкүндүк алуу ачкычы колдонулсунбу?</translation> <translation id="5624120631404540903">Сырсөздөрдү башкаруу</translation> <translation id="804577341878669140">Аккаунт менен улантуу</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb index 6ae9424..7be8d66 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_lt.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas atidarytas per pusę ekrano aukščio.</translation> <translation id="207576718733492531">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas uždarytas.</translation> <translation id="2359808026110333948">Tęskite</translation> +<translation id="2364266287022099258">Naudoti išsaugotą „passkey"?</translation> <translation id="2410754283952462441">Pasirinkite paskyrą</translation> <translation id="3399357656427473483">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas.</translation> <translation id="3653689374478248324">Prisijungsite prie svetainės <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Prisijungti</translation> <translation id="4598345735110653698">Tvarkyti slaptažodžius</translation> <translation id="4907224763885298217">Naudokite ekrano užraktą</translation> +<translation id="5012523644916800014">Tvarkyti slaptažodžius ir „passkey“</translation> <translation id="5441504010984421144">Prisijungimo duomenų, kuriuos galima užpildyti palietus, sąrašas atidarytas per visą ekrano aukštį.</translation> +<translation id="5591247451101092906">Naudoti išsaugotą slaptažodį arba „passkey“?</translation> <translation id="5624120631404540903">Tvarkyti slaptažodžius</translation> <translation id="804577341878669140">Tęsti naudojant paskyrą</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pa.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pa.xtb index 2947eb4..4652e06 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pa.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pa.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ ਅੱਧੀ ਉਚਾਈ ਤੱਕ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> <translation id="207576718733492531">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ ਬੰਦ ਹੈ।</translation> <translation id="2359808026110333948">ਜਾਰੀ ਰੱਖੋ</translation> +<translation id="2364266287022099258">ਕੀ ਰੱਖਿਅਤ ਕੀਤੀ ਪਾਸਕੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?</translation> <translation id="2410754283952462441">ਕੋਈ ਖਾਤਾ ਚੁਣੋ</translation> <translation id="3399357656427473483">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ</translation> <translation id="3653689374478248324">ਤੁਸੀਂ <ph name="SITE_NAME" /> ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰੋਗੇ</translation> <translation id="3950820424414687140">ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="4598345735110653698">ਪਾਸਕੀਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="4907224763885298217">ਆਪਣਾ ਸਕ੍ਰੀਨ ਲਾਕ ਵਰਤੋ</translation> +<translation id="5012523644916800014">ਪਾਸਵਰਡਾਂ ਅਤੇ ਪਾਸਕੀਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> <translation id="5441504010984421144">ਸਪਰਸ਼ ਕਰਕੇ ਭਰੇ ਜਾਣ ਵਾਲੇ ਕ੍ਰੀਡੈਂਸ਼ੀਅਲਾਂ ਦੀ ਸੂਚੀ ਪੂਰੀ ਉਚਾਈ ਤੱਕ ਖੁੱਲ੍ਹੀ ਹੋਈ ਹੈ।</translation> +<translation id="5591247451101092906">ਕੀ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਜਾਂ ਪਾਸਕੀ ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਹੈ?</translation> <translation id="5624120631404540903">ਪਾਸਵਰਡ ਵਿਵਸਥਿਤ ਕਰੋ</translation> <translation id="804577341878669140">ਖਾਤੇ ਨਾਲ ਜਾਰੀ ਰੱਖੋ</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pl.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pl.xtb index 2e11c7b..c14d1bd6 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pl.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_pl.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Lista uprawnień do wypełnienia po kliknięciu jest otwarta do połowy wysokości.</translation> <translation id="207576718733492531">Lista uprawnień do wypełnienia po kliknięciu jest zamknięta.</translation> <translation id="2359808026110333948">Dalej</translation> +<translation id="2364266287022099258">Użyć zapisanego klucza?</translation> <translation id="2410754283952462441">Wybierz konto</translation> <translation id="3399357656427473483">Lista uprawnień do wypełnienia po kliknięciu.</translation> <translation id="3653689374478248324">Zalogujesz się w witrynie <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Zaloguj się</translation> <translation id="4598345735110653698">Zarządzaj kluczami</translation> <translation id="4907224763885298217">Użyj blokady ekranu</translation> +<translation id="5012523644916800014">Zarządzaj hasłami i kluczami</translation> <translation id="5441504010984421144">Lista uprawnień do wypełnienia po kliknięciu jest otwarta na całą wysokość.</translation> +<translation id="5591247451101092906">Użyć zapisanego hasła lub klucza?</translation> <translation id="5624120631404540903">Zarządzaj hasłami</translation> <translation id="804577341878669140">Kontynuuj na koncie</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb index ed4336c..325e9eb3c 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_ru.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Список учетных данных, которые можно ввести прикосновением, развернут на половину экрана.</translation> <translation id="207576718733492531">Список учетных данных, которые можно ввести прикосновением, закрыт.</translation> <translation id="2359808026110333948">Продолжить</translation> +<translation id="2364266287022099258">Использовать сохраненный ключ доступа?</translation> <translation id="2410754283952462441">Выберите аккаунт</translation> <translation id="3399357656427473483">Список учетных данных, которые можно ввести прикосновением.</translation> <translation id="3653689374478248324">Будет выполнен вход на сайте <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Вход</translation> <translation id="4598345735110653698">Настроить ключи доступа</translation> <translation id="4907224763885298217">Использовать блокировку экрана</translation> +<translation id="5012523644916800014">Управление паролями и ключами доступа</translation> <translation id="5441504010984421144">Список учетных данных, которые можно ввести прикосновением, развернут на весь экран.</translation> +<translation id="5591247451101092906">Использовать сохраненный пароль или ключ доступа?</translation> <translation id="5624120631404540903">Настройки паролей</translation> <translation id="804577341878669140">Вход с аккаунтом</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sr-Latn.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sr-Latn.xtb index fc0f5d3..2cca4f05 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sr-Latn.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sr-Latn.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Lista akreditiva koji treba da se unesu na dodir se otvorila do polovine ekrana.</translation> <translation id="207576718733492531">Lista akreditiva koji treba da se unesu na dodir je zatvorena.</translation> <translation id="2359808026110333948">Nastavi</translation> +<translation id="2364266287022099258">Želite da koristite sačuvani pristupni kôd?</translation> <translation id="2410754283952462441">Izaberite nalog</translation> <translation id="3399357656427473483">Lista akreditiva koji treba da se unesu na dodir.</translation> <translation id="3653689374478248324">Prijavićete se na <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Prijavi me</translation> <translation id="4598345735110653698">Upravljajte pristupnim kodovima</translation> <translation id="4907224763885298217">Koristite zaključavanje ekrana</translation> +<translation id="5012523644916800014">Upravljajte lozinkama i pristupnim kodovima</translation> <translation id="5441504010984421144">Lista akreditiva koji treba da se unesu na dodir se otvorila na celom ekranu,</translation> +<translation id="5591247451101092906">Želite da koristite sačuvanu lozinku ili pristupni kôd?</translation> <translation id="5624120631404540903">Upravljaj lozinkama</translation> <translation id="804577341878669140">Nastavite sa nalogom</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sr.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sr.xtb index 96382e5..84858c5 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sr.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sr.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Листа акредитива који треба да се унесу на додир се отворила до половине екрана.</translation> <translation id="207576718733492531">Листа акредитива који треба да се унесу на додир је затворена.</translation> <translation id="2359808026110333948">Настави</translation> +<translation id="2364266287022099258">Желите да користите сачувани приступни кôд?</translation> <translation id="2410754283952462441">Изаберите налог</translation> <translation id="3399357656427473483">Листа акредитива који треба да се унесу на додир.</translation> <translation id="3653689374478248324">Пријавићете се на <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Пријави ме</translation> <translation id="4598345735110653698">Управљајте приступним кодовима</translation> <translation id="4907224763885298217">Користите закључавање екрана</translation> +<translation id="5012523644916800014">Управљајте лозинкама и приступним кодовима</translation> <translation id="5441504010984421144">Листа акредитива који треба да се унесу на додир се отворила на целом екрану,</translation> +<translation id="5591247451101092906">Желите да користите сачувану лозинку или приступни кôд?</translation> <translation id="5624120631404540903">Управљај лозинкама</translation> <translation id="804577341878669140">Наставите са налогом</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sw.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sw.xtb index b52959ae2..40ef650 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sw.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_sw.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Orodha ya vitambulisho vya kujaza kwa kugusa imefunguliwa kwenye nusu ya skrini.</translation> <translation id="207576718733492531">Orodha ya vitambulisho vya kujaza kwa kugusa imefungwa.</translation> <translation id="2359808026110333948">Endelea</translation> +<translation id="2364266287022099258">Ungependa kutumia ufunguo wa siri uliohifadhiwa?</translation> <translation id="2410754283952462441">Chagua akaunti</translation> <translation id="3399357656427473483">Orodha ya vitambulisho vya kujaza kwa kugusa.</translation> <translation id="3653689374478248324">Utaingia katika akaunti ya <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">Ingia katika akaunti</translation> <translation id="4598345735110653698">Dhibiti manenosiri</translation> <translation id="4907224763885298217">Tumia njia yako ya kufunga skini</translation> +<translation id="5012523644916800014">Dhibiti manenosiri na funguo za siri</translation> <translation id="5441504010984421144">Orodha ya vitambulisho vya kujaza kwa kugusa imefunguliwa kwenye skrini nzima.</translation> +<translation id="5591247451101092906">Ungependa kutumia nenosiri au ufunguo wa siri uliohifadhiwa?</translation> <translation id="5624120631404540903">Dhibiti manenosiri</translation> <translation id="804577341878669140">Endelea kutumia akaunti</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_tr.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_tr.xtb index e77f6f1e4..3126511 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_tr.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_tr.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">Dokunarak doldurulacak kimlik bilgisi listesi ekranın yarısında açıldı.</translation> <translation id="207576718733492531">Dokunarak doldurulacak kimlik bilgisi listesi kapatıldı.</translation> <translation id="2359808026110333948">Devam et</translation> +<translation id="2364266287022099258">Kayıtlı şifre anahtarı kullanılsın mı?</translation> <translation id="2410754283952462441">Bir hesap seçin</translation> <translation id="3399357656427473483">Dokunarak doldurulacak kimlik bilgisi listesi.</translation> <translation id="3653689374478248324"><ph name="SITE_NAME" /> sitesinde oturum açacaksınız</translation> <translation id="3950820424414687140">Oturum açın</translation> <translation id="4598345735110653698">Şifre anahtarlarını yönet</translation> <translation id="4907224763885298217">Ekran kilidinizi kullanın</translation> +<translation id="5012523644916800014">Şifreleri ve şifre anahtarlarını yönet</translation> <translation id="5441504010984421144">Dokunarak doldurulacak kimlik bilgisi listesi tam ekranda açıldı.</translation> +<translation id="5591247451101092906">Kayıtlı şifre veya şifre anahtarı kullanılsın mı?</translation> <translation id="5624120631404540903">Şifreleri yönet</translation> <translation id="804577341878669140">Hesapla devam edin</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-CN.xtb b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-CN.xtb index 11c7912d..20a9b38f 100644 --- a/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-CN.xtb +++ b/chrome/browser/touch_to_fill/android/internal/java/strings/translations/android_touch_to_fill_strings_zh-CN.xtb
@@ -5,13 +5,16 @@ <translation id="1717486229951421299">轻触即可填充的凭据的列表已半屏打开。</translation> <translation id="207576718733492531">轻触即可填充的凭据的列表已关闭。</translation> <translation id="2359808026110333948">继续</translation> +<translation id="2364266287022099258">使用已保存的通行密钥?</translation> <translation id="2410754283952462441">选择帐号</translation> <translation id="3399357656427473483">轻触即可填充的凭据的列表。</translation> <translation id="3653689374478248324">您将登录 <ph name="SITE_NAME" /></translation> <translation id="3950820424414687140">登录</translation> <translation id="4598345735110653698">管理密钥</translation> <translation id="4907224763885298217">使用您的屏幕锁定解锁凭据</translation> +<translation id="5012523644916800014">管理密码和通行密钥</translation> <translation id="5441504010984421144">轻触即可填充的凭据的列表已全屏打开。</translation> +<translation id="5591247451101092906">使用已保存的密码或通行密钥?</translation> <translation id="5624120631404540903">管理密码</translation> <translation id="804577341878669140">请登录帐号以继续访问</translation> </translationbundle> \ No newline at end of file
diff --git a/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java b/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java index 8ff8fca..9871095 100644 --- a/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java +++ b/chrome/browser/touch_to_fill/android/java/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillComponent.java
@@ -83,10 +83,12 @@ * Displays the given credentials in a new bottom sheet. * @param url A {@link String} that contains the URL to display credentials for. * @param isOriginSecure A {@link boolean} that indicates whether the current origin is secure. + * @param webauthnCredentials A list of {@link WebAuthnCredential}s that will be displayed. * @param credentials A list of {@link Credential}s that will be displayed. * @param triggerSubmission A {@link boolean} that indicates whether a form should be submitted * after filling. */ - void showCredentials(GURL url, boolean isOriginSecure, List<Credential> credentials, - List<WebAuthnCredential> webauthnCredentials, boolean triggerSubmission); + void showCredentials(GURL url, boolean isOriginSecure, + List<WebAuthnCredential> webauthnCredentials, List<Credential> credentials, + boolean triggerSubmission); }
diff --git a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java index 8fc6ec5..51ce2fb3 100644 --- a/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java +++ b/chrome/browser/touch_to_fill/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillIntegrationTest.java
@@ -103,8 +103,8 @@ @MediumTest public void testClickingSuggestionsTriggersCallback() { runOnUiThreadBlocking(() -> { - mTouchToFill.showCredentials(sExampleUrl, true, Collections.singletonList(sAna), - Collections.emptyList(), false); + mTouchToFill.showCredentials(sExampleUrl, true, Collections.emptyList(), + Collections.singletonList(sAna), false); }); BottomSheetTestSupport.waitForOpen(mBottomSheetController); @@ -119,8 +119,8 @@ @MediumTest public void testClickingWebAuthnCredentialTriggersCallback() { runOnUiThreadBlocking(() -> { - mTouchToFill.showCredentials(sExampleUrl, true, Collections.singletonList(sAna), - Collections.singletonList(sCam), false); + mTouchToFill.showCredentials(sExampleUrl, true, Collections.singletonList(sCam), + Collections.singletonList(sAna), false); }); BottomSheetTestSupport.waitForOpen(mBottomSheetController); @@ -135,8 +135,8 @@ @MediumTest public void testClickingButtonTriggersCallback() { runOnUiThreadBlocking(() -> { - mTouchToFill.showCredentials(sExampleUrl, true, Collections.singletonList(sAna), - Collections.emptyList(), false); + mTouchToFill.showCredentials(sExampleUrl, true, Collections.emptyList(), + Collections.singletonList(sAna), false); }); BottomSheetTestSupport.waitForOpen(mBottomSheetController); @@ -153,7 +153,7 @@ public void testBackDismissesAndCallsCallback() { runOnUiThreadBlocking(() -> { mTouchToFill.showCredentials( - sExampleUrl, true, Arrays.asList(sAna, sBob), Collections.emptyList(), false); + sExampleUrl, true, Collections.emptyList(), Arrays.asList(sAna, sBob), false); }); BottomSheetTestSupport.waitForOpen(mBottomSheetController); @@ -167,8 +167,8 @@ @MediumTest public void testClickingManagePasswordsTriggersCallback() { runOnUiThreadBlocking(() -> { - mTouchToFill.showCredentials(sExampleUrl, true, Collections.singletonList(sAna), - Collections.emptyList(), false); + mTouchToFill.showCredentials(sExampleUrl, true, Collections.emptyList(), + Collections.singletonList(sAna), false); }); BottomSheetTestSupport.waitForOpen(mBottomSheetController); @@ -250,7 +250,7 @@ runOnUiThreadBlocking(() -> { mTouchToFill.showCredentials( - sExampleUrl, true, Arrays.asList(sAna, sBob), Collections.emptyList(), false); + sExampleUrl, true, Collections.emptyList(), Arrays.asList(sAna, sBob), false); }); waitForEvent(mMockBridge).onDismissed(); verify(mMockBridge, never()).onCredentialSelected(any());
diff --git a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java index d0aab1f7..8ed4bdd 100644 --- a/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java +++ b/chrome/browser/touch_to_fill/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
@@ -149,7 +149,7 @@ public void testShowCredentialsWithMultipleEntries() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA, CARL), Collections.emptyList(), true); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA, CARL), true); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + 2 credentials assertThat( @@ -182,7 +182,7 @@ public void testShowCredentialsWithMultipleEntriesWithUpmDisabled() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA, CARL), Collections.emptyList(), true); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA, CARL), true); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + 2 credentials assertThat( @@ -215,7 +215,7 @@ public void testShowCredentialsWithSingleEntry() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA), false); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + 1 credential + Button assertThat( @@ -243,7 +243,7 @@ public void testShowCredentialsWithSingleEntryWithUpmDisabled() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA), false); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + 1 credential + Button assertThat( @@ -271,7 +271,7 @@ public void testShowCredentialsWithSingleWebAuthnEntry() { mMediator.showCredentials( - TEST_URL, true, Collections.emptyList(), Arrays.asList(DINO), false); + TEST_URL, true, Arrays.asList(DINO), Collections.emptyList(), false); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + 1 credential + Button assertThat( @@ -294,7 +294,7 @@ ChromeFeatureList.TOUCH_TO_FILL_PASSWORD_SUBMISSION}) public void testShowCredentialsWithWebAuthnAndPasswordEntries() { - mMediator.showCredentials(TEST_URL, true, Arrays.asList(ANA), Arrays.asList(DINO), false); + mMediator.showCredentials(TEST_URL, true, Arrays.asList(DINO), Arrays.asList(ANA), false); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat( itemList.size(), is(3)); // Header + 1 webauthn credential + 1 password credential @@ -321,7 +321,7 @@ public void testShowCredentialsToSubmit() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA), Collections.emptyList(), true); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA), true); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + 1 credential + Button assertThat( @@ -340,7 +340,7 @@ public void testShowCredentialsSetsCredentialListAndRequestsFavicons() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA, CARL, BOB), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA, CARL, BOB), false); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(4)); // Header + three Credentials assertThat(itemList.get(1).type, is(ItemType.CREDENTIAL)); @@ -367,7 +367,7 @@ public void testFetchFaviconUpdatesModel() { mMediator.showCredentials( - TEST_URL, true, Collections.singletonList(CARL), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Collections.singletonList(CARL), false); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + Credential + Continue Button assertThat(itemList.get(1).type, is(ItemType.CREDENTIAL)); @@ -397,7 +397,7 @@ public void testShowCredentialsFormatPslOrigins() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA, BOB), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA, BOB), false); assertThat(mModel.get(SHEET_ITEMS).size(), is(3)); // Header + two Credentials assertThat(mModel.get(SHEET_ITEMS).get(1).type, is(ItemType.CREDENTIAL)); assertThat(mModel.get(SHEET_ITEMS).get(1).model.get(FORMATTED_ORIGIN), @@ -413,7 +413,7 @@ public void testClearsCredentialListWhenShowingAgain() { mMediator.showCredentials( - TEST_URL, true, Collections.singletonList(ANA), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Collections.singletonList(ANA), false); ListModel<MVCListAdapter.ListItem> itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + Credential + Continue Button assertThat(itemList.get(1).type, is(ItemType.CREDENTIAL)); @@ -422,7 +422,7 @@ // Showing the sheet a second time should replace all changed credentials. mMediator.showCredentials( - TEST_URL, true, Collections.singletonList(BOB), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Collections.singletonList(BOB), false); itemList = mModel.get(SHEET_ITEMS); assertThat(itemList.size(), is(3)); // Header + Credential + Continue Button assertThat(itemList.get(1).type, is(ItemType.CREDENTIAL)); @@ -436,7 +436,7 @@ public void testShowCredentialsSetsVisibile() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA, CARL, BOB), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA, CARL, BOB), false); assertThat(mModel.get(VISIBLE), is(true)); } @@ -446,7 +446,7 @@ public void testCallsCallbackAndHidesOnSelectingItemDoesNotRecordIndexForSingleCredential() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA), false); assertThat(mModel.get(VISIBLE), is(true)); assertNotNull(mModel.get(SHEET_ITEMS).get(1).model.get(ON_CLICK_LISTENER)); @@ -468,7 +468,7 @@ public void testCallsCallbackAndHidesOnSelectingItem() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA, CARL), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA, CARL), false); assertThat(mModel.get(VISIBLE), is(true)); assertNotNull(mModel.get(SHEET_ITEMS).get(1).model.get(ON_CLICK_LISTENER)); @@ -490,7 +490,7 @@ public void testCallsDelegateAndHidesOnDismiss() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA, CARL), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA, CARL), false); mMediator.onDismissed(BottomSheetController.StateChangeReason.BACK_PRESS); verify(mMockDelegate).onDismissed(); assertThat(mModel.get(VISIBLE), is(false)); @@ -509,7 +509,7 @@ public void testHidesWhenSelectingManagePasswords() { mMediator.showCredentials( - TEST_URL, true, Arrays.asList(ANA, CARL, BOB), Collections.emptyList(), false); + TEST_URL, true, Collections.emptyList(), Arrays.asList(ANA, CARL, BOB), false); assertThat(mModel.get(ON_CLICK_MANAGE), is(notNullValue())); mModel.get(ON_CLICK_MANAGE).run(); verify(mMockDelegate).onManagePasswordsSelected();
diff --git a/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc b/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc index 7a638e4..3780c172 100644 --- a/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc +++ b/chrome/browser/touch_to_fill/android/touch_to_fill_view_impl.cc
@@ -118,7 +118,7 @@ Java_TouchToFillBridge_showCredentials( env, java_object_internal_, url::GURLAndroid::FromNativeGURL(env, url), - is_origin_secure.value(), credential_array, webauthn_credential_array, + is_origin_secure.value(), webauthn_credential_array, credential_array, trigger_submission); }
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 9ed442c5..6ab3226 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3085,18 +3085,18 @@ "webui/settings/chromeos/constants/constants_util.h", "webui/settings/chromeos/constants/routes_util.cc", "webui/settings/chromeos/constants/routes_util.h", - "webui/signin/inline_login_dialog_chromeos.cc", - "webui/signin/inline_login_dialog_chromeos.h", - "webui/signin/inline_login_dialog_chromeos_onboarding.cc", - "webui/signin/inline_login_dialog_chromeos_onboarding.h", - "webui/signin/inline_login_handler_chromeos.cc", - "webui/signin/inline_login_handler_chromeos.h", - "webui/signin/inline_login_handler_modal_delegate.cc", - "webui/signin/inline_login_handler_modal_delegate.h", - "webui/signin/signin_helper_chromeos.cc", - "webui/signin/signin_helper_chromeos.h", - "webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.cc", - "webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.h", + "webui/signin/ash/inline_login_dialog_chromeos.cc", + "webui/signin/ash/inline_login_dialog_chromeos.h", + "webui/signin/ash/inline_login_dialog_chromeos_onboarding.cc", + "webui/signin/ash/inline_login_dialog_chromeos_onboarding.h", + "webui/signin/ash/inline_login_handler_chromeos.cc", + "webui/signin/ash/inline_login_handler_chromeos.h", + "webui/signin/ash/inline_login_handler_modal_delegate.cc", + "webui/signin/ash/inline_login_handler_modal_delegate.h", + "webui/signin/ash/signin_helper_chromeos.cc", + "webui/signin/ash/signin_helper_chromeos.h", + "webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.cc", + "webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.h", "window_sizer/window_sizer_chromeos.cc", "window_sizer/window_sizer_chromeos.h", ]
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_am.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_am.xtb index 6696a3a..f20fb25 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_am.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_am.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="am"> <translation id="1275718070701477396">የተመረጡ</translation> +<translation id="138513070655895675">በዚህ ምናሌ ንጥል ስር ወደ ሌላ የመክፈያ ዘዴ ይለውጡ።</translation> +<translation id="2129442648318919291">አድራሻዎችን ያስተዳድሩ።</translation> +<translation id="2328179228329037980">በዚህ የምናሌ ንጥል ስር ወደ ሌላ የሚላክበት አድራሻ ይለውጡ።</translation> <translation id="248973266728004341">አዲስ ክሬዲት ካርድ ያክሉ</translation> <translation id="385051799172605136">ተመለስ</translation> <translation id="4401440167302712543">ተመዝግበው በሚወጡበት ጊዜ የመላኪያ እና የክፍያ መረጃን በራስ-ይሙሉ</translation> <translation id="4526274353008646337">አዲስ አድራሻ ያክሉ</translation> +<translation id="5289073627190432393">የመክፈያ ዘዴ ይምረጡ። የአሰሳ አማራጮች።</translation> +<translation id="551561471023477766">የሚላክበትን አድራሻ ይምረጡ። የአሰሳ አማራጮች።</translation> <translation id="567079066552447069">በክፍያ ማጠናቀቂያ ፍሰቶች ጊዜ የሚሞላው የአድራሻዎች እና የክፍያ አማራጮች ዝርዝር ተዘግቷል።</translation> <translation id="5747552184818312860">ጊዜው አልፎበታል</translation> <translation id="6476284679642588870">የመክፈያ ዘዴዎችን ያቀናብሩ</translation> +<translation id="7093950421106918420">ግዢ ሲያጠናቅቁ የእርስዎ ሌላ መረጃ በራስ-ሙላ ይሞላል።</translation> <translation id="7974390230414479278">የምናሌ ንጥል</translation> +<translation id="8098945428027498126">ሲነካ ለመሞላት የሚገኙ አድራሻዎች እና የመክፈያ ዘዴዎች። የቁልፍ ሰሌዳ ተደብቋል።</translation> <translation id="884264119367021077">የመላኪያ አድራሻ</translation> <translation id="8873105120914375071">በፍጥነት ግዢ ያጠናቅቁ?</translation> <translation id="9032876013752408138">መረጃዬን በራስ-ሙላ</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_as.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_as.xtb index 68d619f6..93738e8 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_as.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_as.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="as"> <translation id="1275718070701477396">বাছনি কৰা আছে</translation> +<translation id="138513070655895675">এই মেনুখনত থকা বস্তুবোৰৰ তলত থকা অন্য পৰিশোধ পদ্ধতিলৈ সলনি কৰক।</translation> +<translation id="2129442648318919291">ঠিকনা পৰিচালনা কৰক।</translation> +<translation id="2328179228329037980">মেনুৰ এই বস্তুটোৰ তলত থকা শ্বিপিঙৰ অন্য ঠিকনালৈ সলনি কৰক।</translation> <translation id="248973266728004341">এখন নতুন ক্ৰেডিট কাৰ্ড যোগ দিয়ক</translation> <translation id="385051799172605136">উভতি যাওক</translation> <translation id="4401440167302712543">আপুনি চেক আউট কৰাৰ সময়ত শ্বিপিং আৰু পৰিশোধৰ তথ্য স্বয়ংক্ৰিয়ভাৱে পূৰ কৰক</translation> <translation id="4526274353008646337">নতুন ঠিকনা যোগ দিয়ক</translation> +<translation id="5289073627190432393">পৰিশোধ পদ্ধতি বাছনি কৰক। নেভিগেশ্বনৰ বিকল্প।</translation> +<translation id="551561471023477766">শ্বিপিঙৰ ঠিকনা বাছনি কৰক। নেভিগেশ্বনৰ বিকল্প।</translation> <translation id="567079066552447069">চেকআউট প্ৰবাহৰ সময়ত পূৰণ কৰিবলগীয়া ঠিকনা আৰু পৰিশোধৰ বিকল্পৰ সূচী বন্ধ কৰা হৈছে।</translation> <translation id="5747552184818312860">এই সময়ত ম্যাদ উকলিব</translation> <translation id="6476284679642588870">পৰিশোধ পদ্ধতিসমূহ পৰিচালনা কৰক</translation> +<translation id="7093950421106918420">আপুনি টিক চিহ্ন দি গ’লে আপোনাৰ অন্য তথ্য স্বয়ংক্ৰিয়ভাৱে পূৰ হ’ব।</translation> <translation id="7974390230414479278">মেনুত থকা বস্তু</translation> +<translation id="8098945428027498126">স্পৰ্শ কৰি ঠিকনা আৰু পৰিশোধ পদ্ধতি পূৰ কৰাৰ সুবিধা উপলব্ধ। কীব’ৰ্ড লুকুওৱা হ’ল।</translation> <translation id="884264119367021077">শ্বিপিং ঠিকনা</translation> <translation id="8873105120914375071">দ্ৰুতভাৱে চেক আউট কৰিবনে?</translation> <translation id="9032876013752408138">মোৰ তথ্য স্বয়ংক্ৰিয়ভাৱে পূৰ কৰক</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_az.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_az.xtb index c3de888..4046885 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_az.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_az.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="az"> <translation id="1275718070701477396">Seçilib</translation> +<translation id="138513070655895675">Bu menyu elementi altında digər ödəniş metoduna dəyişin.</translation> +<translation id="2129442648318919291">Ünvanları idarə edin.</translation> +<translation id="2328179228329037980">Bu menyu elementi altında digər göndərmə ünvanına dəyişin.</translation> <translation id="248973266728004341">Yeni kredit kartı əlavə edin</translation> <translation id="385051799172605136">Geri</translation> <translation id="4401440167302712543">Sifarişi yekunlaşdırarkən göndərmə və ödəniş məlumatlarını avtomatik doldurun</translation> <translation id="4526274353008646337">Yeni ünvan əlavə edin</translation> +<translation id="5289073627190432393">Ödəniş metodunu seçin. Naviqasiya seçimləri.</translation> +<translation id="551561471023477766">Göndərmə ünvanını seçin. Naviqasiya seçimləri.</translation> <translation id="567079066552447069">Ödəniş prosesi zamanı doldurulacaq ünvanların siyahısı və ödəniş seçimləri bağlıdır.</translation> <translation id="5747552184818312860">Vaxtı bitir</translation> <translation id="6476284679642588870">Ödəniş metodlarını idarə edin</translation> +<translation id="7093950421106918420">Çıxış qeydi zamanı digər məlumatlarınız avtomatik doldurulacaq.</translation> <translation id="7974390230414479278">Menyu elementi</translation> +<translation id="8098945428027498126">Toxunmaqla doldurula bilən ünvanlar və ödəniş metodları. Gizlədilmiş klaviatura.</translation> <translation id="884264119367021077">Göndərmə ünvanı</translation> <translation id="8873105120914375071">Sifariş sürətli yekunlaşdırılsın?</translation> <translation id="9032876013752408138">Məlumatlarımı avtomatik doldurun</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_da.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_da.xtb index 45ea1238..145e402e 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_da.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_da.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="da"> <translation id="1275718070701477396">Valgt</translation> +<translation id="138513070655895675">Skift til en anden betalingsmetode under dette menupunkt.</translation> +<translation id="2129442648318919291">Administrer adresser.</translation> +<translation id="2328179228329037980">Skift til en anden leveringsadresse under dette menupunkt.</translation> <translation id="248973266728004341">Tilføj et nyt betalingskort</translation> <translation id="385051799172605136">Tilbage</translation> <translation id="4401440167302712543">Autofyld forsendelses- og betalingsoplysninger, når du betaler</translation> <translation id="4526274353008646337">Tilføj en ny adresse</translation> +<translation id="5289073627190432393">Vælg betalingsmetode. Navigationsmuligheder.</translation> +<translation id="551561471023477766">Vælg leveringsadresse. Navigationsmuligheder.</translation> <translation id="567079066552447069">Listen over adresser og betalingsmuligheder, der skal udfyldes i forbindelse med betalingsprocessen, er lukket.</translation> <translation id="5747552184818312860">Udløber</translation> <translation id="6476284679642588870">Administrer betalingsmetoder</translation> +<translation id="7093950421106918420">Når du betaler, udfyldes dine øvrige oplysninger automatisk.</translation> <translation id="7974390230414479278">Menupunkt</translation> +<translation id="8098945428027498126">Adresser og betalingsmetoder, der kan udfyldes ved berøring. Tastaturet er skjult.</translation> <translation id="884264119367021077">Leveringsadresse</translation> <translation id="8873105120914375071">Vil du betale hurtigere?</translation> <translation id="9032876013752408138">Autofyld mine oplysninger</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_de.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_de.xtb index 5b4128e..78d2a89 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_de.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_de.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="de"> <translation id="1275718070701477396">Ausgewählt</translation> +<translation id="138513070655895675">Unter diesem Menüpunkt kannst du eine andere Zahlungsmethode auswählen.</translation> +<translation id="2129442648318919291">Adressen verwalten.</translation> +<translation id="2328179228329037980">Unter diesem Menüpunkt kannst du eine andere Versandadresse angeben.</translation> <translation id="248973266728004341">Neue Kreditkarte hinzufügen</translation> <translation id="385051799172605136">Zurück</translation> <translation id="4401440167302712543">Du kannst Versand- und Zahlungsinformationen an der Kasse automatisch eintragen lassen</translation> <translation id="4526274353008646337">Neue Adresse hinzufügen</translation> +<translation id="5289073627190432393">Zahlungsmethode auswählen. Navigationsoptionen.</translation> +<translation id="551561471023477766">Lieferadresse auswählen. Navigationsoptionen.</translation> <translation id="567079066552447069">Die Liste der Adressen und Zahlungsoptionen, die während des Bezahlvorgangs ausgefüllt werden sollen, ist geschlossen.</translation> <translation id="5747552184818312860">Ablaufdatum</translation> <translation id="6476284679642588870">Zahlungsmethoden verwalten</translation> +<translation id="7093950421106918420">Während des Bezahlvorgangs werden deine anderen Informationen automatisch ausgefüllt.</translation> <translation id="7974390230414479278">Menüpunkt</translation> +<translation id="8098945428027498126">Verfügbare Adressen und Zahlungsmethoden, die bei Berührung ausgefüllt werden. Tastatur ausgeblendet.</translation> <translation id="884264119367021077">Versandadresse</translation> <translation id="8873105120914375071">Schneller bezahlen?</translation> <translation id="9032876013752408138">Meine Daten automatisch eintragen</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_el.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_el.xtb index 54d3102e..313524a 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_el.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_el.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="el"> <translation id="1275718070701477396">Επιλέχθηκε</translation> +<translation id="138513070655895675">Αλλάξτε σε άλλο τρόπο πληρωμής σε αυτό το στοιχείο μενού.</translation> +<translation id="2129442648318919291">Διαχείριση διευθύνσεων.</translation> +<translation id="2328179228329037980">Αλλάξτε σε άλλη διεύθυνση αποστολής κάτω από αυτό το στοιχείο μενού.</translation> <translation id="248973266728004341">Προσθήκη νέας πιστωτικής κάρτας</translation> <translation id="385051799172605136">Πίσω</translation> <translation id="4401440167302712543">Αυτόματη συμπλήρωση στοιχείων αποστολής και πληρωμής κατά την ολοκλήρωση της αγοράς</translation> <translation id="4526274353008646337">Προσθήκη νέας διεύθυνσης</translation> +<translation id="5289073627190432393">Επιλέξτε τρόπο πληρωμής. Επιλογές πλοήγησης.</translation> +<translation id="551561471023477766">Επιλέξτε διεύθυνση αποστολής. Επιλογές πλοήγησης.</translation> <translation id="567079066552447069">Η λίστα διευθύνσεων και επιλογών πληρωμής που πρέπει να συμπληρωθούν κατά τη διάρκεια των ροών ολοκλήρωσης αγοράς είναι κλειστή.</translation> <translation id="5747552184818312860">Λήγει</translation> <translation id="6476284679642588870">Διαχείριση τρόπων πληρωμής</translation> +<translation id="7093950421106918420">Κατά την ολοκλήρωση αγορών, τα άλλα στοιχεία σας θα συμπληρώνονται αυτόματα.</translation> <translation id="7974390230414479278">Στοιχείο μενού</translation> +<translation id="8098945428027498126">Διευθύνσεις και τρόποι πληρωμής που διατίθενται για συμπλήρωση μέσω αφής. Έχει γίνει απόκρυψη του πληκτρολογίου.</translation> <translation id="884264119367021077">Διεύθυνση αποστολής</translation> <translation id="8873105120914375071">Ταχύτερη ολοκλήρωση αγορών;</translation> <translation id="9032876013752408138">Αυτόματη συμπλήρωση των στοιχείων μου</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_es.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_es.xtb index 85c4fdf..ee62c07 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_es.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_es.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="es"> <translation id="1275718070701477396">Seleccionado</translation> +<translation id="138513070655895675">Cambiar a otro método de pago de esta opción de menú.</translation> +<translation id="2129442648318919291">Gestionar direcciones.</translation> +<translation id="2328179228329037980">Cambiar a otra dirección de envío de esta opción de menú.</translation> <translation id="248973266728004341">Añadir nueva tarjeta de crédito</translation> <translation id="385051799172605136">Volver</translation> <translation id="4401440167302712543">Autocompleta tus datos de envío y de pago al comprar</translation> <translation id="4526274353008646337">Añadir nueva dirección</translation> +<translation id="5289073627190432393">Seleccionar método de pago. Opciones de navegación.</translation> +<translation id="551561471023477766">Seleccionar dirección de envío. Opciones de navegación.</translation> <translation id="567079066552447069">La lista de direcciones y opciones de pago que puedes rellenar durante el flujo de tramitación de la compra está cerrada.</translation> <translation id="5747552184818312860">Caduca</translation> <translation id="6476284679642588870">Gestionar métodos de pago</translation> +<translation id="7093950421106918420">Al formalizar la compra, tus otros datos se rellenarán automáticamente.</translation> <translation id="7974390230414479278">Elemento de menú</translation> +<translation id="8098945428027498126">Direcciones y métodos de pago disponibles que puedes rellenar con un toque. Teclado oculto.</translation> <translation id="884264119367021077">Dirección de envío</translation> <translation id="8873105120914375071">¿Quieres pagar más rápido?</translation> <translation id="9032876013752408138">Autocompletar mis datos</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_et.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_et.xtb index 80ff7f1..443db3fb 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_et.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_et.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="et"> <translation id="1275718070701477396">Valitud</translation> +<translation id="138513070655895675">Teiseks makseviisiks muutmine selle menüü-üksuse all.</translation> +<translation id="2129442648318919291">Aadresside haldamine.</translation> +<translation id="2328179228329037980">Teiseks tarneaadressiks muutmine selle menüü-üksuse all.</translation> <translation id="248973266728004341">Uue krediitkaardi lisamine</translation> <translation id="385051799172605136">Tagasi</translation> <translation id="4401440167302712543">Kassas makstes lisatakse tarne- ja makseteave automaatselt</translation> <translation id="4526274353008646337">Uue aadressi lisamine</translation> +<translation id="5289073627190432393">Makseviisi valimine. Navigeerimise valikud.</translation> +<translation id="551561471023477766">Tarneaadressi valimine. Navigeerimise valikud.</translation> <translation id="567079066552447069">Aadresside ja maksevalikute loend, mis täidetakse ostuvoos, on suletud.</translation> <translation id="5747552184818312860">Aegub</translation> <translation id="6476284679642588870">Makseviiside haldamine</translation> +<translation id="7093950421106918420">Maksmisel sisestatakse teie muu teave automaatselt.</translation> <translation id="7974390230414479278">Menüü-üksus</translation> +<translation id="8098945428027498126">Aadressid ja makseviisid, mille saab sisestada puudutusega. Klaviatuur on peidetud.</translation> <translation id="884264119367021077">Tarneaadress</translation> <translation id="8873105120914375071">Kas soovite kiiremini maksta?</translation> <translation id="9032876013752408138">Lisa minu teave automaatselt</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_fa.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_fa.xtb index 9276cf3..7c81b3f1 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_fa.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_fa.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="fa"> <translation id="1275718070701477396">انتخاب شد</translation> +<translation id="138513070655895675">تغییر به روش پرداخت دیگر بااستفاده از این گزینه منو.</translation> +<translation id="2129442648318919291">مدیریت نشانیها.</translation> +<translation id="2328179228329037980">تغییر به دیگر نشانی ارسال کالا بااستفاده از این گزینه منو.</translation> <translation id="248973266728004341">افزودن کارت اعتباری جدید</translation> <translation id="385051799172605136">بازگشت</translation> <translation id="4401440167302712543">اطلاعات ارسال و پرداخت را هنگام تصفیه حساب بهطور خودکار تکمیل کنید</translation> <translation id="4526274353008646337">افزودن نشانی جدید</translation> +<translation id="5289073627190432393">انتخاب روش پرداخت. گزینههای پیمایش.</translation> +<translation id="551561471023477766">انتخاب نشانی تحویل کالا. گزینههای پیمایش.</translation> <translation id="567079066552447069">فهرست نشانیها و گزینههای پرداخت که باید درطول روند تسویهحساب پر شود بسته شده است.</translation> <translation id="5747552184818312860">تاریخ انقضا</translation> <translation id="6476284679642588870">مدیریت روشهای پرداخت</translation> +<translation id="7093950421106918420">هنگام تسویهحساب، اطلاعات دیگرتان بهطور خودکار وارد میشود.</translation> <translation id="7974390230414479278">مورد منو</translation> +<translation id="8098945428027498126">نشانیها و روشهای پرداخت دردسترس که میتوانند با یک لمس در فیلد مربوطه قرار بگیرند. صفحهکلید پنهان است.</translation> <translation id="884264119367021077">اطلاعات ارسال</translation> <translation id="8873105120914375071">میخواهید سریعتر تصفیه حساب کنید؟</translation> <translation id="9032876013752408138">تکمیل خودکار اطلاعات</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_fil.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_fil.xtb index c997cab..9942cee 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_fil.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_fil.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="fil"> <translation id="1275718070701477396">Pinili</translation> +<translation id="138513070655895675">Lumipat sa iba pang paraan ng pagbabayad sa ilalim ng item na ito sa menu.</translation> +<translation id="2129442648318919291">Pamahalaan ang mga address.</translation> +<translation id="2328179228329037980">Lumipat sa iba pang shipping address sa ilalim ng item na ito sa menu.</translation> <translation id="248973266728004341">Magdagdag ng bagong credit card</translation> <translation id="385051799172605136">Bumalik</translation> <translation id="4401440167302712543">I-autofill ang impormasyon ng pagpapadala at pagbabayad kapag nag-check out ka</translation> <translation id="4526274353008646337">Magdagdag ng bagong address</translation> +<translation id="5289073627190432393">Pumili ng paraan ng pagbabayad. Mga opsyon sa navigation.</translation> +<translation id="551561471023477766">Pumili ng shipping address. Mga opsyon sa navigation.</translation> <translation id="567079066552447069">Sarado na ang listahan ng mga address at opsyon sa pagbabayad na sasagutan sa mga daloy ng pag-checkout.</translation> <translation id="5747552184818312860">Mag-e-expire sa</translation> <translation id="6476284679642588870">Pamahalaan ang mga paraan ng pagbabayad</translation> +<translation id="7093950421106918420">Kapag nag-check out ka, io-autofill ang iba mo pang impormasyon.</translation> <translation id="7974390230414479278">Item sa menu</translation> +<translation id="8098945428027498126">Mapupunan ang mga address at paraan ng pagbabayad kapag pinindot ang screen. Naka-hide ang keyboard.</translation> <translation id="884264119367021077">Shipping address</translation> <translation id="8873105120914375071">Mag-check out nang mas mabilis?</translation> <translation id="9032876013752408138">I-autofill ang impormasyon ko</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_id.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_id.xtb index 78681fd1..d4a1414 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_id.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_id.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="id"> <translation id="1275718070701477396">Dipilih</translation> +<translation id="138513070655895675">Ubah ke metode pembayaran lain pada item menu ini.</translation> +<translation id="2129442648318919291">Kelola alamat.</translation> +<translation id="2328179228329037980">Ubah ke alamat pengiriman lain pada item menu ini.</translation> <translation id="248973266728004341">Tambahkan kartu kredit baru</translation> <translation id="385051799172605136">Kembali</translation> <translation id="4401440167302712543">Isi otomatis info pengiriman dan pembayaran saat Anda check out</translation> <translation id="4526274353008646337">Tambahkan alamat baru</translation> +<translation id="5289073627190432393">Pilih metode pembayaran. Opsi navigasi.</translation> +<translation id="551561471023477766">Pilih alamat pengiriman. Opsi navigasi.</translation> <translation id="567079066552447069">Daftar alamat dan opsi pembayaran yang harus diisi selama alur checkout ditutup.</translation> <translation id="5747552184818312860">Kedaluwarsa</translation> <translation id="6476284679642588870">Kelola metode pembayaran</translation> +<translation id="7093950421106918420">Saat melakukan check out, info Anda yang lain akan otomatis terisi.</translation> <translation id="7974390230414479278">Item menu</translation> +<translation id="8098945428027498126">Alamat dan metode pembayaran dapat diisi dengan gestur sentuhan. Keyboard disembunyikan.</translation> <translation id="884264119367021077">Alamat pengiriman</translation> <translation id="8873105120914375071">Check out lebih cepat?</translation> <translation id="9032876013752408138">Isi otomatis info saya</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ka.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ka.xtb index dfe4064..61874bc 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ka.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ka.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="ka"> <translation id="1275718070701477396">შერჩეული</translation> +<translation id="138513070655895675">მენიუს ამ ერთეულის მეშვეობით შესაძლებელია გადახდის სხვა მეთოდზე გადართვა.</translation> +<translation id="2129442648318919291">მისამართების მართვა.</translation> +<translation id="2328179228329037980">მენიუს ამ ერთეულის მეშვეობით შესაძლებელია მიწოდების სხვა მისამართზე გადართვა.</translation> <translation id="248973266728004341">ახალი საკრედიტო ბარათის დამატება</translation> <translation id="385051799172605136">უკან</translation> <translation id="4401440167302712543">ავტომატურად შეავსეთ მიწოდებისა და გადახდის ინფორმაცია ანგარიშსწორებისას</translation> <translation id="4526274353008646337">ახალი მისამართის დამატება</translation> +<translation id="5289073627190432393">გადახდის მეთოდის აირჩევა. ნავიგაციის ვარიანტები.</translation> +<translation id="551561471023477766">მიწოდების მისამართის არჩევა. ნავიგაციის ვარიანტები.</translation> <translation id="567079066552447069">იმ მისამართებისა და გადახდის ვარიანტების სია, რომელიც უნდა შეივსოს შეკვეთის გაფორმებისას, დახურულია.</translation> <translation id="5747552184818312860">ვადა</translation> <translation id="6476284679642588870">გადახდის მეთოდების მართვა</translation> +<translation id="7093950421106918420">ანგარიშსწორებისას თქვენი სვა ინფორმაცია ავტომატურად შეივსება.</translation> <translation id="7974390230414479278">მენიუს ელემენტი</translation> +<translation id="8098945428027498126">შეხებით შესაძლებელია მისამართებისა და გადახდის მეთოდების შევსება. კლავიატურა დამალულია.</translation> <translation id="884264119367021077">მიწოდების მისამართი</translation> <translation id="8873105120914375071">გსურთ უფრო სწრაფი ანგარიშსწორება?</translation> <translation id="9032876013752408138">ჩემი ინფორმაციის ავტომატური შევსება</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ko.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ko.xtb index 1d280ab..2690b023 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ko.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ko.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="ko"> <translation id="1275718070701477396">선택됨</translation> +<translation id="138513070655895675">이 메뉴 항목에서 다른 결제 수단으로 변경합니다.</translation> +<translation id="2129442648318919291">주소를 관리합니다.</translation> +<translation id="2328179228329037980">이 메뉴 항목에서 다른 배송지 주소로 변경합니다.</translation> <translation id="248973266728004341">새 신용카드 추가</translation> <translation id="385051799172605136">뒤로</translation> <translation id="4401440167302712543">결제 시 배송 및 결제 정보 자동 완성</translation> <translation id="4526274353008646337">새 주소 추가</translation> +<translation id="5289073627190432393">결제 수단을 선택하세요. 탐색 옵션입니다.</translation> +<translation id="551561471023477766">배송지 주소를 선택하세요. 탐색 옵션입니다.</translation> <translation id="567079066552447069">결제 시 자동 입력될 주소 및 결제 옵션 목록이 닫혔습니다.</translation> <translation id="5747552184818312860">만료</translation> <translation id="6476284679642588870">결제 수단 관리</translation> +<translation id="7093950421106918420">다른 정보는 결제할 때 자동으로 채워집니다.</translation> <translation id="7974390230414479278">메뉴 항목</translation> +<translation id="8098945428027498126">터치하여 입력할 수 있는 주소와 결제 수단입니다. 키보드가 숨겨졌습니다.</translation> <translation id="884264119367021077">배송지 주소</translation> <translation id="8873105120914375071">더 빨리 결제하시겠습니까?</translation> <translation id="9032876013752408138">내 정보 자동 완성</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_mn.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_mn.xtb index 24305ad6..dbd1fb8 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_mn.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_mn.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="mn"> <translation id="1275718070701477396">Сонгогдсон</translation> +<translation id="138513070655895675">Энэ цэсийн зүйлийн доорх бусад төлбөрийн хэрэгсэл рүү өөрчилнө үү.</translation> +<translation id="2129442648318919291">Хаягуудыг удирдана уу.</translation> +<translation id="2328179228329037980">Энэ цэсийн зүйлийн доороос тээвэрлэлтийн бусад хаяг руу өөрчилнө үү.</translation> <translation id="248973266728004341">Шинэ кредит карт нэмэх</translation> <translation id="385051799172605136">Буцах</translation> <translation id="4401440167302712543">Тооцоо хийх үедээ тээвэрлэлт болон төлбөрийн мэдээллийг автоматаар бөглөх</translation> <translation id="4526274353008646337">Шинэ хаяг нэмэх</translation> +<translation id="5289073627190432393">Төлбөрийн хэрэгсэл сонгоно уу. Навигацын сонголт.</translation> +<translation id="551561471023477766">Тээвэрлэлтийн хаяг сонгоно уу. Навигацын сонголт.</translation> <translation id="567079066552447069">Тооцоо хийх урсгалын үеэр бөглөх хаяг болон төлбөрийн сонголтын жагсаалтыг хаасан.</translation> <translation id="5747552184818312860">Дуусах хугацаа</translation> <translation id="6476284679642588870">Төлбөрийн хэрэгсэл удирдах</translation> +<translation id="7093950421106918420">Таныг тооцоо хийхэд бусад мэдээллийг тань автоматаар бөглөнө.</translation> <translation id="7974390230414479278">Цэс</translation> +<translation id="8098945428027498126">Хаяг болон төлбөрийн хэрэгслийг хүрээд л бөглөх боломжтой. Гарыг нуусан.</translation> <translation id="884264119367021077">Илгээх хаяг</translation> <translation id="8873105120914375071">Тооцоогоо илүү хурдан хийх үү?</translation> <translation id="9032876013752408138">Миний мэдээллийг автоматаар бөглөнө үү</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_mr.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_mr.xtb index 69ac4f7..9a352e2 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_mr.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_mr.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="mr"> <translation id="1275718070701477396">निवडले</translation> +<translation id="138513070655895675">या मेनू आयटमच्या अंतर्गत, इतर पेमेंट पद्धतीवर बदला.</translation> +<translation id="2129442648318919291">पत्ते व्यवस्थापित करा.</translation> +<translation id="2328179228329037980">या मेनू आयटमच्या अंतर्गत, शिपिंगच्या इतर पत्त्यावर बदला.</translation> <translation id="248973266728004341">नवीन क्रेडिट कार्ड जोडा</translation> <translation id="385051799172605136">मागील</translation> <translation id="4401440167302712543">तुम्ही चेक आउट करताना शिपिंग आणि पेमेंट माहिती ऑटोफिल करा</translation> <translation id="4526274353008646337">नवीन ॲड्रेस जोडा</translation> +<translation id="5289073627190432393">पेमेंट पद्धत निवडा. नेव्हिगेशनशी संबंधित पर्याय.</translation> +<translation id="551561471023477766">शिपिंगचा पत्ता निवडा. नेव्हिगेशनशी संबंधित पर्याय.</translation> <translation id="567079066552447069">चेकआउट फ्लोदरम्यान भरावयाची पत्त्यांची सूची आणि पेमेंट पर्याय बंद आहेत.</translation> <translation id="5747552184818312860">कालबाह्य होईल</translation> <translation id="6476284679642588870">पेमेंट पद्धती व्यवस्थापित करा</translation> +<translation id="7093950421106918420">तुम्ही चेक आउट करताना, तुमची इतर माहिती आपोआप भरली जाईल.</translation> <translation id="7974390230414479278">मेनू आयटम</translation> +<translation id="8098945428027498126">स्पर्श करून भरण्यासाठी पत्ते आणि पेमेंट पद्धती उपलब्ध आहेत. कीबोर्ड लपवलेला आहे.</translation> <translation id="884264119367021077">वहनावळ पत्ता</translation> <translation id="8873105120914375071">आणखी जलद चेक आउट करायचे आहे?</translation> <translation id="9032876013752408138">माझी माहिती ऑटोफिल करा</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_my.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_my.xtb index ff72d29..b96c8ff 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_my.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_my.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="my"> <translation id="1275718070701477396">ရွေးထား</translation> +<translation id="138513070655895675">ယခု မီနူး အကြောင်းအရာအောက်တွင် အခြား ငွေပေးချေနည်းလမ်းကို ပြောင်းရန်။</translation> +<translation id="2129442648318919291">လိပ်စာ စီမံရန်။</translation> +<translation id="2328179228329037980">ယခု မီနူး အကြောင်းအရာအောက်တွင် ပစ္စည်းပို့ရန်လိပ်စာ ပြောင်းရန်။</translation> <translation id="248973266728004341">ခရက်ဒစ်ကတ်အသစ် ထည့်ပါ</translation> <translation id="385051799172605136">နောက်သို့</translation> <translation id="4401440167302712543">သင်ငွေရှင်းသောအခါ ပစ္စည်းပို့ဆောင်မှုနှင့် ငွေပေးချေမှု အချက်အလက်ကို အော်တိုဖြည့်လိုက်ပါ</translation> <translation id="4526274353008646337">လိပ်စာအသစ်ထည့်ပါ</translation> +<translation id="5289073627190432393">ငွေပေးချေနည်းလမ်း ရွေးရန်။ လမ်းညွှန်မှုဆိုင်ရာ ရွေးစရာများ။</translation> +<translation id="551561471023477766">ပစ္စည်းပို့ရန်လိပ်စာ ရွေးရန်။ လမ်းညွှန်မှုဆိုင်ရာ ရွေးစရာများ။</translation> <translation id="567079066552447069">ငွေရှင်းသည့်အဆင့်များအတွင်း ဖြည့်ရမည့် လိပ်စာနှင့် ပေးချေမှုနည်းလမ်းများ စာရင်းကို ပိတ်ထားသည်။</translation> <translation id="5747552184818312860">သက်တမ်းကုန်ဆုံးချိန်</translation> <translation id="6476284679642588870">ငွေပေးချေနည်းလမ်းများကို စီမံရန်</translation> +<translation id="7093950421106918420">ငွေရှင်းသောအခါ သင့်အခြားအချက်အလက်များ အော်တိုဖြည့်ပြီးဖြစ်မည်။</translation> <translation id="7974390230414479278">မီနျူးအကြောင်းအရာ</translation> +<translation id="8098945428027498126">လိပ်စာနှင့် ငွေပေးချေနည်းလမ်းများကို ထိရုံဖြင့် ဖြည့်နိုင်မည်။ ကီးဘုတ် ဖျောက်ထားသည်။</translation> <translation id="884264119367021077">ပို့ဆောင်ရမည့် လိပ်စာ</translation> <translation id="8873105120914375071">ပိုမိုမြန်ဆန်စွာ ငွေရှင်းမလား။</translation> <translation id="9032876013752408138">ကျွန်ုပ်၏အချက်အလက် အော်တိုဖြည့်ရန်</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_no.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_no.xtb index 6b99d011..8ddb4cd 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_no.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_no.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="no"> <translation id="1275718070701477396">Valgt</translation> +<translation id="138513070655895675">Bytt til en annen betalingsmåte under dette menyelementet.</translation> +<translation id="2129442648318919291">Administrer adresser.</translation> +<translation id="2328179228329037980">Endre til en annen leveringsadresse under dette menyelementet.</translation> <translation id="248973266728004341">Legg til et nytt kredittkort</translation> <translation id="385051799172605136">Tilbake</translation> <translation id="4401440167302712543">Fyll ut frakt- og betalingsopplysninger automatisk når du betaler</translation> <translation id="4526274353008646337">Legg til en ny adresse</translation> +<translation id="5289073627190432393">Velg betalingsmåte. Navigasjonsalternativer.</translation> +<translation id="551561471023477766">Velg leveringsadresse. Navigasjonsalternativer.</translation> <translation id="567079066552447069">Listen over adresser og betalingsmåter som kan fylles ut i løpet av betalingsflyten, er lukket.</translation> <translation id="5747552184818312860">Utløper</translation> <translation id="6476284679642588870">Administrer betalingsmåter</translation> +<translation id="7093950421106918420">Resten av informasjonen din fylles ut automatisk når du betaler.</translation> <translation id="7974390230414479278">Menyelement</translation> +<translation id="8098945428027498126">Adresser og betalingsmåter som kan fylles ut ved å trykke. Tastaturet er skjult.</translation> <translation id="884264119367021077">Leveringsadresse</translation> <translation id="8873105120914375071">Vil du betale raskere?</translation> <translation id="9032876013752408138">Fyll ut opplysningene mine automatisk</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ro.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ro.xtb index e3864298..109bf3b 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ro.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_ro.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="ro"> <translation id="1275718070701477396">Selectat</translation> +<translation id="138513070655895675">Treci la altă metodă de plată din acest element de meniu.</translation> +<translation id="2129442648318919291">Gestionează adresele.</translation> +<translation id="2328179228329037980">Treci la altă adresă de expediere din acest element de meniu.</translation> <translation id="248973266728004341">Adaugă un card de credit nou</translation> <translation id="385051799172605136">Înapoi</translation> <translation id="4401440167302712543">Completează automat informațiile despre expediere și plată pe măsură ce finalizezi achiziția</translation> <translation id="4526274353008646337">Adaugă o adresă nouă</translation> +<translation id="5289073627190432393">Selectează o metodă de plată. Opțiuni de navigare.</translation> +<translation id="551561471023477766">Selectează adresa de expediere. Opțiuni de navigare.</translation> <translation id="567079066552447069">Lista de adrese și opțiuni de plată de completat în timpul fluxurilor de finalizare a achiziției este închisă.</translation> <translation id="5747552184818312860">Expiră</translation> <translation id="6476284679642588870">Gestionează metodele de plată</translation> +<translation id="7093950421106918420">La finalizarea achiziției, celelalte informații vor fi completate automat.</translation> <translation id="7974390230414479278">Element din meniu</translation> +<translation id="8098945428027498126">Adresele și metodele de plată disponibile pentru completarea la atingere. Tastatura este ascunsă.</translation> <translation id="884264119367021077">Adresa de expediere</translation> <translation id="8873105120914375071">Finalizezi achiziția mai rapid?</translation> <translation id="9032876013752408138">Completează automat informațiile mele</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_sr-Latn.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_sr-Latn.xtb index e1e47b0..a8d6db4 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_sr-Latn.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="sr-Latn"> <translation id="1275718070701477396">Izabrano je</translation> +<translation id="138513070655895675">Pređite na drugi način plaćanja u okviru ove stavke menija.</translation> +<translation id="2129442648318919291">Upravljajte adresama.</translation> +<translation id="2328179228329037980">Promenite adresu za isporuku u okviru ove stavke menija.</translation> <translation id="248973266728004341">Dodaj novu kreditnu karticu</translation> <translation id="385051799172605136">Nazad</translation> <translation id="4401440167302712543">Automatsko popunjavanje informacija o isporuci i plaćanju dok plaćate</translation> <translation id="4526274353008646337">Dodaj novu adresu</translation> +<translation id="5289073627190432393">Izaberite način plaćanja. Opcije navigacije.</translation> +<translation id="551561471023477766">Izaberite adresu za isporuku. Opcije navigacije.</translation> <translation id="567079066552447069">Lista adresa i opcija plaćanja za popunjavanje pri plaćanju je zatvorena.</translation> <translation id="5747552184818312860">Ističe</translation> <translation id="6476284679642588870">Upravljajte načinima plaćanja</translation> +<translation id="7093950421106918420">Ostale informacije će se automatski popunjavati pri plaćanju.</translation> <translation id="7974390230414479278">Stavka menija</translation> +<translation id="8098945428027498126">Adrese i načini plaćanja su dostupni za popunjavanje na dodir. Tastatura je sakrivena.</translation> <translation id="884264119367021077">Adresa za isporuku</translation> <translation id="8873105120914375071">Želite da plaćate brže?</translation> <translation id="9032876013752408138">Automatski popunjavaj moje informacije</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_sr.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_sr.xtb index 19823df..2cc0964 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_sr.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_sr.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="sr"> <translation id="1275718070701477396">Изабрано је</translation> +<translation id="138513070655895675">Пређите на други начин плаћања у оквиру ове ставке менија.</translation> +<translation id="2129442648318919291">Управљајте адресама.</translation> +<translation id="2328179228329037980">Промените адресу за испоруку у оквиру ове ставке менија.</translation> <translation id="248973266728004341">Додај нову кредитну картицу</translation> <translation id="385051799172605136">Назад</translation> <translation id="4401440167302712543">Аутоматско попуњавање информација о испоруци и плаћању док плаћате</translation> <translation id="4526274353008646337">Додај нову адресу</translation> +<translation id="5289073627190432393">Изаберите начин плаћања. Опције навигације.</translation> +<translation id="551561471023477766">Изаберите адресу за испоруку. Опције навигације.</translation> <translation id="567079066552447069">Листа адреса и опција плаћања за попуњавање при плаћању је затворена.</translation> <translation id="5747552184818312860">Истиче</translation> <translation id="6476284679642588870">Управљајте начинима плаћања</translation> +<translation id="7093950421106918420">Остале информације ће се аутоматски попуњавати при плаћању.</translation> <translation id="7974390230414479278">Ставка менија</translation> +<translation id="8098945428027498126">Адресе и начини плаћања су доступни за попуњавање на додир. Тастатура је сакривена.</translation> <translation id="884264119367021077">Адреса за испоруку</translation> <translation id="8873105120914375071">Желите да плаћате брже?</translation> <translation id="9032876013752408138">Аутоматски попуњавај моје информације</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_uz.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_uz.xtb index 36fd7c0d..524907ae 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_uz.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_uz.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="uz"> <translation id="1275718070701477396">Tanlandi</translation> +<translation id="138513070655895675">Shu menyu bandi ostidagi boshqa toʻlov usuliga almashtirish.</translation> +<translation id="2129442648318919291">Manzillarni boshqarish.</translation> +<translation id="2328179228329037980">Shu menyu bandi ostidagi yetkazib berish manziliga almashtirish.</translation> <translation id="248973266728004341">Yangi kredit karta qoʻshish</translation> <translation id="385051799172605136">Orqaga</translation> <translation id="4401440167302712543">Yetkazib berish va toʻlov axboroti hisob-kitob sahifasida avtomatik kiritiladi</translation> <translation id="4526274353008646337">Yangi manzil kiritish</translation> +<translation id="5289073627190432393">To‘lov usulini tanlang. Navigatsiya parametrlari.</translation> +<translation id="551561471023477766">Yetkazib berish manzilini tanlang. Navigatsiya parametrlari.</translation> <translation id="567079066552447069">Hisob-kitob vaqtida kiritiladigan manzillar va toʻlov usullari roʻyxati yopildi.</translation> <translation id="5747552184818312860">Amal qilish muddati</translation> <translation id="6476284679642588870">Toʻlov usullarini boshqarish</translation> +<translation id="7093950421106918420">Hisob-kitob vaqtida buyurtma axboroti avtomatik kiritiladi.</translation> <translation id="7974390230414479278">Menyu bandi</translation> +<translation id="8098945428027498126">Manzilla va toʻlov usullari teginganda avtomatik kiritiladi. Klaviatura yashirildi.</translation> <translation id="884264119367021077">Yetkazib berish manzili</translation> <translation id="8873105120914375071">Hisob-kitob tezlashtirilsinmi?</translation> <translation id="9032876013752408138">Axborotim avtomatik kiritilsin</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_vi.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_vi.xtb index 82f98e39..c50f671f 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_vi.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_vi.xtb
@@ -2,14 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="vi"> <translation id="1275718070701477396">Đã chọn</translation> +<translation id="138513070655895675">Thay đổi sang phương thức thanh toán khác ở mục này trong trình đơn.</translation> +<translation id="2129442648318919291">Quản lý địa chỉ.</translation> +<translation id="2328179228329037980">Thay đổi sang địa chỉ giao hàng khác ở mục này trong trình đơn.</translation> <translation id="248973266728004341">Thêm thẻ tín dụng mới</translation> <translation id="385051799172605136">Quay lại</translation> <translation id="4401440167302712543">Tự động điền thông tin vận chuyển và thông tin thanh toán khi bạn thanh toán</translation> <translation id="4526274353008646337">Thêm địa chỉ mới</translation> +<translation id="5289073627190432393">Chọn phương thức thanh toán. Tuỳ chọn điều hướng.</translation> +<translation id="551561471023477766">Chọn địa chỉ giao hàng. Tuỳ chọn điều hướng.</translation> <translation id="567079066552447069">Danh sách địa chỉ và tuỳ chọn thanh toán sẽ được điền trong quy trình thanh toán đã bị đóng.</translation> <translation id="5747552184818312860">Hết hạn</translation> <translation id="6476284679642588870">Quản lý phương thức thanh toán</translation> +<translation id="7093950421106918420">Khi bạn thanh toán, thông tin khác của bạn sẽ tự động được điền.</translation> <translation id="7974390230414479278">Mục menu</translation> +<translation id="8098945428027498126">Bạn có thể chạm để điền địa chỉ và phương thức thanh toán có sẵn. Bàn phím đang ẩn.</translation> <translation id="884264119367021077">Ðịa chỉ giao hàng</translation> <translation id="8873105120914375071">Bạn có muốn thanh toán nhanh hơn?</translation> <translation id="9032876013752408138">Tự động điền thông tin của tôi</translation>
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-HK.xtb b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-HK.xtb index 94a29e68..5ce1827 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-HK.xtb
@@ -2,21 +2,21 @@ <!DOCTYPE translationbundle> <translationbundle lang="zh-HK"> <translation id="1275718070701477396">已選取</translation> -<translation id="138513070655895675">變更這個選單項目下的其他付款方式。</translation> +<translation id="138513070655895675">改去呢個選單項目下面嘅其他付款方法。</translation> <translation id="2129442648318919291">管理地址。</translation> -<translation id="2328179228329037980">變更這個選單項目下的其他運送地址。</translation> +<translation id="2328179228329037980">改去呢個選單項目下面嘅其他付運地址。</translation> <translation id="248973266728004341">新增信用卡</translation> <translation id="385051799172605136">返回</translation> <translation id="4401440167302712543">在結帳時自動填入運送及付款資料</translation> <translation id="4526274353008646337">新增地址</translation> -<translation id="5289073627190432393">選取付款方式。導覽選項。</translation> -<translation id="551561471023477766">選取運送地址。導覽選項。</translation> +<translation id="5289073627190432393">揀付款方法。導覽選項。</translation> +<translation id="551561471023477766">揀付運地址。導覽選項。</translation> <translation id="567079066552447069">當結帳流程閂咗嘅時候,系統要填嘅地址同付款選項清單。</translation> <translation id="5747552184818312860">到期日</translation> <translation id="6476284679642588870">管理付款方法</translation> -<translation id="7093950421106918420">系統會在結帳時自動填入其他資訊。</translation> +<translation id="7093950421106918420">系統會喺結帳嘅時候自動填入其他資料。</translation> <translation id="7974390230414479278">選單項目</translation> -<translation id="8098945428027498126">輕觸一下即可填入地址和付款方式。鍵盤已隱藏。</translation> +<translation id="8098945428027498126">㩒一下就可以填入地址同付款方法。隱藏咗鍵盤。</translation> <translation id="884264119367021077">運送地址</translation> <translation id="8873105120914375071">要更快完成結帳嗎?</translation> <translation id="9032876013752408138">自動填入我的資料</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 215cf41..3418357 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -270,6 +270,7 @@ <translation id="2496180316473517155">Blaaigeskiedenis</translation> <translation id="2497852260688568942">Jou administrateur het sinkronisering gedeaktiveer</translation> <translation id="250020030759455918">Jy sal jou <ph name="SITE_NAME" />-aanmeldingstatus, -blaaierdata en -werfdata in Chrome sien</translation> +<translation id="2510106555128151389">Installeer tans <ph name="WEBAPK_NAME" /> …</translation> <translation id="2513403576141822879">Sien <ph name="BEGIN_LINK" />Sinkornisering en Google-dienste<ph name="END_LINK" /> vir meer instellings wat verband hou met privaatheid, sekuriteit en data-insameling</translation> <translation id="2517472476991765520">Skandeer</translation> <translation id="2523184218357549926">Stuur URL'e van bladsye wat jy besoek na Google toe</translation> @@ -1280,6 +1281,7 @@ <translation id="7887334752153342268">Dupliseer</translation> <translation id="789763218334337857">Hoe om Chrome te gebruik</translation> <translation id="7903184275147100332">Dit kan 'n rukkie neem</translation> +<translation id="7914399737746719723">App is geïnstalleer</translation> <translation id="7919123827536834358">Vertaal hierdie tale outomaties</translation> <translation id="7926975587469166629">Kaart se bynaam</translation> <translation id="7929962904089429003">Maak die kieslys oop</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 278da484..bb59d26 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
@@ -270,6 +270,7 @@ <translation id="2496180316473517155">Historija pregledanja</translation> <translation id="2497852260688568942">Sinhronizaciju je onemogućio vaš administrator</translation> <translation id="250020030759455918">Vidjet ćete svoj status prijave na web lokaciji <ph name="SITE_NAME" />, podatke pregledanja i podatke web lokacije na Chromeu</translation> +<translation id="2510106555128151389">Instalira se <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Više postavki koje se odnose na privatnost, sigurnost i prikupljanje podataka dostupno je u odjeljku <ph name="BEGIN_LINK" />Sinkronizacija i prilagodba<ph name="END_LINK" /></translation> <translation id="2517472476991765520">Skeniraj</translation> <translation id="2523184218357549926">URL-ove stranica koje posjećujete šalje Googleu</translation> @@ -1280,6 +1281,7 @@ <translation id="7887334752153342268">Dupliciraj</translation> <translation id="789763218334337857">Kako koristiti Chrome</translation> <translation id="7903184275147100332">Ovo može malo potrajati</translation> +<translation id="7914399737746719723">Aplikacija je instalirana</translation> <translation id="7919123827536834358">Automatski prevedi ove jezike</translation> <translation id="7926975587469166629">Nadimak kartice</translation> <translation id="7929962904089429003">Otvorite meni</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index 65880f27..6afc61c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -270,6 +270,7 @@ <translation id="2496180316473517155">Povijest pregledavanja</translation> <translation id="2497852260688568942">Administrator je onemogućio sinkronizaciju</translation> <translation id="250020030759455918">Vidjet ćete svoj status prijave na <ph name="SITE_NAME" />, podatke o pregledavanju i podatke web-lokacije u Chromeu</translation> +<translation id="2510106555128151389">Instalira se <ph name="WEBAPK_NAME" />...</translation> <translation id="2513403576141822879">Više postavki koje se odnose na privatnost, sigurnost i prikupljanje podataka dostupno je u odjeljku <ph name="BEGIN_LINK" />Sinkronizacija i prilagodba<ph name="END_LINK" /></translation> <translation id="2517472476991765520">Traži</translation> <translation id="2523184218357549926">Šalje Googleu URL-ove stranica koje posjećujete</translation> @@ -1280,6 +1281,7 @@ <translation id="7887334752153342268">Udvostruči</translation> <translation id="789763218334337857">Kako upotrebljavati Chrome</translation> <translation id="7903184275147100332">To može malo potrajati</translation> +<translation id="7914399737746719723">Aplikacija je instalirana</translation> <translation id="7919123827536834358">Automatski prevedi ove jezike</translation> <translation id="7926975587469166629">Nadimak kartice</translation> <translation id="7929962904089429003">Otvaranje izbornika</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index b03c253..4a9830bb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -1172,7 +1172,7 @@ <translation id="7339898014177206373">नयाँ विन्डो</translation> <translation id="7340958967809483333">Discover का विकल्पहरू</translation> <translation id="7352339641508007922">लामो स्क्रिनसट खिच्न ड्र्याग गर्नुहोस्</translation> -<translation id="7352651011704765696">केही गल्ती भयो</translation> +<translation id="7352651011704765696">कुनै त्रुटि भयो</translation> <translation id="7352939065658542140">भिडियो</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{चयन गरिएको १ वस्तु सेयर गर्नुहोस्}other{चयन गरिएका # वस्तुहरू सेयर गर्नुहोस्}}</translation> <translation id="7359002509206457351">भुक्तानी विधिहरूमाथि पहुँच राख्नुहोस्</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index f6d7785..1fa0532 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -1173,7 +1173,7 @@ <translation id="7339898014177206373">ਨਵੀਂ window</translation> <translation id="7340958967809483333">'ਡਿਸਕਵਰ' ਲਈ ਵਿਕਲਪ</translation> <translation id="7352339641508007922">ਇੱਕ ਲੰਬਾ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲੈਣ ਲਈ ਘਸੀਟੋ</translation> -<translation id="7352651011704765696">ਕੁਝ ਗ਼ਲਤ ਹੋਇਆ ਸੀ</translation> +<translation id="7352651011704765696">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ</translation> <translation id="7352939065658542140">ਵੀਡੀਓ</translation> <translation id="7353894246028566792">{NUM_SELECTED,plural, =1{1 ਚੁਣੀ ਗਈ ਆਈਟਮ ਸਾਂਝੀ ਕਰੋ}one{# ਚੁਣੀਆਂ ਗਈਆਂ ਆਈਟਮਾਂ ਸਾਂਝੀਆਂ ਕਰੋ}other{# ਚੁਣੀਆਂ ਗਈਆਂ ਆਈਟਮਾਂ ਸਾਂਝੀਆਂ ਕਰੋ}}</translation> <translation id="7359002509206457351">ਭੁਗਤਾਨ ਵਿਧੀਆਂ ਤੱਕ ਪਹੁੰਚ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index dd1be79d4..3f96ef2 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -244,7 +244,7 @@ <translation id="2321086116217818302">Pripremaju se lozinke...</translation> <translation id="2323763861024343754">Memorijski prostor za sajt</translation> <translation id="2328985652426384049">Ne mogu da se prijavim</translation> -<translation id="234265804618409743">Ne možemo da otvorimo kameru. Nešto nije u redu.</translation> +<translation id="234265804618409743">Ne možemo da otvorimo kameru. Došlo je do greške.</translation> <translation id="2349710944427398404">Svi podaci koje koristi Chrome, uključujući naloge, obeleživače i sačuvana podešavanja</translation> <translation id="2353636109065292463">Proverava se internet veza</translation> <translation id="235789365079050412">Google politika privatnosti</translation> @@ -1017,7 +1017,7 @@ <translation id="6527303717912515753">Deli</translation> <translation id="6532866250404780454">Sajtovi koje posećujete u Chrome-u se neće prikazivati. Biće izbrisani tajmeri za sve sajtove.</translation> <translation id="6534565668554028783">Google-u je trebalo predugo da odgovori</translation> -<translation id="6539092367496845964">Nešto nije u redu. Probajte ponovo kasnije.</translation> +<translation id="6539092367496845964">Došlo je do greške. Probajte ponovo kasnije.</translation> <translation id="6541042852576515209">Promenite veličinu i rotirajte</translation> <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Provereno pre 1 sat}one{Provereno pre # sat}few{Provereno pre # sata}other{Provereno pre # sati}}</translation> <translation id="6545017243486555795">Obriši sve podatke</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index c68bdaa..9edd17b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -244,7 +244,7 @@ <translation id="2321086116217818302">Припремају се лозинке...</translation> <translation id="2323763861024343754">Меморијски простор за сајт</translation> <translation id="2328985652426384049">Не могу да се пријавим</translation> -<translation id="234265804618409743">Не можемо да отворимо камеру. Нешто није у реду.</translation> +<translation id="234265804618409743">Не можемо да отворимо камеру. Дошло је до грешке.</translation> <translation id="2349710944427398404">Сви подаци које користи Chrome, укључујући налоге, обележиваче и сачувана подешавања</translation> <translation id="2353636109065292463">Проверава се интернет веза</translation> <translation id="235789365079050412">Google политика приватности</translation> @@ -1017,7 +1017,7 @@ <translation id="6527303717912515753">Дели</translation> <translation id="6532866250404780454">Сајтови које посећујете у Chrome-у се неће приказивати. Биће избрисани тајмери за све сајтове.</translation> <translation id="6534565668554028783">Google-у је требало предуго да одговори</translation> -<translation id="6539092367496845964">Нешто није у реду. Пробајте поново касније.</translation> +<translation id="6539092367496845964">Дошло је до грешке. Пробајте поново касније.</translation> <translation id="6541042852576515209">Промените величину и ротирајте</translation> <translation id="6541983376925655882">{NUM_HOURS,plural, =1{Проверено пре 1 сат}one{Проверено пре # сат}few{Проверено пре # сата}other{Проверено пре # сати}}</translation> <translation id="6545017243486555795">Обриши све податке</translation>
diff --git a/chrome/browser/ui/ash/arc_open_url_delegate_impl.cc b/chrome/browser/ui/ash/arc_open_url_delegate_impl.cc index 7a41dd54..8bcb2a0 100644 --- a/chrome/browser/ui/ash/arc_open_url_delegate_impl.cc +++ b/chrome/browser/ui/ash/arc_open_url_delegate_impl.cc
@@ -24,6 +24,7 @@ #include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/ash/arc/fileapi/arc_content_file_system_url_util.h" #include "chrome/browser/ash/arc/intent_helper/custom_tab_session_impl.h" +#include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/ash/file_manager/fileapi_util.h" #include "chrome/browser/ash/file_manager/path_util.h" #include "chrome/browser/ash/fusebox/fusebox_server.h" @@ -291,6 +292,22 @@ return; GURL url_to_open = ConvertArcUrlToExternalFileUrlIfNeeded(url); + // If Lacros is primary browser, convert externalfile:// url into file:// url + // managed by the FuseBox moniker system because Lacros cannot handle + // externalfile:// urls. + // TODO(crbug.com/1374575): Check if other externalfile:// urls can use the + // same logic. If so, move this code into CrosapiNewWindowDelegate::OpenUrl() + // which is only for Lacros. + if (crosapi::browser_util::IsLacrosPrimaryBrowser()) { + Profile* profile = ash::ProfileHelper::Get()->GetProfileByUser( + user_manager::UserManager::Get()->GetPrimaryUser()); + // `profile` may be null if sign-in has happened but the profile isn't + // loaded yet. + if (!profile) + return; + url_to_open = ConvertToMonikerFileUrl(profile, url); + } + ash::NewWindowDelegate::GetPrimary()->OpenUrl( url_to_open, ash::NewWindowDelegate::OpenUrlFrom::kArc, ash::NewWindowDelegate::Disposition::kNewForegroundTab); @@ -307,7 +324,7 @@ if (!user) return; - // |profile| may be null if sign-in has happened but the profile isn't loaded + // `profile` may be null if sign-in has happened but the profile isn't loaded // yet. Profile* profile = ash::ProfileHelper::Get()->GetProfileByUser(user); if (!profile)
diff --git a/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.cc index fb8eda1..eeb734cc 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.cc
@@ -18,6 +18,9 @@ void OnReauthCompleted(PrefService* prefs, base::WeakPtr<PasswordsModelDelegate> delegate, bool success) { + base::UmaHistogramBoolean( + "PasswordManager.BiometricAuthenticationPromo.AuthenticationResult", + success); if (!success) { return; } @@ -97,6 +100,7 @@ void BiometricAuthenticationForFillingBubbleController::OnAccepted() { base::OnceCallback<void(bool)> on_reauth_completed = base::BindOnce(OnReauthCompleted, prefs_, delegate_); + accept_clicked_ = true; delegate_->AuthenticateUserWithMessage( l10n_util::GetStringUTF16( @@ -126,5 +130,8 @@ #endif } -// TODO(crbug.com/1364015): Record bubble interactions metrics. -void BiometricAuthenticationForFillingBubbleController::ReportInteractions() {} +void BiometricAuthenticationForFillingBubbleController::ReportInteractions() { + base::UmaHistogramBoolean( + "PasswordBubble.BiometricAuthenticationPromo.AcceptClicked", + accept_clicked_); +}
diff --git a/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.h b/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.h index 72628d1..02a7811 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.h +++ b/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.h
@@ -38,6 +38,8 @@ // PasswordBubbleControllerBase: void ReportInteractions() override; + bool accept_clicked_ = false; + raw_ptr<PrefService> prefs_; };
diff --git a/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller_unittest.cc b/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller_unittest.cc index a64f714..6f6cc48 100644 --- a/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller_unittest.cc +++ b/chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/passwords/bubble_controllers/biometric_authentication_for_filling_bubble_controller.h" +#include "base/test/metrics/histogram_tester.h" #include "chrome/browser/ui/passwords/passwords_model_delegate_mock.h" #include "chrome/grit/theme_resources.h" #include "components/password_manager/core/common/password_manager_pref_names.h" @@ -14,6 +15,11 @@ namespace { +constexpr char kAcceptHistogram[] = + "PasswordBubble.BiometricAuthenticationPromo.AcceptClicked"; +constexpr char kAuthResultHistogram[] = + "PasswordManager.BiometricAuthenticationPromo.AuthenticationResult"; + class BiometricAuthenticationForFillingBubbleControllerTest : public ::testing::Test { public: @@ -47,6 +53,8 @@ EXPECT_TRUE(testing::Mock::VerifyAndClearExpectations(delegate())); } + void ResetController() { controller_.reset(); } + private: std::unique_ptr<PasswordsModelDelegateMock> mock_delegate_; std::unique_ptr<BiometricAuthenticationForFillingBubbleController> @@ -55,10 +63,12 @@ }; TEST_F(BiometricAuthenticationForFillingBubbleControllerTest, Destroy) { + base::HistogramTester histograms; CreateController(); EXPECT_CALL(*delegate(), OnBubbleHidden()); controller()->OnBubbleClosing(); + histograms.ExpectUniqueSample(kAcceptHistogram, false, 1); } TEST_F(BiometricAuthenticationForFillingBubbleControllerTest, @@ -91,20 +101,26 @@ TEST_F(BiometricAuthenticationForFillingBubbleControllerTest, OnAcceptedFailure) { + base::HistogramTester histograms; CreateController(); EXPECT_CALL(*delegate(), AuthenticateUserWithMessage) .WillOnce(testing::WithArg<1>( [](auto callback) { std::move(callback).Run(/*success=*/false); })); controller()->OnAccepted(); + + ResetController(); EXPECT_FALSE(test_pref_service()->GetBoolean( password_manager::prefs::kBiometricAuthenticationBeforeFilling)); EXPECT_FALSE(test_pref_service()->GetBoolean( password_manager::prefs::kHasUserInteractedWithBiometricAuthPromo)); + histograms.ExpectUniqueSample(kAcceptHistogram, true, 1); + histograms.ExpectUniqueSample(kAuthResultHistogram, false, 1); } TEST_F(BiometricAuthenticationForFillingBubbleControllerTest, OnAcceptedSuccess) { + base::HistogramTester histograms; CreateController(); EXPECT_CALL(*delegate(), AuthenticateUserWithMessage) @@ -112,10 +128,14 @@ [](auto callback) { std::move(callback).Run(/*success=*/true); })); EXPECT_CALL(*delegate(), ShowBiometricActivationConfirmation); controller()->OnAccepted(); + + ResetController(); EXPECT_TRUE(test_pref_service()->GetBoolean( password_manager::prefs::kBiometricAuthenticationBeforeFilling)); EXPECT_TRUE(test_pref_service()->GetBoolean( password_manager::prefs::kHasUserInteractedWithBiometricAuthPromo)); + histograms.ExpectUniqueSample(kAcceptHistogram, true, 1); + histograms.ExpectUniqueSample(kAuthResultHistogram, true, 1); } } // namespace
diff --git a/chrome/browser/ui/profile_picker.h b/chrome/browser/ui/profile_picker.h index c419109..702a265a 100644 --- a/chrome/browser/ui/profile_picker.h +++ b/chrome/browser/ui/profile_picker.h
@@ -19,9 +19,6 @@ class GURL; class Profile; -namespace content { -class BrowserContext; -} namespace views { class View; @@ -230,9 +227,7 @@ // Shows a dialog where the user can auth the profile or see the // auth error message. If a dialog is already shown, this destroys the current // dialog and creates a new one. - static void ShowDialog(content::BrowserContext* browser_context, - const GURL& url, - const base::FilePath& profile_path); + static void ShowDialog(Profile* profile, const GURL& url); // Hides the dialog if it is showing. static void HideDialog(); @@ -294,8 +289,7 @@ #endif // Show the dialog and display local sign in error message without browser. - static void ShowDialogAndDisplayErrorMessage( - content::BrowserContext* browser_context); + static void ShowDialogAndDisplayErrorMessage(Profile* profile); }; // Dialog that will be displayed when a locked profile is selected in the @@ -309,20 +303,14 @@ // Shows a dialog where the user reauthenticates their primary account that // has invalid credentials, when force signin is enabled. - static void ShowReauthDialog(content::BrowserContext* browser_context, - const std::string& email, - const base::FilePath& profile_path); + static void ShowReauthDialog(Profile* profile, const std::string& email); // Shows a dialog where the user logs into their profile for the first time // via the profile picker, when force signin is enabled. - static void ShowForceSigninDialog(content::BrowserContext* browser_context, - const base::FilePath& profile_path); + static void ShowForceSigninDialog(Profile* profile); // Display local sign in error message without browser. static void DisplayErrorMessage(); - - // Hides the dialog if it is showing. - static void HideDialog(); }; #endif // CHROME_BROWSER_UI_PROFILE_PICKER_H_
diff --git a/chrome/browser/ui/views/overlay/document_overlay_window_views_unittest.cc b/chrome/browser/ui/views/overlay/document_overlay_window_views_unittest.cc index c2dedecb..4548794 100644 --- a/chrome/browser/ui/views/overlay/document_overlay_window_views_unittest.cc +++ b/chrome/browser/ui/views/overlay/document_overlay_window_views_unittest.cc
@@ -76,6 +76,7 @@ } void destroy() { child_web_contents_ = nullptr; } + absl::optional<gfx::Rect> GetWindowBounds() override { return absl::nullopt; } private: raw_ptr<content::WebContents> web_contents_;
diff --git a/chrome/browser/ui/views/overlay/video_overlay_window_views_unittest.cc b/chrome/browser/ui/views/overlay/video_overlay_window_views_unittest.cc index 67974aa..f2c688b 100644 --- a/chrome/browser/ui/views/overlay/video_overlay_window_views_unittest.cc +++ b/chrome/browser/ui/views/overlay/video_overlay_window_views_unittest.cc
@@ -63,6 +63,7 @@ void ToggleCamera() override {} void HangUp() override {} const gfx::Rect& GetSourceBounds() const override { return source_bounds_; } + absl::optional<gfx::Rect> GetWindowBounds() override { return absl::nullopt; } private: raw_ptr<content::WebContents> web_contents_;
diff --git a/chrome/browser/ui/views/profiles/profile_management_step_controller.cc b/chrome/browser/ui/views/profiles/profile_management_step_controller.cc index 3335531..ebbc5d8 100644 --- a/chrome/browser/ui/views/profiles/profile_management_step_controller.cc +++ b/chrome/browser/ui/views/profiles/profile_management_step_controller.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ui/views/profiles/profile_management_step_controller.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_metrics.h" @@ -134,6 +135,8 @@ profile_color_(profile_color), finish_flow_callback_(std::move(finish_flow_callback)) { DCHECK(finish_flow_callback_.value()); + profile_keep_alive_ = std::make_unique<ScopedProfileKeepAlive>( + profile_, ProfileKeepAliveOrigin::kProfileCreationSamlFlow); } ~FinishSamlSignInStepController() override { @@ -190,6 +193,7 @@ std::move(finish_flow_callback_.value()).Run(std::move(continue_callback)); } + std::unique_ptr<ScopedProfileKeepAlive> profile_keep_alive_; Profile* profile_; std::unique_ptr<content::WebContents> contents_; absl::optional<SkColor> profile_color_;
diff --git a/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_delegate.cc b/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_delegate.cc index d0339ec..638dec1a 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_delegate.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_delegate.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/ui/autofill/chrome_autofill_client.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.h" +#include "chrome/browser/ui/webui/signin/signin_url_utils.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" #include "components/web_modal/modal_dialog_host.h" @@ -18,6 +19,7 @@ #include "ui/views/controls/webview/webview.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/view.h" + ProfilePickerForceSigninDialogDelegate::ProfilePickerForceSigninDialogDelegate( ProfilePickerForceSigninDialogHost* host, std::unique_ptr<views::WebView> web_view, @@ -61,7 +63,9 @@ } void ProfilePickerForceSigninDialogDelegate::DisplayErrorMessage() { - web_view_->LoadInitialURL(GURL(chrome::kChromeUISigninErrorURL)); + GURL url(chrome::kChromeUISigninErrorURL); + url = AddFromProfilePickerURLParameter(url); + web_view_->LoadInitialURL(url); } bool ProfilePickerForceSigninDialogDelegate::HandleContextMenu(
diff --git a/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.cc b/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.cc index f3fd409b..6e20693 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.cc
@@ -4,6 +4,7 @@ #include "chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_delegate.h" #include "ui/views/controls/webview/webview.h" #include "ui/views/window/dialog_delegate.h" @@ -12,15 +13,13 @@ ProfilePickerForceSigninDialogHost::ProfilePickerForceSigninDialogHost() = default; -void ProfilePickerForceSigninDialogHost::ShowDialog( - content::BrowserContext* browser_context, - const GURL& url, - const base::FilePath& profile_path, - gfx::NativeView parent) { +void ProfilePickerForceSigninDialogHost::ShowDialog(Profile* profile, + const GURL& url, + gfx::NativeView parent) { HideDialog(); - force_signin_profile_path_ = profile_path; + force_signin_profile_path_ = profile->GetPath(); auto delegate = std::make_unique<ProfilePickerForceSigninDialogDelegate>( - this, std::make_unique<views::WebView>(browser_context), url); + this, std::make_unique<views::WebView>(profile), url); delegate_ = delegate.get(); views::DialogDelegate::CreateDialogWidget(std::move(delegate), nullptr, parent);
diff --git a/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.h b/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.h index 4d4d534..585fa698 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.h +++ b/chrome/browser/ui/views/profiles/profile_picker_force_signin_dialog_host.h
@@ -16,9 +16,7 @@ class DialogDelegateView; } -namespace content { -class BrowserContext; -} +class Profile; // Class encapsulating logic for views willing to host // ProfilePickerForceSigninDialogDelegate. @@ -34,10 +32,7 @@ // Shows a dialog where the user can auth the profile or see the auth error // message. If a dialog is already shown, this destroys the current dialog and // creates a new one. - void ShowDialog(content::BrowserContext* browser_context, - const GURL& url, - const base::FilePath& profile_path, - gfx::NativeView parent); + void ShowDialog(Profile* profile, const GURL& url, gfx::NativeView parent); // Hides the reauth dialog if it is showing. void HideDialog();
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.cc b/chrome/browser/ui/views/profiles/profile_picker_view.cc index 28e666c..396547f 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view.cc
@@ -30,6 +30,7 @@ #include "chrome/browser/ui/views/profiles/profile_management_flow_controller.h" #include "chrome/browser/ui/views/profiles/profile_picker_flow_controller.h" #include "chrome/browser/ui/webui/signin/profile_picker_ui.h" +#include "chrome/browser/ui/webui/signin/signin_url_utils.h" #include "chrome/common/pref_names.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/chromium_strings.h" @@ -113,6 +114,19 @@ ProfilePicker::EntryPoint::kLacrosPrimaryProfileFirstRun; } +void ClearLockedProfilesFirstBrowserKeepAlive() { + ProfileManager* profile_manager = g_browser_process->profile_manager(); + const std::vector<Profile*> loaded_profiles = + profile_manager->GetLoadedProfiles(); + for (Profile* profile : loaded_profiles) { + ProfileAttributesEntry* entry = + profile_manager->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(profile->GetPath()); + if (entry && entry->IsSigninRequired()) + profile_manager->ClearFirstBrowserWindowKeepAlive(profile); + } +} + } // namespace // static @@ -190,11 +204,9 @@ } // static -void ProfilePicker::ShowDialog(content::BrowserContext* browser_context, - const GURL& url, - const base::FilePath& profile_path) { +void ProfilePicker::ShowDialog(Profile* profile, const GURL& url) { if (g_profile_picker_view) { - g_profile_picker_view->ShowDialog(browser_context, url, profile_path); + g_profile_picker_view->ShowDialog(profile, url); } } @@ -267,13 +279,13 @@ } // static -void ProfilePicker::ShowDialogAndDisplayErrorMessage( - content::BrowserContext* browser_context) { +void ProfilePicker::ShowDialogAndDisplayErrorMessage(Profile* profile) { if (!ProfilePicker::IsActive()) return; GURL url(chrome::kChromeUISigninErrorURL); - ProfilePicker::ShowDialog(browser_context, url, base::FilePath()); + url = AddFromProfilePickerURLParameter(url); + ProfilePicker::ShowDialog(profile, url); return; } @@ -282,22 +294,20 @@ // static void ProfilePickerForceSigninDialog::ShowReauthDialog( - content::BrowserContext* browser_context, - const std::string& email, - const base::FilePath& profile_path) { + Profile* profile, + const std::string& email) { DCHECK(signin_util::IsForceSigninEnabled()); if (!ProfilePicker::IsActive()) return; GURL url = signin::GetEmbeddedReauthURLWithEmail( signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, signin_metrics::Reason::kReauthentication, email); - ProfilePicker::ShowDialog(browser_context, url, profile_path); + url = AddFromProfilePickerURLParameter(url); + ProfilePicker::ShowDialog(profile, url); } // static -void ProfilePickerForceSigninDialog::ShowForceSigninDialog( - content::BrowserContext* browser_context, - const base::FilePath& profile_path) { +void ProfilePickerForceSigninDialog::ShowForceSigninDialog(Profile* profile) { DCHECK(signin_util::IsForceSigninEnabled()); if (!ProfilePicker::IsActive()) return; @@ -305,8 +315,9 @@ GURL url = signin::GetEmbeddedPromoURL( signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, signin_metrics::Reason::kForcedSigninPrimaryAccount, true); + url = AddFromProfilePickerURLParameter(url); - ProfilePicker::ShowDialog(browser_context, url, profile_path); + ProfilePicker::ShowDialog(profile, url); } // static @@ -317,11 +328,6 @@ } } -// static -void ProfilePickerForceSigninDialog::HideDialog() { - ProfilePicker::HideDialog(); -} - // ProfilePickerView::NavigationFinishedObserver ------------------------------ ProfilePickerView::NavigationFinishedObserver::NavigationFinishedObserver( @@ -671,8 +677,7 @@ } std::move(switch_finished_callback).Run(true); - ProfilePickerForceSigninDialog::ShowForceSigninDialog( - web_view_->GetWebContents()->GetBrowserContext(), profile->GetPath()); + ProfilePickerForceSigninDialog::ShowForceSigninDialog(profile); } #endif @@ -688,6 +693,12 @@ #endif void ProfilePickerView::WindowClosing() { + // If a profile is locked, it might have been loaded and it's first browser + // will never be created, we need to remove it's equivalent + // `ProfileKeepAliveOrigin::kWaitingForFirstBrowserWindow` to be able to + // delete the profile. + ClearLockedProfilesFirstBrowserKeepAlive(); + views::WidgetDelegateView::WindowClosing(); // Now that the window is closed, we can allow a new one to be opened. // (WindowClosing comes in asynchronously from the call to Close() and we @@ -854,11 +865,9 @@ #endif // BUILDFLAG(IS_MAC) } -void ProfilePickerView::ShowDialog(content::BrowserContext* browser_context, - const GURL& url, - const base::FilePath& profile_path) { +void ProfilePickerView::ShowDialog(Profile* profile, const GURL& url) { gfx::NativeView parent = GetWidget()->GetNativeView(); - dialog_host_.ShowDialog(browser_context, url, profile_path, parent); + dialog_host_.ShowDialog(profile, url, parent); } void ProfilePickerView::HideDialog() {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view.h b/chrome/browser/ui/views/profiles/profile_picker_view.h index e6103c1..7fe3e16 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view.h +++ b/chrome/browser/ui/views/profiles/profile_picker_view.h
@@ -189,9 +189,7 @@ // Shows a dialog where the user can auth the profile or see the // auth error message. If a dialog is already shown, this destroys the current // dialog and creates a new one. - void ShowDialog(content::BrowserContext* browser_context, - const GURL& url, - const base::FilePath& profile_path); + void ShowDialog(Profile* profile, const GURL& url); // Hides the dialog if it is showing. void HideDialog();
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc index 1542698..8d3b10b 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -696,6 +696,9 @@ GURL force_signin_webui_url = signin::GetEmbeddedPromoURL( signin_metrics::AccessPoint::ACCESS_POINT_USER_MANAGER, signin_metrics::Reason::kForcedSigninPrimaryAccount, true); + force_signin_webui_url = + AddFromProfilePickerURLParameter(force_signin_webui_url); + ui_test_utils::UrlLoadObserver url_observer( force_signin_webui_url, content::NotificationService::AllSources()); url_observer.Wait();
diff --git a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc index 0007d2a..33aa89c 100644 --- a/chrome/browser/ui/views/sharing/sharing_dialog_view.cc +++ b/chrome/browser/ui/views/sharing/sharing_dialog_view.cc
@@ -246,9 +246,11 @@ LogSharingDevicesToShow(data_.prefix, kSharingUiDialog, data_.devices.size()); size_t index = 0; for (const auto& device : data_.devices) { + // TODO(crbug.com/1368080): Investigate the need to add a desktop device + // icon. auto icon = std::make_unique<views::ImageView>(ui::ImageModel::FromVectorIcon( - device->device_type() == sync_pb::SyncEnums::TYPE_TABLET + device->form_factor() == syncer::DeviceInfo::FormFactor::kTablet ? kTabletIcon : kHardwareSmartphoneIcon, ui::kColorIcon, kPrimaryIconSize));
diff --git a/chrome/browser/ui/webui/ash/account_manager/account_migration_welcome_ui.cc b/chrome/browser/ui/webui/ash/account_manager/account_migration_welcome_ui.cc index 6e8ec5c1..a0904f2 100644 --- a/chrome/browser/ui/webui/ash/account_manager/account_migration_welcome_ui.cc +++ b/chrome/browser/ui/webui/ash/account_manager/account_migration_welcome_ui.cc
@@ -12,7 +12,7 @@ #include "base/strings/utf_string_conversions.h" #include "build/branding_buildflags.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h" #include "chrome/browser/ui/webui/webui_util.h" #include "chrome/common/url_constants.h" #include "chrome/common/webui_url_constants.h"
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc index 698a47f43..122d15ca 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
@@ -29,7 +29,7 @@ #include "chrome/browser/signin/chrome_device_id_helper.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h" -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h" #include "chrome/common/channel_info.h" #include "chrome/common/chrome_constants.h" #include "components/policy/core/common/cloud/cloud_policy_core.h"
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h index ea92cc1..9e8df83 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h
@@ -92,4 +92,9 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when it moved to ash. +namespace ash { +using ::chromeos::EduCoexistenceLoginHandler; +} + #endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_EDU_COEXISTENCE_LOGIN_HANDLER_CHROMEOS_H_
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h index d0a4ec1..eff5410 100644 --- a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h +++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h
@@ -123,4 +123,9 @@ } // namespace chromeos +// TODO(https://crbug.com/1164001): remove when it moved to ash. +namespace ash { +using ::chromeos::EduCoexistenceStateTracker; +} + #endif // CHROME_BROWSER_UI_WEBUI_CHROMEOS_EDU_COEXISTENCE_EDU_COEXISTENCE_STATE_TRACKER_H_
diff --git a/chrome/browser/ui/webui/settings/ash/account_manager_ui_handler.cc b/chrome/browser/ui/webui/settings/ash/account_manager_ui_handler.cc index 7c91b5e..4da1f8ce 100644 --- a/chrome/browser/ui/webui/settings/ash/account_manager_ui_handler.cc +++ b/chrome/browser/ui/webui/settings/ash/account_manager_ui_handler.cc
@@ -21,7 +21,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/ash/account_manager/account_migration_welcome_dialog.h" #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h" #include "chrome/grit/generated_resources.h" #include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "components/account_manager_core/account_manager_facade.h"
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.cc similarity index 97% rename from chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc rename to chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.cc index c20620e..f3dfd078 100644 --- a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.cc +++ b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h" #include <algorithm> #include <string> @@ -31,7 +31,7 @@ #include "ui/views/widget/widget.h" #include "url/gurl.h" -namespace chromeos { +namespace ash { namespace { @@ -276,8 +276,8 @@ // TODO(crbug.com/1016828): Remove/update this after the dialog behavior on // Chrome OS is defined. - ash::WindowBackdrop::Get(dialog->dialog_window()) - ->SetBackdropType(ash::WindowBackdrop::BackdropType::kSemiOpaque); + WindowBackdrop::Get(dialog->dialog_window()) + ->SetBackdropType(WindowBackdrop::BackdropType::kSemiOpaque); } -} // namespace chromeos +} // namespace ash
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h similarity index 90% rename from chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h rename to chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h index 70c9d9e3..e57a137 100644 --- a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h +++ b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_H_ -#define CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_DIALOG_CHROMEOS_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_DIALOG_CHROMEOS_H_ #include <memory> #include <string> @@ -12,7 +12,7 @@ #include "base/gtest_prod_util.h" #include "base/observer_list.h" #include "chrome/browser/ui/webui/chromeos/system_web_dialog_delegate.h" -#include "chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_handler_modal_delegate.h" #include "components/account_manager_core/account_addition_options.h" #include "components/web_modal/modal_dialog_host.h" #include "components/web_modal/web_contents_modal_dialog_host.h" @@ -20,10 +20,8 @@ class GURL; namespace ash { -class AccountManagerUIImpl; -} -namespace chromeos { +class AccountManagerUIImpl; // Extends from |SystemWebDialogDelegate| to create an always-on-top dialog. class InlineLoginDialogChromeOS : public SystemWebDialogDelegate, @@ -73,7 +71,7 @@ // `Show` method can be called directly only by `AccountManagerUIImpl` class. // To show the dialog, use `AccountManagerFacade`. - friend class ash::AccountManagerUIImpl; + friend class AccountManagerUIImpl; // Displays the dialog. |close_dialog_closure| will be called when the dialog // is closed. @@ -100,6 +98,6 @@ modal_dialog_host_observer_list_; }; -} // namespace chromeos +} // namespace ash -#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_H_ +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_DIALOG_CHROMEOS_H_
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_browsertest.cc b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_browsertest.cc similarity index 97% rename from chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_browsertest.cc rename to chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_browsertest.cc index cb81307..4fa9072 100644 --- a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_browsertest.cc +++ b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_browsertest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h" #include "base/json/json_reader.h" #include "chrome/common/webui_url_constants.h" @@ -17,7 +17,7 @@ #include "ui/views/widget/widget.h" #include "ui/views/window/dialog_delegate.h" -namespace chromeos { +namespace ash { namespace { // Subclass to access protected constructor and protected methods. @@ -119,4 +119,4 @@ EXPECT_FALSE(InlineLoginDialogChromeOS::IsShown()); } -} // namespace chromeos +} // namespace ash
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.cc similarity index 96% rename from chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc rename to chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.cc index dd96f3ca..f3a7c632 100644 --- a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.cc +++ b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.h" #include "base/metrics/histogram_functions.h" #include "chrome/browser/profiles/profile.h" @@ -12,7 +12,7 @@ #include "ui/gfx/geometry/size.h" #include "ui/views/widget/widget.h" -namespace chromeos { +namespace ash { InlineLoginDialogChromeOSOnboarding::Delegate::Delegate( InlineLoginDialogChromeOSOnboarding* dialog) @@ -122,4 +122,4 @@ InlineLoginDialogChromeOS::OnDialogClosed(json_retval); } -} // namespace chromeos +} // namespace ash
diff --git a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.h similarity index 81% rename from chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h rename to chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.h index 5ecf6f9..571fc08 100644 --- a/chrome/browser/ui/webui/signin/inline_login_dialog_chromeos_onboarding.h +++ b/chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos_onboarding.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_ -#define CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_ -#include "chrome/browser/ui/webui/signin/inline_login_dialog_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_dialog_chromeos.h" #include "base/callback.h" #include "ui/base/ui_base_types.h" @@ -21,7 +21,7 @@ class Rect; } // namespace gfx -namespace chromeos { +namespace ash { // Inherits from InlineLoginDialogChromeOS to handle the special scenario where // the dialog is shown during onboarding. @@ -83,12 +83,6 @@ base::OnceCallback<void(void)> dialog_closed_callback_; }; -} // namespace chromeos +} // namespace ash -// TODO(https://crbug.com/1164001): remove after the //chrome/browser/chromeos -// source migration is finished. -namespace ash { -using ::chromeos::InlineLoginDialogChromeOSOnboarding; -} - -#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_ +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_DIALOG_CHROMEOS_ONBOARDING_H_
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.cc similarity index 95% rename from chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc rename to chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.cc index 6f13ee0..e4b255c 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc +++ b/chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.h" #include <memory> #include <string> @@ -22,8 +22,8 @@ #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_state_tracker.h" +#include "chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.h" #include "chrome/browser/ui/webui/signin/inline_login_handler.h" -#include "chrome/browser/ui/webui/signin/signin_helper_chromeos.h" #include "chrome/common/pref_names.h" #include "chromeos/ash/components/account_manager/account_manager_factory.h" #include "chromeos/version/version_loader.h" @@ -45,7 +45,7 @@ #include "ui/chromeos/devicetype_utils.h" #include "ui/chromeos/resources/grit/ui_chromeos_resources.h" -namespace chromeos { +namespace ash { namespace { using ::account_manager::AccountManager; @@ -227,9 +227,8 @@ // static void InlineLoginHandlerChromeOS::RegisterProfilePrefs( PrefRegistrySimple* registry) { - registry->RegisterBooleanPref( - chromeos::prefs::kShouldSkipInlineLoginWelcomePage, - false /*default_value*/); + registry->RegisterBooleanPref(prefs::kShouldSkipInlineLoginWelcomePage, + false /*default_value*/); } void InlineLoginHandlerChromeOS::RegisterMessages() { @@ -272,8 +271,8 @@ const GURL& url = gaia_urls->embedded_setup_chromeos_url(2U); params.Set("gaiaPath", url.path().substr(1)); - absl::optional<std::string> version = - version_loader::GetVersion(version_loader::VERSION_SHORT); + absl::optional<std::string> version = chromeos::version_loader::GetVersion( + chromeos::version_loader::VERSION_SHORT); params.Set("platformVersion", version.value_or("0.0.0.0")); params.Set("constrained", "1"); params.Set("flow", GetInlineLoginFlowName(Profile::FromWebUI(web_ui()), @@ -294,7 +293,7 @@ CHECK(!params.gaia_id.empty()); CHECK(!params.email.empty()); - if (ash::AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) { + if (AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) { ::GetAccountManagerFacade(Profile::FromWebUI(web_ui())->GetPath().value()) ->GetAccounts(base::BindOnce( &InlineLoginHandlerChromeOS::OnGetAccountsToCompleteLogin, @@ -324,7 +323,7 @@ std::unique_ptr<SigninHelper::ArcHelper> arc_helper = std::make_unique<SigninHelper::ArcHelper>( is_available_in_arc, /*is_account_addition=*/is_new_account, - ash::AccountAppsAvailabilityFactory::GetForProfile( + AccountAppsAvailabilityFactory::GetForProfile( Profile::FromWebUI(web_ui()))); CreateSigninHelper(params, std::move(arc_helper)); } @@ -430,8 +429,7 @@ void InlineLoginHandlerChromeOS::ContinueGetAccountsNotAvailableInArc( const std::string& callback_id, const std::vector<::account_manager::Account>& accounts) { - ash::AccountAppsAvailabilityFactory::GetForProfile( - Profile::FromWebUI(web_ui())) + AccountAppsAvailabilityFactory::GetForProfile(Profile::FromWebUI(web_ui())) ->GetAccountsAvailableInArc(base::BindOnce( &InlineLoginHandlerChromeOS::FinishGetAccountsNotAvailableInArc, weak_factory_.GetWeakPtr(), callback_id, accounts)); @@ -464,8 +462,7 @@ const base::Value::List& args) { CHECK_EQ(1u, args.size()); const base::Value::Dict& dictionary = args.front().GetDict(); - ash::AccountAppsAvailabilityFactory::GetForProfile( - Profile::FromWebUI(web_ui())) + AccountAppsAvailabilityFactory::GetForProfile(Profile::FromWebUI(web_ui())) ->SetIsAccountAvailableInArc(ValueToGaiaAccount(dictionary), /*is_available=*/true); close_dialog_closure_.Run(); @@ -485,4 +482,4 @@ close_dialog_closure_.Run(); } -} // namespace chromeos +} // namespace ash
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h b/chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.h similarity index 89% rename from chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h rename to chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.h index 10ffcf3..fc23a60 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h +++ b/chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.h
@@ -2,20 +2,20 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_CHROMEOS_H_ -#define CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_CHROMEOS_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_HANDLER_CHROMEOS_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_HANDLER_CHROMEOS_H_ #include <string> #include "base/containers/flat_set.h" #include "base/values.h" +#include "chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.h" #include "chrome/browser/ui/webui/signin/inline_login_handler.h" -#include "chrome/browser/ui/webui/signin/signin_helper_chromeos.h" #include "components/account_manager_core/account.h" class PrefRegistrySimple; -namespace chromeos { +namespace ash { class InlineLoginHandlerChromeOS : public InlineLoginHandler { public: @@ -71,6 +71,6 @@ base::WeakPtrFactory<InlineLoginHandlerChromeOS> weak_factory_{this}; }; -} // namespace chromeos +} // namespace ash -#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_CHROMEOS_H_ +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_HANDLER_CHROMEOS_H_
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc b/chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos_browsertest.cc similarity index 96% rename from chrome/browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc rename to chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos_browsertest.cc index 6eeda88c..0c47343a 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc +++ b/chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos_browsertest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.h" #include "ash/constants/ash_features.h" #include "base/bind.h" @@ -42,7 +42,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace chromeos { +namespace ash { namespace { @@ -129,7 +129,7 @@ }; class MockAccountAppsAvailabilityObserver - : public ::ash::AccountAppsAvailability::Observer { + : public AccountAppsAvailability::Observer { public: MockAccountAppsAvailabilityObserver() = default; ~MockAccountAppsAvailabilityObserver() override = default; @@ -276,8 +276,8 @@ web_ui()->HandleReceivedMessage("consentLogged", list_args); } - ash::FakeChromeUserManager* GetFakeUserManager() const { - return static_cast<ash::FakeChromeUserManager*>( + FakeChromeUserManager* GetFakeUserManager() const { + return static_cast<FakeChromeUserManager*>( user_manager::UserManager::Get()); } @@ -374,7 +374,7 @@ InlineLoginHandlerChromeOSTest::SetUpOnMainThread(); // In-session account addition happens when `AccountAppsAvailability` is // already initialized. - EXPECT_TRUE(ash::AccountAppsAvailabilityFactory::GetForProfile(profile()) + EXPECT_TRUE(AccountAppsAvailabilityFactory::GetForProfile(profile()) ->IsInitialized()); } @@ -386,7 +386,7 @@ observation.Observe( ::GetAccountManagerFacade(profile()->GetPath().value())); auto* account_apps_availability = - ash::AccountAppsAvailabilityFactory::GetForProfile(profile()); + AccountAppsAvailabilityFactory::GetForProfile(profile()); // Wait until account is added. base::RunLoop run_loop; @@ -448,11 +448,11 @@ ::GetAccountManagerFacade(profile()->GetPath().value())); MockAccountAppsAvailabilityObserver apps_availability_observer; - base::ScopedObservation<ash::AccountAppsAvailability, - ash::AccountAppsAvailability::Observer> + base::ScopedObservation<AccountAppsAvailability, + AccountAppsAvailability::Observer> apps_availability_observation{&apps_availability_observer}; apps_availability_observation.Observe( - ash::AccountAppsAvailabilityFactory::GetForProfile(profile())); + AccountAppsAvailabilityFactory::GetForProfile(profile())); // Call "completeLogin". base::Value::List args; @@ -490,11 +490,11 @@ ::GetAccountManagerFacade(profile()->GetPath().value())); MockAccountAppsAvailabilityObserver apps_availability_observer; - base::ScopedObservation<ash::AccountAppsAvailability, - ash::AccountAppsAvailability::Observer> + base::ScopedObservation<AccountAppsAvailability, + AccountAppsAvailability::Observer> apps_availability_observation{&apps_availability_observer}; apps_availability_observation.Observe( - ash::AccountAppsAvailabilityFactory::GetForProfile(profile())); + AccountAppsAvailabilityFactory::GetForProfile(profile())); // Call "completeLogin". base::Value::List args; @@ -556,4 +556,4 @@ ::testing::Values(GetGaiaDeviceAccountInfo(), GetChildDeviceAccountInfo())); -} // namespace chromeos +} // namespace ash
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.cc b/chrome/browser/ui/webui/signin/ash/inline_login_handler_modal_delegate.cc similarity index 80% rename from chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.cc rename to chrome/browser/ui/webui/signin/ash/inline_login_handler_modal_delegate.cc index 0c1090f34..267c14d 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.cc +++ b/chrome/browser/ui/webui/signin/ash/inline_login_handler_modal_delegate.cc
@@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_handler_modal_delegate.h" #include "content/public/browser/web_contents.h" -namespace chromeos { +namespace ash { InlineLoginHandlerModalDelegate::InlineLoginHandlerModalDelegate( web_modal::WebContentsModalDialogHost* host) @@ -19,4 +19,4 @@ return host_; } -} // namespace chromeos +} // namespace ash
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.h b/chrome/browser/ui/webui/signin/ash/inline_login_handler_modal_delegate.h similarity index 80% rename from chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.h rename to chrome/browser/ui/webui/signin/ash/inline_login_handler_modal_delegate.h index 1e64927c..2c23224 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_modal_delegate.h +++ b/chrome/browser/ui/webui/signin/ash/inline_login_handler_modal_delegate.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_MODAL_DELEGATE_H_ -#define CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_MODAL_DELEGATE_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_HANDLER_MODAL_DELEGATE_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_HANDLER_MODAL_DELEGATE_H_ #include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h" -namespace chromeos { +namespace ash { // Used to display sub-modals inside |InlineLoginHandlerDialogChromeOS| modal // dialog, e.g. displaying a dialog for accounts using 2FA with WebAuthn, @@ -36,6 +36,6 @@ web_modal::WebContentsModalDialogHost* host_; }; -} // namespace chromeos +} // namespace ash -#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_INLINE_LOGIN_HANDLER_MODAL_DELEGATE_H_ +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_INLINE_LOGIN_HANDLER_MODAL_DELEGATE_H_
diff --git a/chrome/browser/ui/webui/signin/signin_helper_chromeos.cc b/chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.cc similarity index 94% rename from chrome/browser/ui/webui/signin/signin_helper_chromeos.cc rename to chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.cc index 03de650..de2e603 100644 --- a/chrome/browser/ui/webui/signin/signin_helper_chromeos.cc +++ b/chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/signin_helper_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.h" #include "ash/constants/ash_features.h" #include "base/feature_list.h" @@ -15,7 +15,7 @@ #include "components/user_manager/user_manager.h" #include "google_apis/gaia/gaia_auth_fetcher.h" -namespace chromeos { +namespace ash { namespace { constexpr char kSecondaryGoogleAccountUsageHistogramName[] = @@ -23,7 +23,7 @@ } // namespace using SigninRestrictionPolicyFetcher = - ::ash::UserCloudSigninRestrictionPolicyFetcherChromeOS; + UserCloudSigninRestrictionPolicyFetcherChromeOS; // static bool SigninHelper::IsSecondaryGoogleAccountUsageEnabled() { @@ -33,7 +33,7 @@ SigninHelper::ArcHelper::ArcHelper( bool is_available_in_arc, bool is_account_addition, - ash::AccountAppsAvailability* account_apps_availability) + AccountAppsAvailability* account_apps_availability) : is_available_in_arc_(is_available_in_arc), is_account_addition_(is_account_addition), account_apps_availability_(account_apps_availability) {} @@ -73,12 +73,12 @@ gaia_auth_fetcher_(this, gaia::GaiaSource::kChrome, url_loader_factory_) { DCHECK(!signin_scoped_device_id.empty()); - if (ash::AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) + if (AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) DCHECK(arc_helper_); if (!IsInitialPrimaryAccount() && IsSecondaryGoogleAccountUsageEnabled()) { DCHECK(show_signin_blocked_error_); restriction_fetcher_ = - std::make_unique<ash::UserCloudSigninRestrictionPolicyFetcherChromeOS>( + std::make_unique<UserCloudSigninRestrictionPolicyFetcherChromeOS>( email_, url_loader_factory_); } @@ -132,7 +132,7 @@ account_manager_->UpsertAccount(account_key_, email_, refresh_token); auto new_account = account_manager::Account{account_key_, email_}; - if (ash::AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) { + if (AccountAppsAvailability::IsArcAccountRestrictionsEnabled()) { arc_helper_->OnAccountAdded(new_account); } // Notify `AccountManagerMojoService` about successful account addition and @@ -237,4 +237,4 @@ SigninHelper::GetUrlLoaderFactory() { return url_loader_factory_; } -} // namespace chromeos +} // namespace ash
diff --git a/chrome/browser/ui/webui/signin/signin_helper_chromeos.h b/chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.h similarity index 89% rename from chrome/browser/ui/webui/signin/signin_helper_chromeos.h rename to chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.h index f7a54ee..1a49da3 100644 --- a/chrome/browser/ui/webui/signin/signin_helper_chromeos.h +++ b/chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.h
@@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_HELPER_CHROMEOS_H_ -#define CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_HELPER_CHROMEOS_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_SIGNIN_HELPER_CHROMEOS_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_SIGNIN_HELPER_CHROMEOS_H_ -#include "chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.h" #include "components/account_manager_core/account.h" #include "components/account_manager_core/chromeos/account_manager.h" #include "components/account_manager_core/chromeos/account_manager_mojo_service.h" @@ -16,11 +16,9 @@ #include "third_party/abseil-cpp/absl/types/optional.h" namespace ash { + class AccountManager; class AccountAppsAvailability; -} // namespace ash - -namespace chromeos { // A helper class for completing the inline login flow. Primarily, it is // responsible for exchanging the auth code, obtained after a successful user @@ -37,7 +35,7 @@ // If `is_account_addition` is `false` - the account is reauthenticated. ArcHelper(bool is_available_in_arc, bool is_account_addition, - ash::AccountAppsAvailability* account_apps_availability); + AccountAppsAvailability* account_apps_availability); ArcHelper(const ArcHelper&) = delete; ArcHelper& operator=(const ArcHelper&) = delete; virtual ~ArcHelper(); @@ -51,7 +49,7 @@ bool is_account_addition_ = false; // A non-owning pointer to AccountAppsAvailability which is a KeyedService // and should outlive this class. - ash::AccountAppsAvailability* account_apps_availability_ = nullptr; + AccountAppsAvailability* account_apps_availability_ = nullptr; }; SigninHelper( @@ -85,7 +83,7 @@ // Receives the callback for `GetSecondaryGoogleAccountUsage()`. void OnGetSecondaryGoogleAccountUsage( - ash::UserCloudSigninRestrictionPolicyFetcherChromeOS::Status status, + UserCloudSigninRestrictionPolicyFetcherChromeOS::Status status, absl::optional<std::string> policy_result, const std::string& hosted_domain); @@ -116,7 +114,7 @@ // sessions, Demo mode, and Kiosks. bool IsInitialPrimaryAccount(); // Fetcher to get SecondaryGoogleAccountUsage policy value. - std::unique_ptr<ash::UserCloudSigninRestrictionPolicyFetcherChromeOS> + std::unique_ptr<UserCloudSigninRestrictionPolicyFetcherChromeOS> restriction_fetcher_; // The user's refresh token fetched in `this` object. std::string refresh_token_; @@ -144,6 +142,6 @@ base::WeakPtrFactory<SigninHelper> weak_factory_{this}; }; -} // namespace chromeos +} // namespace ash -#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_HELPER_CHROMEOS_H_ +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_SIGNIN_HELPER_CHROMEOS_H_
diff --git a/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc b/chrome/browser/ui/webui/signin/ash/signin_helper_chromeos_browsertest.cc similarity index 99% rename from chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc rename to chrome/browser/ui/webui/signin/ash/signin_helper_chromeos_browsertest.cc index 0880699..54a95c5 100644 --- a/chrome/browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc +++ b/chrome/browser/ui/webui/signin/ash/signin_helper_chromeos_browsertest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/signin_helper_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/signin_helper_chromeos.h" #include "ash/constants/ash_features.h" #include "base/run_loop.h" @@ -29,7 +29,7 @@ #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_url_loader_factory.h" -namespace chromeos { +namespace ash { class SigninHelperChromeOSTest; @@ -710,4 +710,4 @@ 0); } -} // namespace chromeos +} // namespace ash
diff --git a/chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.cc b/chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.cc similarity index 98% rename from chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.cc rename to chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.cc index d2f9e12..6a59503 100644 --- a/chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.cc +++ b/chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.h" #include "base/command_line.h" #include "base/json/json_string_value_serializer.h"
diff --git a/chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.h b/chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.h similarity index 95% rename from chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.h rename to chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.h index 863a31f6..5ea248d 100644 --- a/chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.h +++ b/chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_USER_CLOUD_SIGNIN_RESTRICTION_POLICY_FETCHER_CHROMEOS_H_ -#define CHROME_BROWSER_UI_WEBUI_SIGNIN_USER_CLOUD_SIGNIN_RESTRICTION_POLICY_FETCHER_CHROMEOS_H_ +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_USER_CLOUD_SIGNIN_RESTRICTION_POLICY_FETCHER_CHROMEOS_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_USER_CLOUD_SIGNIN_RESTRICTION_POLICY_FETCHER_CHROMEOS_H_ #include <memory> #include <string> @@ -163,4 +163,4 @@ } // namespace ash -#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_USER_CLOUD_SIGNIN_RESTRICTION_POLICY_FETCHER_CHROMEOS_H_ +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_ASH_USER_CLOUD_SIGNIN_RESTRICTION_POLICY_FETCHER_CHROMEOS_H_
diff --git a/chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos_unittest.cc b/chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos_unittest.cc similarity index 98% rename from chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos_unittest.cc rename to chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos_unittest.cc index 0a28a56..856c2c4 100644 --- a/chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos_unittest.cc +++ b/chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.h" #include <memory>
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chrome/browser/ui/webui/signin/inline_login_handler.cc index 1b31d0a..34c7b72c 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler.cc
@@ -242,7 +242,7 @@ void InlineLoginHandler::HandleDialogClose(const base::Value::List& args) { #if !BUILDFLAG(IS_CHROMEOS_ASH) // Does nothing if profile picker is not showing. - ProfilePickerForceSigninDialog::HideDialog(); + ProfilePicker::HideDialog(); #endif // !BUILDFLAG(IS_CHROMEOS_ASH) }
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc index b5b930f2..bf991316 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -56,6 +56,7 @@ #include "chrome/browser/ui/webui/signin/login_ui_service.h" #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" #include "chrome/browser/ui/webui/signin/signin_ui_error.h" +#include "chrome/browser/ui/webui/signin/signin_url_utils.h" #include "chrome/browser/ui/webui/signin/signin_utils.h" #include "chrome/browser/ui/webui/signin/signin_utils_desktop.h" #include "chrome/browser/ui/webui/signin/turn_sync_on_helper.h" @@ -496,12 +497,11 @@ // If this was called from the user manager to reauthenticate the profile, // make sure the webui is aware. - Profile* profile = Profile::FromWebUI(web_ui()); - if (profile->IsSystemProfile()) - params.Set("dontResizeNonEmbeddedPages", true); - content::WebContents* contents = web_ui()->GetWebContents(); const GURL& current_url = contents->GetLastCommittedURL(); + if (HasFromProfilePickerURLParameter(current_url)) + params.Set("dontResizeNonEmbeddedPages", true); + HandlerSigninReason reason = GetHandlerSigninReason(current_url); const GURL& url = GaiaUrls::GetInstance()->embedded_signin_url(); @@ -601,47 +601,27 @@ content::StoragePartition* partition = signin::GetSigninPartition(contents->GetBrowserContext()); - // If this was called from the user manager to reauthenticate the profile, - // the current profile is the system profile. In this case, use the email to - // find the right profile to reauthenticate. Otherwise the profile can be - // taken from web_ui(). HandlerSigninReason reason = GetHandlerSigninReason(current_url); - Profile* profile = Profile::FromWebUI(web_ui()); - if (reason == HandlerSigninReason::kFetchLstOnly || - !profile->IsSystemProfile()) { - FinishCompleteLogin( - FinishCompleteLoginParams(this, partition, current_url, - base::FilePath(), confirm_untrusted_signin_, - params.email, params.gaia_id, params.password, - params.auth_code, params.choose_what_to_sync, - /*is_force_sign_in_with_usermanager=*/false), - profile); - return; + + bool force_sign_in_with_usermanager = false; + base::FilePath path; + if (reason != HandlerSigninReason::kFetchLstOnly && + HasFromProfilePickerURLParameter(current_url)) { + DCHECK(reason == HandlerSigninReason::kForcedSigninPrimaryAccount || + reason == HandlerSigninReason::kReauthentication); + DCHECK(signin_util::IsForceSigninEnabled()); + + force_sign_in_with_usermanager = true; + path = profile->GetPath(); } - DCHECK(reason == HandlerSigninReason::kForcedSigninPrimaryAccount || - reason == HandlerSigninReason::kReauthentication); - DCHECK(signin_util::IsForceSigninEnabled()); - - ProfileManager* manager = g_browser_process->profile_manager(); - base::FilePath path = - profiles::GetPathOfProfileWithEmail(manager, params.email); - if (path.empty()) - path = ProfilePicker::GetForceSigninProfilePath(); - if (path.empty()) - return; - - // Switch to the profile and finish the login. Pass the profile path so it can - // be marked as unlocked. - FinishCompleteLoginParams finish_login_params( - this, partition, current_url, path, confirm_untrusted_signin_, - params.email, params.gaia_id, params.password, params.auth_code, - params.choose_what_to_sync, /*is_force_sign_in_with_usermanager=*/true); - base::OnceCallback<void(Profile*)> callback = base::BindOnce( - &InlineLoginHandlerImpl::FinishCompleteLogin, finish_login_params); - // Browser window will be opened after ClientOAuthSuccess. - profiles::LoadProfileAsync(path, std::move(callback)); + FinishCompleteLogin( + FinishCompleteLoginParams( + this, partition, current_url, path, confirm_untrusted_signin_, + params.email, params.gaia_id, params.password, params.auth_code, + params.choose_what_to_sync, force_sign_in_with_usermanager), + profile); } InlineLoginHandlerImpl::FinishCompleteLoginParams::FinishCompleteLoginParams( @@ -794,13 +774,10 @@ return; } SyncSetupFailed(); - Browser* browser = GetDesktopBrowser(); - Profile* profile = Profile::FromWebUI(web_ui()); - if (profile->IsSystemProfile()) - profile = g_browser_process->profile_manager()->GetProfileByPath( - ProfilePicker::GetForceSigninProfilePath()); if (!error.IsOk()) { + Browser* browser = GetDesktopBrowser(); + Profile* profile = Profile::FromWebUI(web_ui()); LoginUIServiceFactory::GetForProfile(profile)->DisplayLoginResult(browser, error); }
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/ui/webui/signin/inline_login_ui.cc index c4dc7e8..acdd1e3 100644 --- a/chrome/browser/ui/webui/signin/inline_login_ui.cc +++ b/chrome/browser/ui/webui/signin/inline_login_ui.cc
@@ -45,12 +45,12 @@ #include "chrome/browser/ui/webui/chromeos/edu_account_login_handler_chromeos.h" #include "chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.h" #include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h" -#include "chrome/browser/ui/webui/signin/inline_login_handler_chromeos.h" +#include "chrome/browser/ui/webui/signin/ash/inline_login_handler_chromeos.h" #include "chrome/grit/arc_account_picker_resources.h" #include "chrome/grit/arc_account_picker_resources_map.h" -#include "components/account_manager_core/pref_names.h" #include "chrome/grit/gaia_action_buttons_resources.h" #include "chrome/grit/gaia_action_buttons_resources_map.h" +#include "components/account_manager_core/pref_names.h" #include "components/prefs/pref_service.h" #include "ui/base/l10n/l10n_util.h" #include "ui/chromeos/devicetype_utils.h" @@ -358,10 +358,9 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) web_ui->AddMessageHandler( - std::make_unique<chromeos::InlineLoginHandlerChromeOS>( - base::BindRepeating(&WebDialogUIBase::CloseDialog, - weak_factory_.GetWeakPtr(), - base::Value::List() /* args */))); + std::make_unique<ash::InlineLoginHandlerChromeOS>(base::BindRepeating( + &WebDialogUIBase::CloseDialog, weak_factory_.GetWeakPtr(), + base::Value::List() /* args */))); if (profile->IsChild()) { web_ui->AddMessageHandler( std::make_unique<chromeos::EduCoexistenceLoginHandler>(
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.cc b/chrome/browser/ui/webui/signin/profile_picker_handler.cc index 380f4b1..ee9f17c4 100644 --- a/chrome/browser/ui/webui/signin/profile_picker_handler.cc +++ b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
@@ -521,45 +521,21 @@ return; } - if (entry->IsSigninRequired()) { - DCHECK(signin_util::IsForceSigninEnabled()); - if (entry->CanBeManaged()) { - ProfilePickerForceSigninDialog::ShowReauthDialog( - web_ui()->GetWebContents()->GetBrowserContext(), - base::UTF16ToUTF8(entry->GetUserName()), *profile_path); - } else if (entry->GetActiveTime() != base::Time()) { - // If force-sign-in is enabled, do not allow users to sign in to a - // pre-existing locked profile, as this may force unexpected profile data - // merge. We consider a profile as pre-existing if it has been actived - // previously. A pre-existed profile can still be used if it has been - // signed in with an email address matched RestrictSigninToPattern policy - // already. - LoginUIServiceFactory::GetForProfile( - Profile::FromWebUI(web_ui())->GetOriginalProfile()) - ->SetProfileBlockingErrorMessage(); - ProfilePicker::ShowDialogAndDisplayErrorMessage( - web_ui()->GetWebContents()->GetBrowserContext()); - } else { - // Fresh sign in via profile picker without existing email address. - ProfilePickerForceSigninDialog::ShowForceSigninDialog( - web_ui()->GetWebContents()->GetBrowserContext(), *profile_path); - } + // If a browser window cannot be opened for profile, load the profile to + // display a dialog. + if (entry->IsSigninRequired() +#if BUILDFLAG(IS_CHROMEOS_LACROS) + || (!profiles::AreSecondaryProfilesAllowed() && + !Profile::IsMainProfilePath(*profile_path)) +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + ) { + g_browser_process->profile_manager()->LoadProfileByPath( + *profile_path, /*incognito=*/false, + base::BindOnce(&ProfilePickerHandler::OnProfileForDialogLoaded, + weak_factory_.GetWeakPtr())); return; } -#if BUILDFLAG(IS_CHROMEOS_LACROS) - if (!profiles::AreSecondaryProfilesAllowed()) { - if (!Profile::IsMainProfilePath(*profile_path)) { - LoginUIServiceFactory::GetForProfile( - Profile::FromWebUI(web_ui())->GetOriginalProfile()) - ->SetProfileBlockingErrorMessage(); - ProfilePicker::ShowDialogAndDisplayErrorMessage( - web_ui()->GetWebContents()->GetBrowserContext()); - return; - } - } -#endif // BUILDFLAG(IS_CHROMEOS_LACROS) - if (!creation_time_on_startup_.is_null() && // Avoid overriding the picked time if already recorded. This can happen // for example if multiple profiles are picked: https://crbug.com/1277466. @@ -572,6 +548,43 @@ weak_factory_.GetWeakPtr(), false, open_settings)); } +void ProfilePickerHandler::OnProfileForDialogLoaded(Profile* profile) { + if (!profile) + return; + ProfileAttributesEntry* entry = + g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(profile->GetPath()); + DCHECK(entry); + if (entry->IsSigninRequired()) { + DCHECK(signin_util::IsForceSigninEnabled()); + if (entry->CanBeManaged()) { + ProfilePickerForceSigninDialog::ShowReauthDialog( + profile, base::UTF16ToUTF8(entry->GetUserName())); + } else if (entry->GetActiveTime() != base::Time()) { + // If force-sign-in is enabled, do not allow users to sign in to a + // pre-existing locked profile, as this may force unexpected profile data + // merge. We consider a profile as pre-existing if it has been active + // previously. A pre-existed profile can still be used if it has been + // signed in with an email address matched RestrictSigninToPattern policy + // already. + LoginUIServiceFactory::GetForProfile(profile) + ->SetProfileBlockingErrorMessage(); + ProfilePicker::ShowDialogAndDisplayErrorMessage(profile); + } else { + // Fresh sign in via profile picker without existing email address. + ProfilePickerForceSigninDialog::ShowForceSigninDialog(profile); + } +#if BUILDFLAG(IS_CHROMEOS_LACROS) + } else if (!profiles::AreSecondaryProfilesAllowed() && + !Profile::IsMainProfilePath(profile->GetPath())) { + LoginUIServiceFactory::GetForProfile(profile) + ->SetProfileBlockingErrorMessage(); + ProfilePicker::ShowDialogAndDisplayErrorMessage(profile); +#endif // BUILDFLAG(IS_CHROMEOS_LACROS) + } +} + void ProfilePickerHandler::HandleLaunchGuestProfile( const base::Value::List& args) { // TODO(crbug.com/1063856): Add check |IsGuestModeEnabled| once policy
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.h b/chrome/browser/ui/webui/signin/profile_picker_handler.h index c5f705c..ae7cf58 100644 --- a/chrome/browser/ui/webui/signin/profile_picker_handler.h +++ b/chrome/browser/ui/webui/signin/profile_picker_handler.h
@@ -148,6 +148,10 @@ // the picker when it was first shown. void SetProfilesOrder(const std::vector<ProfileAttributesEntry*>& entries); + // Displays either a sign-in or an error dialog within the profile picker + // using `profile`. + void OnProfileForDialogLoaded(Profile* profile); + #if BUILDFLAG(IS_CHROMEOS_LACROS) // Opens the Ash account settings page in a new window. void HandleOpenAshAccountSettingsPage(const base::Value::List& args);
diff --git a/chrome/browser/ui/webui/signin/signin_error_handler.cc b/chrome/browser/ui/webui/signin/signin_error_handler.cc index 07043ea..0356a43 100644 --- a/chrome/browser/ui/webui/signin/signin_error_handler.cc +++ b/chrome/browser/ui/webui/signin/signin_error_handler.cc
@@ -15,11 +15,12 @@ #include "content/public/browser/web_ui.h" #include "url/gurl.h" -SigninErrorHandler::SigninErrorHandler(Browser* browser, bool is_system_profile) - : browser_(browser), is_system_profile_(is_system_profile) { +SigninErrorHandler::SigninErrorHandler(Browser* browser, + bool from_profile_picker) + : browser_(browser), from_profile_picker_(from_profile_picker) { // |browser_| must not be null when this dialog is presented from the // profile picker. - DCHECK(browser_ || is_system_profile_); + DCHECK(browser_ || from_profile_picker_); BrowserList::AddObserver(this); } @@ -40,7 +41,7 @@ "switchToExistingProfile", base::BindRepeating(&SigninErrorHandler::HandleSwitchToExistingProfile, base::Unretained(this))); - if (!is_system_profile_) { + if (!from_profile_picker_) { web_ui()->RegisterMessageCallback( "learnMore", base::BindRepeating(&SigninErrorHandler::HandleLearnMore, base::Unretained(this))); @@ -73,8 +74,8 @@ } void SigninErrorHandler::HandleLearnMore(const base::Value::List& args) { - // "Learn more" only shown when is_system_profile_=false - DCHECK(!is_system_profile_); + // "Learn more" only shown when from_profile_picker_=false + DCHECK(!from_profile_picker_); if (!browser_) return; CloseDialog(); @@ -91,9 +92,9 @@ } void SigninErrorHandler::CloseDialog() { - if (is_system_profile_) { - CloseProfilePickerForceSigninDialog(); - } else if (browser_){ + if (from_profile_picker_) { + CloseProfilePickerDialog(); + } else if (browser_) { CloseBrowserModalSigninDialog(); } } @@ -102,6 +103,6 @@ browser_->signin_view_controller()->CloseModalSignin(); } -void SigninErrorHandler::CloseProfilePickerForceSigninDialog() { - ProfilePickerForceSigninDialog::HideDialog(); +void SigninErrorHandler::CloseProfilePickerDialog() { + ProfilePicker::HideDialog(); }
diff --git a/chrome/browser/ui/webui/signin/signin_error_handler.h b/chrome/browser/ui/webui/signin/signin_error_handler.h index e0625f8..08d5a7f 100644 --- a/chrome/browser/ui/webui/signin/signin_error_handler.h +++ b/chrome/browser/ui/webui/signin/signin_error_handler.h
@@ -16,11 +16,11 @@ public: // Constructor of a message handler that handles messages from the // sign-in error WebUI. - // If |is_system_profile| is true, then the sign-in error dialog was + // If |from_profile_picker| is true, then the sign-in error dialog was // presented from the user manager and |browser| is null. Otherwise, the // sign-in error dialog was presented on a browser window and |browser| must // not be null. - SigninErrorHandler(Browser* browser, bool is_system_profile); + SigninErrorHandler(Browser* browser, bool from_profile_picker); SigninErrorHandler(const SigninErrorHandler&) = delete; SigninErrorHandler& operator=(const SigninErrorHandler&) = delete; @@ -73,7 +73,7 @@ // Closes the profile picker profile dialog. // // Virtual, so that it can be overridden from unit tests. - virtual void CloseProfilePickerForceSigninDialog(); + virtual void CloseProfilePickerDialog(); private: // Weak reference to the browser that showed the sign-in error dialog. @@ -82,7 +82,7 @@ raw_ptr<Browser> browser_; // True when this sign-in error dialog is presented from the user manager. - bool is_system_profile_; + const bool from_profile_picker_; base::FilePath duplicate_profile_path_; };
diff --git a/chrome/browser/ui/webui/signin/signin_error_handler_unittest.cc b/chrome/browser/ui/webui/signin/signin_error_handler_unittest.cc index a46b193..c8986e4 100644 --- a/chrome/browser/ui/webui/signin/signin_error_handler_unittest.cc +++ b/chrome/browser/ui/webui/signin/signin_error_handler_unittest.cc
@@ -28,7 +28,7 @@ content::WebUI* web_ui) : SigninErrorHandler(browser, is_system_profile), browser_modal_dialog_did_close_(false), - profile_picker_force_signin_dialog_did_close_(false) { + profile_picker_dialog_did_close_(false) { set_web_ui(web_ui); } @@ -41,9 +41,9 @@ SigninErrorHandler::CloseBrowserModalSigninDialog(); } - void CloseProfilePickerForceSigninDialog() override { - profile_picker_force_signin_dialog_did_close_ = true; - SigninErrorHandler::CloseProfilePickerForceSigninDialog(); + void CloseProfilePickerDialog() override { + profile_picker_dialog_did_close_ = true; + SigninErrorHandler::CloseProfilePickerDialog(); } using SigninErrorHandler::HandleSwitchToExistingProfile; @@ -55,13 +55,13 @@ return browser_modal_dialog_did_close_; } - bool profile_picker_force_signin_dialog_did_close() { - return profile_picker_force_signin_dialog_did_close_; + bool profile_picker_dialog_did_close() { + return profile_picker_dialog_did_close_; } private: bool browser_modal_dialog_did_close_; - bool profile_picker_force_signin_dialog_did_close_; + bool profile_picker_dialog_did_close_; }; class SigninErrorHandlerTest : public BrowserWithTestWindowTest { @@ -178,7 +178,7 @@ handler()->HandleConfirm(args); // Confirm simply closes the dialog. - EXPECT_TRUE(handler()->profile_picker_force_signin_dialog_did_close()); + EXPECT_TRUE(handler()->profile_picker_dialog_did_close()); } } // namespace
diff --git a/chrome/browser/ui/webui/signin/signin_error_ui.cc b/chrome/browser/ui/webui/signin/signin_error_ui.cc index 769a1b70..0c1ec1d4 100644 --- a/chrome/browser/ui/webui/signin/signin_error_ui.cc +++ b/chrome/browser/ui/webui/signin/signin_error_ui.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" #include "chrome/browser/ui/webui/signin/signin_error_handler.h" #include "chrome/browser/ui/webui/signin/signin_ui_error.h" +#include "chrome/browser/ui/webui/signin/signin_url_utils.h" #include "chrome/common/url_constants.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/signin_resources.h" @@ -39,36 +40,25 @@ SigninErrorUI::SigninErrorUI(content::WebUI* web_ui) : SigninWebDialogUI(web_ui) { - Profile* webui_profile = Profile::FromWebUI(web_ui); - if (webui_profile->IsSystemProfile()) { + const GURL& url = web_ui->GetWebContents()->GetVisibleURL(); + if (HasFromProfilePickerURLParameter(url)) { InitializeMessageHandlerForProfilePicker(); } } void SigninErrorUI::InitializeMessageHandlerWithBrowser(Browser* browser) { DCHECK(browser); - Initialize(browser, false /* is_system_profile */); + Initialize(browser, /*from_profile_picker=*/false); } void SigninErrorUI::InitializeMessageHandlerForProfilePicker() { - Initialize(nullptr, true /* is_system_profile */); + Initialize(nullptr, /*from_profile_picker=*/true); } -void SigninErrorUI::Initialize(Browser* browser, bool is_system_profile) { +void SigninErrorUI::Initialize(Browser* browser, bool from_profile_picker) { Profile* webui_profile = Profile::FromWebUI(web_ui()); - Profile* signin_profile; std::unique_ptr<SigninErrorHandler> handler = - std::make_unique<SigninErrorHandler>(browser, is_system_profile); - - if (is_system_profile) { - signin_profile = g_browser_process->profile_manager()->GetProfileByPath( - ProfilePicker::GetForceSigninProfilePath()); - // Sign in is completed before profile creation. - if (!signin_profile) - signin_profile = webui_profile->GetOriginalProfile(); - } else { - signin_profile = webui_profile; - } + std::make_unique<SigninErrorHandler>(browser, from_profile_picker); content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUISigninErrorHost); @@ -85,11 +75,11 @@ {"signin_vars.css.js", IDR_SIGNIN_SIGNIN_VARS_CSS_JS}, }; source->AddResourcePaths(kResources); - source->AddBoolean("isSystemProfile", is_system_profile); + source->AddBoolean("fromProfilePicker", from_profile_picker); // Retrieve the last signin error message and email used. LoginUIService* login_ui_service = - LoginUIServiceFactory::GetForProfile(signin_profile); + LoginUIServiceFactory::GetForProfile(webui_profile); const SigninUIError last_login_error = login_ui_service->GetLastLoginError(); const bool is_profile_blocked = last_login_error.type() == SigninUIError::Type::kProfileIsBlocked; @@ -102,7 +92,7 @@ source->AddLocalizedString("signinErrorTitle", IDS_SIGNIN_ERROR_TITLE); } else { int title_string_id = - AccountConsistencyModeManager::IsDiceEnabledForProfile(signin_profile) + AccountConsistencyModeManager::IsDiceEnabledForProfile(webui_profile) ? IDS_SIGNIN_ERROR_DICE_EMAIL_TITLE : IDS_SIGNIN_ERROR_EMAIL_TITLE; source->AddString( @@ -138,7 +128,7 @@ source->AddLocalizedString("profileBlockedRemoveProfileSuggestion", IDS_OLD_PROFILES_DISABLED_REMOVED_OLD_PROFILE); - } else if (!is_system_profile && + } else if (!from_profile_picker && last_login_error.type() == SigninUIError::Type::kAccountAlreadyUsedByAnotherProfile) { ProfileAttributesEntry* entry =
diff --git a/chrome/browser/ui/webui/signin/signin_error_ui.h b/chrome/browser/ui/webui/signin/signin_error_ui.h index 9928e80..4338007 100644 --- a/chrome/browser/ui/webui/signin/signin_error_ui.h +++ b/chrome/browser/ui/webui/signin/signin_error_ui.h
@@ -25,7 +25,7 @@ private: void InitializeMessageHandlerForProfilePicker(); - void Initialize(Browser* browser, bool is_system_profile); + void Initialize(Browser* browser, bool from_profile_picker); }; #endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_ERROR_UI_H_
diff --git a/chrome/browser/ui/webui/signin/signin_url_utils.cc b/chrome/browser/ui/webui/signin/signin_url_utils.cc index 3f04bd48..1c837c73 100644 --- a/chrome/browser/ui/webui/signin/signin_url_utils.cc +++ b/chrome/browser/ui/webui/signin/signin_url_utils.cc
@@ -21,6 +21,9 @@ // Query parameter names of the reauth confirmation URL. const char kAccessPointParamKey[] = "access_point"; +// URL tag to specify that the source is the ProfilePicker. +const char kFromProfilePickerParamKey[] = "from_profile_picker"; + } // namespace SyncConfirmationStyle GetSyncConfirmationStyle(const GURL& url) { @@ -88,3 +91,15 @@ return url_with_params; } #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS) + +bool HasFromProfilePickerURLParameter(const GURL& url) { + std::string from_profile_picker; + bool found = net::GetValueForKeyInQuery(url, kFromProfilePickerParamKey, + &from_profile_picker); + return found && from_profile_picker == "true"; +} + +GURL AddFromProfilePickerURLParameter(const GURL& url) { + return net::AppendOrReplaceQueryParameter(url, kFromProfilePickerParamKey, + "true"); +}
diff --git a/chrome/browser/ui/webui/signin/signin_url_utils.h b/chrome/browser/ui/webui/signin/signin_url_utils.h index 2b2ac1b5..644925df 100644 --- a/chrome/browser/ui/webui/signin/signin_url_utils.h +++ b/chrome/browser/ui/webui/signin/signin_url_utils.h
@@ -49,4 +49,9 @@ ProfileCustomizationStyle style); #endif // BUILDFLAG(ENABLE_DICE_SUPPORT) || BUILDFLAG(IS_CHROMEOS_LACROS) +// Checks if the |url| is coming from the ProfilePicker. +bool HasFromProfilePickerURLParameter(const GURL& url); +// Adds the ProfilePicker tag to the |url|. Returns the appended URL. +GURL AddFromProfilePickerURLParameter(const GURL& url); + #endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_SIGNIN_URL_UTILS_H_
diff --git a/chrome/browser/ui/webui/signin/signin_url_utils_unittest.cc b/chrome/browser/ui/webui/signin/signin_url_utils_unittest.cc index 0cec088..479b7ac4 100644 --- a/chrome/browser/ui/webui/signin/signin_url_utils_unittest.cc +++ b/chrome/browser/ui/webui/signin/signin_url_utils_unittest.cc
@@ -10,7 +10,6 @@ #include "components/signin/public/base/signin_metrics.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" TEST(SigninURLUtilsTest, ParseParameterlessSyncConfirmationURL) { @@ -19,6 +18,21 @@ GetSyncConfirmationStyle(url)); } +TEST(SigninURLUtilsTest, AddAndGetFromProfilePickerURLParam) { + // Create a basic url, e.g. chrome://signin-error/. + GURL url(chrome::kChromeUISigninErrorURL); + ASSERT_FALSE(HasFromProfilePickerURLParameter(url)); + + // Append the profile picker tag + url = AddFromProfilePickerURLParameter(url); + + // Checks that the raw url contains the tag. + EXPECT_TRUE(url.spec().find("from_profile_picker=true")); + EXPECT_TRUE(url.is_valid()); + // Test the getter function that checks the tag. + EXPECT_TRUE(HasFromProfilePickerURLParameter(url)); +} + TEST(SigninURLUtilsSyncConfirmationURLTest, GetAndParseURL) { // Modal version. GURL url = AppendSyncConfirmationQueryParams(
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory.cc index e1537c4..902434d 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory.cc
@@ -364,6 +364,9 @@ absl::visit( base::Overloaded{ [&](const IsolationData::InstalledBundle& content) { + DCHECK_EQ( + web_bundle_id->type(), + web_package::SignedWebBundleId::Type::kEd25519PublicKey); auto* isolated_web_app_reader_registry = IsolatedWebAppReaderRegistryFactory::GetForProfile( profile_); @@ -382,13 +385,20 @@ std::move(loader_receiver))); }, [&](const IsolationData::DevModeBundle& content) { - // TODO: Implement dev mode bundles. - CompleteWithGeneratedHtmlResponse( - mojo::Remote<network::mojom::URLLoaderClient>( - std::move(loader_client)), - net::HTTP_NOT_FOUND, /*body=*/absl::nullopt); + DCHECK_EQ( + web_bundle_id->type(), + web_package::SignedWebBundleId::Type::kEd25519PublicKey); + // A Signed Web Bundle installed in dev mode is treated just + // like a properly installed Signed Web Bundle, with the only + // difference being that we implicitly trust its public + // key(s). + HandleSignedBundle( + content.path, *web_bundle_id, std::move(loader_receiver), + resource_request, std::move(loader_client)); }, [&](const IsolationData::DevModeProxy& content) { + DCHECK_EQ(web_bundle_id->type(), + web_package::SignedWebBundleId::Type::kDevelopment); HandleDevModeProxy(*url_info, content, std::move(loader_receiver), resource_request, std::move(loader_client), @@ -436,6 +446,28 @@ } } +void IsolatedWebAppURLLoaderFactory::HandleSignedBundle( + const base::FilePath& path, + const web_package::SignedWebBundleId& web_bundle_id, + mojo::PendingReceiver<network::mojom::URLLoader> loader_receiver, + const network::ResourceRequest& resource_request, + mojo::PendingRemote<network::mojom::URLLoaderClient> loader_client) { + auto* isolated_web_app_reader_registry = + IsolatedWebAppReaderRegistryFactory::GetForProfile(profile_); + if (!isolated_web_app_reader_registry) { + LogErrorAndFail("Support for Isolated Web Apps is not enabled.", + std::move(loader_client)); + return; + } + + auto loader = std::make_unique<IsolatedWebAppURLLoader>( + isolated_web_app_reader_registry, path, web_bundle_id, + std::move(loader_client), resource_request, frame_tree_node_id_); + mojo::MakeSelfOwnedReceiver(std::move(std::move(loader)), + mojo::PendingReceiver<network::mojom::URLLoader>( + std::move(loader_receiver))); +} + void IsolatedWebAppURLLoaderFactory::HandleDevModeProxy( const IsolatedWebAppUrlInfo& url_info, const IsolationData::DevModeProxy& dev_mode_proxy,
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory.h b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory.h index 051f3c8a..c7b220e 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory.h +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/files/file_path.h" #include "base/memory/raw_ptr.h" #include "base/scoped_observation.h" #include "chrome/browser/profiles/profile.h" @@ -30,6 +31,10 @@ struct ResourceRequest; } +namespace web_package { +class SignedWebBundleId; +} + namespace web_app { class IsolatedWebAppUrlInfo; @@ -59,6 +64,13 @@ Profile* profile, mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver); + void HandleSignedBundle( + const base::FilePath& path, + const web_package::SignedWebBundleId& web_bundle_id, + mojo::PendingReceiver<network::mojom::URLLoader> loader_receiver, + const network::ResourceRequest& resource_request, + mojo::PendingRemote<network::mojom::URLLoaderClient> loader_client); + void HandleDevModeProxy( const IsolatedWebAppUrlInfo& url_info, const IsolationData::DevModeProxy& dev_mode_proxy,
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory_browsertest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory_browsertest.cc index 39837755..18ff67b 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory_browsertest.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory_browsertest.cc
@@ -161,7 +161,7 @@ } const std::string kWebBundleId = - "aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaac"; + "aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic"; const std::string kPrimaryUrl = "isolated-app://" + kWebBundleId; bool enable_isolated_web_apps_feature_; @@ -272,7 +272,7 @@ GURL(kPrimaryUrl + "/non-existing"), "Failed to read response from Signed Web Bundle: The Web Bundle does not " "contain a response for the provided URL: " - "isolated-app://aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaac/" + "isolated-app://aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic/" "non-existing"); } @@ -313,15 +313,15 @@ "characters long, but was 3 characters long."), std::make_pair( GURL("isolated-app://" - "9erugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaac"), + "9erugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic"), "The host of isolated-app:// URLs must be a valid Signed Web " "Bundle ID (got " - "9erugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaac): The " + "9erugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic): The " "signed web bundle ID must only contain lowercase ASCII characters " "and digits between 2 and 7 (without any padding)."), std::make_pair( GURL("isolated-app://" - "aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaac"), + "aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic"), "Failed to read response from Signed Web Bundle: Failed to parse " "integrity block: FILE_ERROR_NOT_FOUND")));
diff --git a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory_unittest.cc b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory_unittest.cc index 702a62d..c1ca9372 100644 --- a/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory_unittest.cc +++ b/chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_loader_factory_unittest.cc
@@ -233,10 +233,10 @@ std::string ResponseBody() { return response_body_; } - const std::string kWebBundleId = + const std::string kDevWebBundleId = "aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaac"; - const GURL kAppOriginUrl = GURL("isolated-app://" + kWebBundleId); - const GURL kAppStartUrl = GURL(kAppOriginUrl.spec() + "/ix.html"); + const GURL kDevAppOriginUrl = GURL("isolated-app://" + kDevWebBundleId); + const GURL kDevAppStartUrl = GURL(kDevAppOriginUrl.spec() + "/ix.html"); const GURL kProxyUrl = GURL("https://proxy.example.com"); private: @@ -258,7 +258,7 @@ CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; EXPECT_THAT(CreateLoaderAndRun(std::move(request)), IsNetError(net::ERR_FAILED)); EXPECT_THAT(ResponseInfo(), IsNull()); @@ -266,17 +266,17 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, RequestFailsWithErrFailedIfInstalledAppNotIwa) { - RegisterWebApp(CreateWebApp(kAppStartUrl)); + RegisterWebApp(CreateWebApp(kDevAppStartUrl)); // Verify that a PWA is installed at kAppStartUrl's origin. absl::optional<AppId> installed_app = - provider()->registrar().FindInstalledAppWithUrlInScope(kAppStartUrl); + provider()->registrar().FindInstalledAppWithUrlInScope(kDevAppStartUrl); EXPECT_THAT(installed_app.has_value(), IsTrue()); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; EXPECT_THAT(CreateLoaderAndRun(std::move(request)), IsNetError(net::ERR_FAILED)); EXPECT_THAT(ResponseInfo(), IsNull()); @@ -285,27 +285,27 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, RequestFailsWithErrFailedIfAppNotLocallyInstalled) { std::unique_ptr<WebApp> iwa = CreateIsolatedWebApp( - kAppStartUrl, IsolationData{IsolationData::DevModeProxy{ - .proxy_url = kProxyUrl.spec()}}); + kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ + .proxy_url = kProxyUrl.spec()}}); iwa->SetIsLocallyInstalled(false); RegisterWebApp(std::move(iwa)); // Verify that a PWA is installed at kAppStartUrl's origin. absl::optional<AppId> installed_app = - provider()->registrar().FindAppWithUrlInScope(kAppStartUrl); + provider()->registrar().FindAppWithUrlInScope(kDevAppStartUrl); EXPECT_THAT(installed_app.has_value(), IsTrue()); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; EXPECT_THAT(CreateLoaderAndRun(std::move(request)), IsNetError(net::ERR_FAILED)); EXPECT_THAT(ResponseInfo(), IsNull()); } TEST_F(IsolatedWebAppURLLoaderFactoryTest, GetRequestsSucceed) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = kProxyUrl.spec()}})); @@ -313,14 +313,14 @@ auto request = std::make_unique<network::ResourceRequest>(); request->method = net::HttpRequestHeaders::kGetMethod; - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::OK)); } TEST_F(IsolatedWebAppURLLoaderFactoryTest, HeadRequestsSucceed) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = kProxyUrl.spec()}})); @@ -328,7 +328,7 @@ auto request = std::make_unique<network::ResourceRequest>(); request->method = net::HttpRequestHeaders::kHeadMethod; - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::OK)); @@ -336,7 +336,7 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, PostRequestsReturnMethodNotSupportedWhenAppIsInstalled) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = kProxyUrl.spec()}})); @@ -344,7 +344,7 @@ auto request = std::make_unique<network::ResourceRequest>(); request->method = net::HttpRequestHeaders::kPostMethod; - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::OK)); @@ -357,8 +357,9 @@ IsolatedWebAppURLLoaderFactoryTest, PostRequestsReturnMethodNotSupportedWhenAppIsInstalledAndThereIsPendingInstall) { RegisterWebApp(CreateIsolatedWebApp( - kAppStartUrl, IsolationData{IsolationData::DevModeProxy{ - .proxy_url = "http://installed-app-proxy-url.com"}})); + kDevAppStartUrl, + IsolationData{IsolationData::DevModeProxy{ + .proxy_url = "http://installed-app-proxy-url.com"}})); IsolatedWebAppPendingInstallInfo::FromWebContents(*web_contents()) .set_isolation_data(IsolationData{IsolationData::DevModeProxy{ @@ -369,7 +370,7 @@ auto request = std::make_unique<network::ResourceRequest>(); const char* kUnsupportedHttpMethod = net::HttpRequestHeaders::kPostMethod; request->method = kUnsupportedHttpMethod; - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::OK)); @@ -386,7 +387,7 @@ const char* kUnsupportedHttpMethod = net::HttpRequestHeaders::kPostMethod; request->method = kUnsupportedHttpMethod; - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::ERR_FAILED)); @@ -395,7 +396,7 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, RequestFailsWithErrFailedIfStoragePartitionDoesNotExist) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = kProxyUrl.spec()}}), /*create_storage_partition=*/false); @@ -403,7 +404,7 @@ CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::ERR_FAILED)); @@ -411,14 +412,14 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, RequestUsesNonDefaultStoragePartition) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = kProxyUrl.spec()}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; CreateLoaderAndRun(std::move(request)); EXPECT_THAT(profile()->GetStoragePartitionCount(), Eq(2UL)); @@ -426,13 +427,13 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, RequestFailsIfProxyUrlNotOrigin) { RegisterWebApp(CreateIsolatedWebApp( - kAppStartUrl, IsolationData{IsolationData::DevModeProxy{ - .proxy_url = "http://example.com/foo"}})); + kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ + .proxy_url = "http://example.com/foo"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::ERR_FAILED)); @@ -441,13 +442,13 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, RequestSucceedsIfProxyUrlHasTrailingSlash) { RegisterWebApp(CreateIsolatedWebApp( - kAppStartUrl, IsolationData{IsolationData::DevModeProxy{ - .proxy_url = "http://example.com/"}})); + kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ + .proxy_url = "http://example.com/"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::OK)); @@ -455,28 +456,28 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, RequestSucceedsIfProxyUrlDoesNotHaveTrailingSlash) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://example.com"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppStartUrl; + request->url = kDevAppStartUrl; int status = CreateLoaderAndRun(std::move(request)); EXPECT_THAT(status, IsNetError(net::OK)); } TEST_F(IsolatedWebAppURLLoaderFactoryTest, ProxyUrlDoesNotHaveUrlQuery) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://example.com"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL("isolated-app://" + kWebBundleId + + request->url = GURL("isolated-app://" + kDevWebBundleId + "?testingQueryToRemove=testValue"); CreateLoaderAndRun(std::move(request)); @@ -484,7 +485,7 @@ } TEST_F(IsolatedWebAppURLLoaderFactoryTest, ProxyUrlDoesNotHaveUrlFragment) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://example.com"}})); @@ -492,21 +493,21 @@ auto request = std::make_unique<network::ResourceRequest>(); request->url = - GURL("isolated-app://" + kWebBundleId + "#testFragmentToremove"); + GURL("isolated-app://" + kDevWebBundleId + "#testFragmentToremove"); CreateLoaderAndRun(std::move(request)); EXPECT_THAT(url_handler().intercepted_url(), Eq(GURL("http://example.com/"))); } TEST_F(IsolatedWebAppURLLoaderFactoryTest, ProxyUrlKeepsOriginUrlPath) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://example.com"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL("isolated-app://" + kWebBundleId + "/foo/bar.html"); + request->url = GURL("isolated-app://" + kDevWebBundleId + "/foo/bar.html"); CreateLoaderAndRun(std::move(request)); EXPECT_THAT(url_handler().intercepted_url(), @@ -514,14 +515,14 @@ } TEST_F(IsolatedWebAppURLLoaderFactoryTest, ProxyUrlRemovesOriginalRequestData) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://example.com"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL("isolated-app://" + kWebBundleId + "/foo/bar.html"); + request->url = GURL("isolated-app://" + kDevWebBundleId + "/foo/bar.html"); CreateLoaderAndRun(std::move(request)); ASSERT_THAT(url_handler().intercepted_url(), @@ -533,14 +534,14 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, DoNotReturnGeneratedPageWhenNotInstallingApplication) { - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://example.com"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL("isolated-app://" + kWebBundleId + + request->url = GURL("isolated-app://" + kDevWebBundleId + "/.well-known/_generated_install_page.html"); int status = CreateLoaderAndRun(std::move(request)); @@ -557,14 +558,14 @@ .set_isolation_data(IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://some-proxy-url.com"}}); - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://example.com"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL("isolated-app://" + kWebBundleId + + request->url = GURL("isolated-app://" + kDevWebBundleId + "/.well-known/_generated_install_page.html"); int status = CreateLoaderAndRun(std::move(request)); @@ -582,14 +583,14 @@ .set_isolation_data(IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://some-proxy-url.com"}}); - RegisterWebApp(CreateIsolatedWebApp(kAppStartUrl, + RegisterWebApp(CreateIsolatedWebApp(kDevAppStartUrl, IsolationData{IsolationData::DevModeProxy{ .proxy_url = "http://example.com"}})); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL("isolated-app://" + kWebBundleId + + request->url = GURL("isolated-app://" + kDevWebBundleId + "/some-resource-for-testing.html"); int status = CreateLoaderAndRun(std::move(request)); @@ -602,7 +603,7 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, RequestsRedirectedToPendingInstallIsolationDataWhenAppIsNotInstalled) { - CreateStoragePartitionForUrl(GURL("isolated-app://" + kWebBundleId)); + CreateStoragePartitionForUrl(GURL("isolated-app://" + kDevWebBundleId)); IsolatedWebAppPendingInstallInfo::FromWebContents(*web_contents()) .set_isolation_data(IsolationData{IsolationData::DevModeProxy{ @@ -611,7 +612,7 @@ CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL("isolated-app://" + kWebBundleId + + request->url = GURL("isolated-app://" + kDevWebBundleId + "/some-resource-for-testing.html"); int status = CreateLoaderAndRun(std::move(request)); @@ -624,12 +625,12 @@ TEST_F(IsolatedWebAppURLLoaderFactoryTest, GeneratedInstallPageIsNotReturnedForNonInstallingApp) { - RegisterWebApp(CreateWebApp(kAppStartUrl)); + RegisterWebApp(CreateWebApp(kDevAppStartUrl)); CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL("isolated-app://" + kWebBundleId + + request->url = GURL("isolated-app://" + kDevWebBundleId + "/.well-known/_generated_install_page.html"); int status = CreateLoaderAndRun(std::move(request)); @@ -638,48 +639,53 @@ EXPECT_THAT(ResponseInfo(), IsNull()); } -class IsolatedWebAppURLLoaderFactoryInstalledBundleTest - : public IsolatedWebAppURLLoaderFactoryTest { +class IsolatedWebAppURLLoaderFactorySignedWebBundleTest + : public IsolatedWebAppURLLoaderFactoryTest, + public ::testing::WithParamInterface</*is_dev_mode=*/bool> { public: - explicit IsolatedWebAppURLLoaderFactoryInstalledBundleTest( + explicit IsolatedWebAppURLLoaderFactorySignedWebBundleTest( bool enable_isolated_web_apps_feature_flag = true) : IsolatedWebAppURLLoaderFactoryTest( enable_isolated_web_apps_feature_flag) {} protected: void SetUp() override { + bool is_dev_mode = GetParam(); + IsolatedWebAppURLLoaderFactoryTest::SetUp(); EXPECT_THAT(temp_dir_.CreateUniqueTempDir(), IsTrue()); auto bundle_path = CreateSignedBundleAndWriteToDisk(); std::unique_ptr<WebApp> iwa = CreateIsolatedWebApp( - kAppOriginUrl, - IsolationData{IsolationData::InstalledBundle{.path = bundle_path}}); + kEd25519AppOriginUrl, + is_dev_mode + ? IsolationData{IsolationData::DevModeBundle{.path = bundle_path}} + : IsolationData{ + IsolationData::InstalledBundle{.path = bundle_path}}); RegisterWebApp(std::move(iwa)); } base::FilePath CreateSignedBundleAndWriteToDisk() { web_package::WebBundleBuilder builder; - builder.AddPrimaryURL(kAppOriginUrl.spec()); - builder.AddExchange(kAppOriginUrl.spec(), + builder.AddPrimaryURL(kEd25519AppOriginUrl.spec()); + builder.AddExchange(kEd25519AppOriginUrl.spec(), {{":status", "200"}, {"content-type", "text/html"}}, "Hello World"); - builder.AddExchange(kAppOriginUrl.spec() + "/invalid-status-code", + builder.AddExchange(kEd25519AppOriginUrl.spec() + "/invalid-status-code", {{":status", "201"}, {"content-type", "text/html"}}, "Hello World"); web_package::WebBundleSigner::KeyPair key_pair(kTestPublicKey, kTestPrivateKey); - return SignAndWriteBundleToDisk(builder.CreateBundle(), profile(), key_pair, - kWebBundleId); + return SignAndWriteBundleToDisk(builder.CreateBundle(), profile(), + key_pair); } base::FilePath SignAndWriteBundleToDisk( const std::vector<uint8_t>& unsigned_bundle, Profile* profile, - web_package::WebBundleSigner::KeyPair key_pair, - const std::string web_bundle_id) { + web_package::WebBundleSigner::KeyPair key_pair) { auto signed_bundle = web_package::WebBundleSigner::SignBundle(unsigned_bundle, {key_pair}); @@ -695,37 +701,42 @@ return web_bundle_path; } + const std::string kEd25519WebBundleId = + "aerugqztij5biqquuk3mfwpsaibuegaqcitgfchwuosuofdjabzqaaic"; + const GURL kEd25519AppOriginUrl = + GURL("isolated-app://" + kEd25519WebBundleId); + base::ScopedTempDir temp_dir_; }; -TEST_F(IsolatedWebAppURLLoaderFactoryInstalledBundleTest, RequestIndex) { +TEST_P(IsolatedWebAppURLLoaderFactorySignedWebBundleTest, RequestIndex) { CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppOriginUrl; + request->url = kEd25519AppOriginUrl; EXPECT_THAT(CreateLoaderAndRun(std::move(request)), Eq(net::OK)); ASSERT_THAT(ResponseInfo(), NotNull()); EXPECT_THAT(ResponseInfo()->headers->response_code(), Eq(200)); EXPECT_THAT(ResponseBody(), Eq("Hello World")); } -TEST_F(IsolatedWebAppURLLoaderFactoryInstalledBundleTest, +TEST_P(IsolatedWebAppURLLoaderFactorySignedWebBundleTest, RequestResourceWithNon200StatusCode) { CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL(kAppOriginUrl.spec() + "/invalid-status-code"); + request->url = GURL(kEd25519AppOriginUrl.spec() + "/invalid-status-code"); EXPECT_THAT(CreateLoaderAndRun(std::move(request)), Eq(net::ERR_INVALID_WEB_BUNDLE)); EXPECT_THAT(ResponseInfo(), IsNull()); } -TEST_F(IsolatedWebAppURLLoaderFactoryInstalledBundleTest, +TEST_P(IsolatedWebAppURLLoaderFactorySignedWebBundleTest, RequestNonExistingResource) { CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL(kAppOriginUrl.spec() + "/non-existing"); + request->url = GURL(kEd25519AppOriginUrl.spec() + "/non-existing"); EXPECT_EQ(CreateLoaderAndRun(std::move(request)), net::OK); ASSERT_THAT(ResponseInfo(), NotNull()); EXPECT_THAT(ResponseInfo()->headers->response_code(), @@ -733,12 +744,12 @@ EXPECT_THAT(ResponseBody(), Eq("")); } -TEST_F(IsolatedWebAppURLLoaderFactoryInstalledBundleTest, +TEST_P(IsolatedWebAppURLLoaderFactorySignedWebBundleTest, SuccessfulRequestHasCorrectLengthFields) { CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppOriginUrl; + request->url = kEd25519AppOriginUrl; EXPECT_THAT(CreateLoaderAndRun(std::move(request)), Eq(net::OK)); ASSERT_THAT(ResponseInfo(), NotNull()); EXPECT_THAT(ResponseInfo()->headers->response_code(), Eq(200)); @@ -752,12 +763,12 @@ EXPECT_THAT(CompletionStatus().decoded_body_length, Eq(body_length)); } -TEST_F(IsolatedWebAppURLLoaderFactoryInstalledBundleTest, +TEST_P(IsolatedWebAppURLLoaderFactorySignedWebBundleTest, NonExistingRequestHasCorrectLengthFields) { CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = GURL(kAppOriginUrl.spec() + "/non-existing"); + request->url = GURL(kEd25519AppOriginUrl.spec() + "/non-existing"); EXPECT_THAT(CreateLoaderAndRun(std::move(request)), Eq(net::OK)); ASSERT_THAT(ResponseInfo(), NotNull()); EXPECT_THAT(ResponseInfo()->headers->response_code(), @@ -772,21 +783,37 @@ EXPECT_THAT(CompletionStatus().decoded_body_length, Eq(body_length)); } +INSTANTIATE_TEST_SUITE_P(All, + IsolatedWebAppURLLoaderFactorySignedWebBundleTest, + ::testing::Bool(), + [](::testing::TestParamInfo<bool> is_dev_mode) { + return is_dev_mode.param ? "DevModeBundle" + : "InstalledBundle"; + }); + class IsolatedWebAppURLLoaderFactoryFeatureFlagDisabledTest - : public IsolatedWebAppURLLoaderFactoryInstalledBundleTest { + : public IsolatedWebAppURLLoaderFactorySignedWebBundleTest { public: IsolatedWebAppURLLoaderFactoryFeatureFlagDisabledTest() - : IsolatedWebAppURLLoaderFactoryInstalledBundleTest(false) {} + : IsolatedWebAppURLLoaderFactorySignedWebBundleTest(false) {} }; -TEST_F(IsolatedWebAppURLLoaderFactoryFeatureFlagDisabledTest, +TEST_P(IsolatedWebAppURLLoaderFactoryFeatureFlagDisabledTest, RequestFailsWhenFeatureIsDisabled) { CreateFactory(); auto request = std::make_unique<network::ResourceRequest>(); - request->url = kAppOriginUrl; + request->url = kEd25519AppOriginUrl; EXPECT_THAT(CreateLoaderAndRun(std::move(request)), Eq(net::ERR_FAILED)); EXPECT_THAT(ResponseInfo(), IsNull()); } +INSTANTIATE_TEST_SUITE_P(All, + IsolatedWebAppURLLoaderFactoryFeatureFlagDisabledTest, + ::testing::Bool(), + [](::testing::TestParamInfo<bool> is_dev_mode) { + return is_dev_mode.param ? "DevModeBundle" + : "InstalledBundle"; + }); + } // namespace web_app
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index afdda37..06a0653f2 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1665964672-5ada099d1df399e3cba7d15401ebe3e89bf59399.profdata +chrome-linux-main-1666007719-b3086f429daf2747751dfa6a3852e72c79c2ae43.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index bedd2fe9b..8b3b6f5 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1665964672-6bbc755a6927ec5beec784029ba4396e462dae47.profdata +chrome-mac-arm-main-1665985864-937c3c86d92922a94271c72d52176bdd881cefb5.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 6cbf552..48be8ca4 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1665964672-44132dd7c1ad336f92449cd289b1dcc9e4332cde.profdata +chrome-mac-main-1666007719-013b80cf06e6ab1b864dc17865e3165dfc3052e1.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index e1b5c1a..82cac0b 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1665975486-eb9d7cf4950f33f26e0dee588968eb99d38c6e62.profdata +chrome-win32-main-1665997179-09e6e266b6d017e2de27fc6a235d326d9ad73de3.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 00dfcd3..ef68b8f7 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1665975486-67af6eec01bbfe56c56485d7e1c6f4a093751bbe.profdata +chrome-win64-main-1666007719-286f3fd308ca497ffb907c02f66a1c5640356c65.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index fd48499..3343cb49 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4092,9 +4092,9 @@ "../browser/ui/webui/settings/ash/device_power_handler_browsertest.cc", "../browser/ui/webui/settings/ash/os_settings_lock_screen_authentication_browsertest.cc", "../browser/ui/webui/settings/ash/os_settings_recovery_browsertest.cc", - "../browser/ui/webui/signin/inline_login_dialog_chromeos_browsertest.cc", - "../browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc", - "../browser/ui/webui/signin/signin_helper_chromeos_browsertest.cc", + "../browser/ui/webui/signin/ash/inline_login_dialog_chromeos_browsertest.cc", + "../browser/ui/webui/signin/ash/inline_login_handler_chromeos_browsertest.cc", + "../browser/ui/webui/signin/ash/signin_helper_chromeos_browsertest.cc", "../browser/ui/window_sizer/window_sizer_chromeos_uitest.cc", "../browser/web_applications/app_service/web_app_publisher_helper_browsertest.cc", "../browser/web_applications/app_service/web_apps_browsertest.cc", @@ -7471,7 +7471,7 @@ "../browser/ui/webui/chromeos/login/fake_update_required_screen_handler.h", "../browser/ui/webui/chromeos/sync/os_sync_handler_unittest.cc", "../browser/ui/webui/help/version_updater_chromeos_unittest.cc", - "../browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos_unittest.cc", + "../browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos_unittest.cc", "../browser/ui/window_sizer/window_sizer_chromeos_unittest.cc", "../browser/upgrade_detector/installed_version_updater_chromeos_unittest.cc", "../browser/upgrade_detector/upgrade_detector_chromeos_unittest.cc", @@ -7883,6 +7883,7 @@ "../browser/extensions/api/socket/tls_socket_unittest.cc", "../browser/extensions/api/socket/udp_socket_unittest.cc", "../browser/extensions/api/sockets_tcp_server/sockets_tcp_server_api_unittest.cc", + "../browser/extensions/api/storage/managed_value_store_cache_unittest.cc", "../browser/extensions/api/storage/policy_value_store_unittest.cc", "../browser/extensions/api/storage/settings_sync_unittest.cc", "../browser/extensions/api/storage/storage_session_unittest.cc", @@ -8130,6 +8131,7 @@ "//components/safe_browsing:buildflags", "//components/services/storage/privileged/mojom", "//components/services/unzip:in_process", + "//components/value_store", "//components/value_store:test_support", "//extensions:extensions_resources", "//extensions/browser:test_support",
diff --git a/chrome/test/chromedriver/chrome/devtools_client.h b/chrome/test/chromedriver/chrome/devtools_client.h index df556201..2b2b397 100644 --- a/chrome/test/chromedriver/chrome/devtools_client.h +++ b/chrome/test/chromedriver/chrome/devtools_client.h
@@ -33,7 +33,13 @@ virtual const std::string& TunnelSessionId() const = 0; // Set the session id used for CDP traffic tunneling - virtual void SetTunnelSessionId(const std::string& session_id) = 0; + virtual Status SetTunnelSessionId(std::string session_id) = 0; + + // Start a BiDi Server in the connected target + // Precondition: IsMainPage() + // Precondition: IsConnected() + // Precondition: BiDi tunnel for CDP traffic is not set. + virtual Status StartBidiServer(std::string bidi_mapper_script) = 0; virtual bool WasCrashed() = 0;
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.cc b/chrome/test/chromedriver/chrome/devtools_client_impl.cc index 21a90289..ebe0a50a 100644 --- a/chrome/test/chromedriver/chrome/devtools_client_impl.cc +++ b/chrome/test/chromedriver/chrome/devtools_client_impl.cc
@@ -27,6 +27,7 @@ #include "chrome/test/chromedriver/chrome/web_view_impl.h" #include "chrome/test/chromedriver/net/command_id.h" #include "chrome/test/chromedriver/net/sync_websocket.h" +#include "chrome/test/chromedriver/net/timeout.h" #include "chrome/test/chromedriver/net/url_request_context_getter.h" namespace { @@ -59,7 +60,7 @@ } private: - raw_ptr<int> count_; + raw_ptr<int> count_ = nullptr; }; Status ConditionIsMet(bool* is_condition_met) { @@ -204,19 +205,10 @@ const SyncWebSocketFactory& factory) : socket_(factory.Run()), url_(url), - owner_(nullptr), session_id_(session_id), - parent_(nullptr), - crashed_(false), - detached_(false), id_(id), frontend_closer_func_(base::BindRepeating(&FakeCloseFrontends)), - parser_func_(base::BindRepeating(&internal::ParseInspectorMessage)), - unnotified_event_(nullptr), - next_id_(1), - stack_count_(0), - is_remote_end_configured_(false), - is_main_page_(false) { + parser_func_(base::BindRepeating(&internal::ParseInspectorMessage)) { socket_->SetId(id_); // If error happens during proactive event consumption we ignore it // as there is no active user request where the error might be returned. @@ -229,19 +221,10 @@ DevToolsClientImpl::DevToolsClientImpl(const std::string& id, const std::string& session_id) - : owner_(nullptr), - session_id_(session_id), - parent_(nullptr), - crashed_(false), - detached_(false), + : session_id_(session_id), id_(id), frontend_closer_func_(base::BindRepeating(&FakeCloseFrontends)), - parser_func_(base::BindRepeating(&internal::ParseInspectorMessage)), - unnotified_event_(nullptr), - next_id_(1), - stack_count_(0), - is_remote_end_configured_(false), - is_main_page_(false) {} + parser_func_(base::BindRepeating(&internal::ParseInspectorMessage)) {} DevToolsClientImpl::~DevToolsClientImpl() { if (IsNull()) { @@ -279,8 +262,122 @@ return tunnel_session_id_; } -void DevToolsClientImpl::SetTunnelSessionId(const std::string& session_id) { - tunnel_session_id_ = session_id; +Status DevToolsClientImpl::SetTunnelSessionId(std::string session_id) { + if (!tunnel_session_id_.empty()) { + return Status{kUnknownError, + "BiDi tunnel is already set up in this client"}; + } + tunnel_session_id_ = std::move(session_id); + return Status{kOk}; +} + +Status DevToolsClientImpl::StartBidiServer(std::string bidi_mapper_script) { + // Give BiDiMapper generous amount of time to start. + // If the wait times out then we likely have a bug in BiDiMapper. + // There is no need to make this timeout user configurable. + // We use the default page load timeout (the biggest in the standard). + Timeout timeout = Timeout(base::Seconds(300)); + return StartBidiServer(std::move(bidi_mapper_script), timeout); +} + +Status DevToolsClientImpl::StartBidiServer(std::string bidi_mapper_script, + const Timeout& timeout) { + if (!is_main_page_) { + // Later we might want to start the BiDiMapper an another type of targets + // however for the moment being we support pages only. + return Status{kUnknownError, + "BiDi server can only be started by a page client"}; + } + if (!IsConnected()) { + return Status{kUnknownError, + "BiDi server setup requires existing connection"}; + } + if (!tunnel_session_id_.empty()) { + return Status{kUnknownError, + "BiDi tunnel is already set up in this client"}; + } + Status status{kOk}; + // Page clients have target_id coinciding with id + std::string target_id = id_; + { + base::Value::Dict params; + params.Set("bindingName", "cdp"); + params.Set("targetId", target_id); + status = GetRootClient()->SendCommandAndIgnoreResponse( + "Target.exposeDevToolsProtocol", std::move(params)); + if (status.IsError()) { + return status; + } + } + { + base::Value::Dict params; + params.Set("name", "sendBidiResponse"); + status = + SendCommandAndIgnoreResponse("Runtime.addBinding", std::move(params)); + if (status.IsError()) { + return status; + } + } + { + base::Value::Dict params; + params.Set("expression", std::move(bidi_mapper_script)); + status = + SendCommandAndIgnoreResponse("Runtime.evaluate", std::move(params)); + if (status.IsError()) { + return status; + } + } + { + std::unique_ptr<base::Value> result; + base::Value::Dict params; + std::string window_id; + status = SerializeAsJson(target_id, &window_id); + if (status.IsError()) { + return status; + } + params.Set("expression", "window.setSelfTargetId(" + window_id + ")"); + status = + SendCommandAndIgnoreResponse("Runtime.evaluate", std::move(params)); + if (status.IsError()) { + return status; + } + } + { + base::RepeatingCallback<Status(bool*)> bidi_mapper_is_launched = + base::BindRepeating( + [](bool* is_launched, bool* condition_is_met) { + *condition_is_met = *is_launched; + return Status{kOk}; + }, + base::Unretained(&bidi_server_is_launched_)); + status = HandleEventsUntil(bidi_mapper_is_launched, timeout); + if (status.IsError()) { + return status; + } + } + + // We know that the current DevToolsClient is a CDP tunnel now + tunnel_session_id_ = session_id_; + + if (event_tunneling_is_enabled_) { + base::Value::Dict params; + params.Set("events", "cdp.eventReceived"); + base::Value::Dict bidi_cmd; + bidi_cmd.Set("id", AdvanceNextMessageId()); + bidi_cmd.Set("method", "session.subscribe"); + bidi_cmd.Set("params", std::move(params)); + status = PostBidiCommandInternal(DevToolsClientImpl::kInfraChannel, + std::move(bidi_cmd)); + } + + return status; +} + +Status DevToolsClientImpl::AppointAsBidiServerForTesting() { + is_main_page_ = true; + bidi_server_is_launched_ = true; + tunnel_session_id_ = session_id_; + return Status{kOk}; } bool DevToolsClientImpl::WasCrashed() { @@ -339,7 +436,6 @@ Status DevToolsClientImpl::ConnectIfNecessary() { if (stack_count_) return Status(kUnknownError, "cannot connect when nested"); - if (IsNull()) { return Status(kUnknownError, "cannot connect without a socket"); } @@ -654,6 +750,11 @@ Status DevToolsClientImpl::PostBidiCommandInternal(std::string channel, base::Value::Dict command) { + if (tunnel_session_id_.empty()) { + return Status{ + kUnknownError, + "uanble to send BiDi commands without BiDi server session id"}; + } if (!channel.empty()) { command.Set("channel", std::move(channel)); } @@ -675,10 +776,8 @@ base::Value::Dict params; params.Set("expression", expression); - const std::string& bidi_session_id = - tunnel_session_id_.empty() ? session_id_ : tunnel_session_id_; // Send command and ignore the response - return SendCommandInternal("Runtime.evaluate", params, bidi_session_id, + return SendCommandInternal("Runtime.evaluate", params, tunnel_session_id_, nullptr, true, false, 0, nullptr); } @@ -927,9 +1026,38 @@ << ::SessionId(session_id_) << " " << id_ << " " << FormatValueForDisplay(*event.params); } + + Status status{kOk}; + + bool is_bidi_message = false; + // The default parser ensures that event.params is never nullptr. + // The unit tests however can set different parsers that not necessarily + // provide such a guarantee. + // Therefore we perform this nullptr check here. + if (event.params) { + status = + IsBidiMessage(event.method, event.params->GetDict(), &is_bidi_message); + if (status.IsError()) { + return status; + } + } + if (is_bidi_message && !bidi_server_is_launched_) { + // BiDi events arrive only to the client connected to the BiDiMapper. + // The check means that that the current client bound to BiDiMapper is + // awaiting for the notification that the mapper was successfully launched. + // Such event is intended for the infrastructural purposes. + // We consume it and remember the fact that BiDiMapper is up and running. + if (event.params->GetDict() + .FindBoolByDottedPath("payload.launched") + .value_or(false)) { + bidi_server_is_launched_ = true; + return Status{kOk}; + } + } + unnotified_event_listeners_ = listeners_; unnotified_event_ = &event; - Status status = EnsureListenersNotifiedOfEvent(); + status = EnsureListenersNotifiedOfEvent(); unnotified_event_ = nullptr; if (status.IsError()) return status; @@ -1067,6 +1195,10 @@ return Status(kOk); } +void DevToolsClientImpl::EnableEventTunnelingForTesting() { + event_tunneling_is_enabled_ = true; +} + namespace internal { bool ParseInspectorMessage(const std::string& message,
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl.h b/chrome/test/chromedriver/chrome/devtools_client_impl.h index 2f9fccd..510ee9c 100644 --- a/chrome/test/chromedriver/chrome/devtools_client_impl.h +++ b/chrome/test/chromedriver/chrome/devtools_client_impl.h
@@ -107,7 +107,16 @@ // Session id used for CDP traffic tunneling const std::string& TunnelSessionId() const override; // Set the session id used for CDP traffic tunneling - void SetTunnelSessionId(const std::string& session_id) override; + Status SetTunnelSessionId(std::string session_id) override; + // Set the session id used for CDP traffic tunneling + Status AppointAsBidiServerForTesting(); + // Start a BiDi Server in the connected target + // Precondition: IsMainPage() + // Precondition: IsConnected() + // Precondition: BiDi tunnel for CDP traffic is not set. + Status StartBidiServer(std::string bidi_mapper_script) override; + Status StartBidiServer(std::string bidi_mapper_script, + const Timeout& timeout); // If the object IsNull then it cannot be connected to the remote end. // Such an object needs to be attached to some !IsNull() parent first. // Postcondition: IsNull() == (socket == nullptr && parent == nullptr) @@ -160,6 +169,7 @@ int NextMessageId() const; // Return NextMessageId and immediately increment it int AdvanceNextMessageId(); + void EnableEventTunnelingForTesting(); private: enum ResponseState { @@ -216,16 +226,16 @@ std::unique_ptr<SyncWebSocket> socket_; GURL url_; // WebViewImpl that owns this instance; nullptr for browser-wide DevTools. - raw_ptr<WebViewImpl> owner_; + raw_ptr<WebViewImpl> owner_ = nullptr; const std::string session_id_; std::string tunnel_session_id_; // parent_ / children_: it's a flat hierarchy - nesting is at most one level // deep. children_ holds child sessions - identified by their session id - // which send/receive messages via the socket_ of their parent. - raw_ptr<DevToolsClientImpl> parent_; + raw_ptr<DevToolsClientImpl> parent_ = nullptr; std::map<std::string, DevToolsClientImpl*> children_; - bool crashed_; - bool detached_; + bool crashed_ = false; + bool detached_ = false; // For the top-level session, this is the target id. // For child sessions, it's the session id. const std::string id_; @@ -234,14 +244,19 @@ std::list<DevToolsEventListener*> listeners_; std::list<DevToolsEventListener*> unnotified_connect_listeners_; std::list<DevToolsEventListener*> unnotified_event_listeners_; - raw_ptr<const internal::InspectorEvent> unnotified_event_; + raw_ptr<const internal::InspectorEvent> unnotified_event_ = nullptr; std::list<DevToolsEventListener*> unnotified_cmd_response_listeners_; scoped_refptr<ResponseInfo> unnotified_cmd_response_info_; std::map<int, scoped_refptr<ResponseInfo>> response_info_map_; - int next_id_; // The id identifying a particular request. - int stack_count_; - bool is_remote_end_configured_; - bool is_main_page_; + int next_id_ = 1; // The id identifying a particular request. + int stack_count_ = 0; + bool is_remote_end_configured_ = false; + bool is_main_page_ = false; + bool bidi_server_is_launched_ = false; + // Event tunneling is temporarily disabled in production. + // It is enabled only by the unit tests + // TODO(chromedriver:4181): Enable CDP event tunneling + bool event_tunneling_is_enabled_ = false; base::WeakPtrFactory<DevToolsClientImpl> weak_ptr_factory_{this}; };
diff --git a/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc b/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc index 1e586bf4..f204bd2 100644 --- a/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc +++ b/chrome/test/chromedriver/chrome/devtools_client_impl_unittest.cc
@@ -36,6 +36,8 @@ namespace { +const char kTestMapperScript[] = "Lorem ipsum dolor sit amet"; + testing::AssertionResult StatusOk(const Status& status) { if (status.IsOk()) { return testing::AssertionSuccess(); @@ -146,11 +148,11 @@ return Status{kOk}; } -Status WrapBidiEventInCdpEvent(const base::Value::Dict& bidi_resp, +Status WrapBidiEventInCdpEvent(const base::Value::Dict& bidi_evt, std::string mapper_session_id, base::Value::Dict* evt) { std::string payload; - Status status = SerializeAsJson(bidi_resp, &payload); + Status status = SerializeAsJson(bidi_evt, &payload); if (status.IsError()) { return status; } @@ -375,12 +377,17 @@ } TEST_F(DevToolsClientImplTest, SetTunnelSessionId) { - SyncWebSocketFactory factory = - base::BindRepeating(&CreateMockSyncWebSocket<MockSyncWebSocket>); - DevToolsClientImpl client("E2F4", "BC80031", "http://url", factory); - const std::string expected_wrapper_session_id = "302BBB"; - client.SetTunnelSessionId(expected_wrapper_session_id); - EXPECT_EQ(expected_wrapper_session_id, client.TunnelSessionId()); + DevToolsClientImpl client("E2F4", "BC80031"); + ASSERT_TRUE(client.TunnelSessionId().empty()); + ASSERT_TRUE(StatusOk(client.SetTunnelSessionId("bidi_session"))); + EXPECT_EQ("bidi_session", client.TunnelSessionId()); +} + +TEST_F(DevToolsClientImplTest, ChangeTunnelSessionId) { + DevToolsClientImpl client("E2F4", "BC80031"); + ASSERT_TRUE(client.TunnelSessionId().empty()); + ASSERT_TRUE(StatusOk(client.SetTunnelSessionId("bidi_session"))); + EXPECT_TRUE(client.SetTunnelSessionId("another_bidi_session").IsError()); } TEST_F(DevToolsClientImplTest, ConnectWithoutSocket) { @@ -670,7 +677,7 @@ class MockListener : public DevToolsEventListener { public: - MockListener() : called_(false) {} + MockListener() = default; ~MockListener() override { EXPECT_TRUE(called_); } Status OnConnected(DevToolsClient* client) override { return Status(kOk); } @@ -685,7 +692,7 @@ } private: - bool called_; + bool called_ = false; }; bool ReturnEventThenResponse( @@ -1392,10 +1399,7 @@ class OnConnectedListener : public DevToolsEventListener { public: OnConnectedListener(const std::string& method, DevToolsClient* client) - : method_(method), - client_(client), - on_connected_called_(false), - on_event_called_(false) { + : method_(method), client_(client) { client_->AddListener(this); } ~OnConnectedListener() override {} @@ -1427,9 +1431,9 @@ private: std::string method_; - raw_ptr<DevToolsClient> client_; - bool on_connected_called_; - bool on_event_called_; + raw_ptr<DevToolsClient> client_ = nullptr; + bool on_connected_called_ = false; + bool on_event_called_ = false; }; class OnConnectedSyncWebSocket : public MockSyncWebSocket { @@ -1559,8 +1563,8 @@ class OtherEventListener : public DevToolsEventListener { public: - OtherEventListener() : received_event_(false) {} - ~OtherEventListener() override {} + OtherEventListener() = default; + ~OtherEventListener() override = default; Status OnConnected(DevToolsClient* client) override { return Status(kOk); } Status OnEvent(DevToolsClient* client, @@ -1570,7 +1574,7 @@ return Status(kOk); } - bool received_event_; + bool received_event_ = false; }; class OnEventListener : public DevToolsEventListener { @@ -1596,8 +1600,8 @@ } private: - raw_ptr<DevToolsClient> client_; - raw_ptr<OtherEventListener> other_listener_; + raw_ptr<DevToolsClient> client_ = nullptr; + raw_ptr<OtherEventListener> other_listener_ = nullptr; }; } // namespace @@ -1725,7 +1729,7 @@ bool HasNextMessage() override { return messages_->size(); } private: - raw_ptr<std::list<std::string>> messages_; + raw_ptr<std::list<std::string>> messages_ = nullptr; bool connected_ = false; }; @@ -1836,8 +1840,8 @@ class MockCommandListener : public DevToolsEventListener { public: - MockCommandListener() {} - ~MockCommandListener() override {} + MockCommandListener() = default; + ~MockCommandListener() override = default; Status OnEvent(DevToolsClient* client, const std::string& method, @@ -2174,7 +2178,7 @@ } private: - raw_ptr<DevToolsClient> client_; + raw_ptr<DevToolsClient> client_ = nullptr; int ping_ = -1; int pong_ = 0; bool event_handled_ = false; @@ -2329,8 +2333,8 @@ class BidiMockSyncWebSocket : public MultiSessionMockSyncWebSocket { public: - explicit BidiMockSyncWebSocket(std::string wrapper_session) - : wrapper_session_(wrapper_session) {} + explicit BidiMockSyncWebSocket(std::string mapper_session) + : mapper_session_(mapper_session) {} ~BidiMockSyncWebSocket() override = default; Status CreateDefaultBidiResponse(int cmd_id, @@ -2413,7 +2417,7 @@ } base::Value::Dict evt; - status = WrapBidiResponseInCdpEvent(response, wrapper_session_, &evt); + status = WrapBidiResponseInCdpEvent(response, mapper_session_, &evt); EXPECT_TRUE(status.IsOk()) << status.message(); if (status.IsError()) { return false; @@ -2445,7 +2449,7 @@ } base::Value::Dict evt; - status = WrapBidiResponseInCdpEvent(bidi_response, wrapper_session_, &evt); + status = WrapBidiResponseInCdpEvent(bidi_response, mapper_session_, &evt); EXPECT_TRUE(status.IsOk()) << status.message(); if (status.IsError()) { return false; @@ -2520,7 +2524,7 @@ session_id); } - EXPECT_EQ(session_id, wrapper_session_); + EXPECT_EQ(session_id, mapper_session_); size_t count = expression->size() - expected_exression_start.size() - 1; std::string bidi_arg_str = @@ -2575,14 +2579,14 @@ bidi_params->Clone(), bidi_channel); } - std::string wrapper_session_; + std::string mapper_session_; }; class MultiSessionMockSyncWebSocket3 : public BidiMockSyncWebSocket { public: - explicit MultiSessionMockSyncWebSocket3(std::string wrapper_session, + explicit MultiSessionMockSyncWebSocket3(std::string mapper_session, int* wrapped_ping_counter) - : BidiMockSyncWebSocket(wrapper_session), + : BidiMockSyncWebSocket(mapper_session), wrapped_ping_counter_(wrapped_ping_counter) {} ~MultiSessionMockSyncWebSocket3() override = default; @@ -2617,7 +2621,7 @@ return Status{kOk}; } - int* wrapped_ping_counter_ = nullptr; + raw_ptr<int> wrapped_ping_counter_ = nullptr; }; template <typename T> @@ -2676,8 +2680,8 @@ BidiEventListener bidi_listener; mapper_client.AddListener(&bidi_listener); ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); - ASSERT_TRUE(StatusOk(root_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + ASSERT_TRUE(StatusOk(mapper_client.AppointAsBidiServerForTesting())); base::Value::Dict params; params.Set("ping", 196); base::Value::Dict bidi_cmd; @@ -2705,8 +2709,8 @@ BidiEventListener bidi_listener; mapper_client.AddListener(&bidi_listener); ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); - ASSERT_TRUE(StatusOk(root_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + ASSERT_TRUE(StatusOk(mapper_client.AppointAsBidiServerForTesting())); for (int cmd_id : {2, 3, 11, 1000021, 1000022, 1000023}) { base::Value::Dict bidi_cmd; @@ -2733,8 +2737,10 @@ ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); ASSERT_TRUE(StatusOk(page_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); - // Set wrapper sessions after all connections to avoid handshake mocking - page_client.SetTunnelSessionId(mapper_client.SessionId()); + // Set the tunnel session after all connections to avoid handshake mocking + ASSERT_TRUE(StatusOk(mapper_client.AppointAsBidiServerForTesting())); + ASSERT_TRUE( + StatusOk(page_client.SetTunnelSessionId(mapper_client.SessionId()))); { base::Value::Dict params; params.Set("wrapped-ping", 13); @@ -2750,8 +2756,8 @@ namespace { class MultiSessionMockSyncWebSocket4 : public BidiMockSyncWebSocket { public: - explicit MultiSessionMockSyncWebSocket4(std::string wrapper_session) - : BidiMockSyncWebSocket(wrapper_session) {} + explicit MultiSessionMockSyncWebSocket4(std::string mapper_session) + : BidiMockSyncWebSocket(mapper_session) {} ~MultiSessionMockSyncWebSocket4() override = default; bool OnCdpOverBidiCommand(SessionState* session_state, @@ -2778,7 +2784,7 @@ bidi_evt.Set("channel", *channel); } base::Value::Dict evt; - Status status = WrapBidiEventInCdpEvent(bidi_evt, wrapper_session_, &evt); + Status status = WrapBidiEventInCdpEvent(bidi_evt, mapper_session_, &evt); EXPECT_TRUE(status.IsOk()) << status.message(); if (status.IsError()) { return false; @@ -2799,7 +2805,7 @@ if (status.IsError()) { return false; } - status = WrapBidiResponseInCdpEvent(response, wrapper_session_, &evt); + status = WrapBidiResponseInCdpEvent(response, mapper_session_, &evt); EXPECT_TRUE(status.IsOk()) << status.message(); if (status.IsError()) { return false; @@ -2833,7 +2839,7 @@ bidi_evt.Set("channel", *channel); } base::Value::Dict evt; - Status status = WrapBidiEventInCdpEvent(bidi_evt, wrapper_session_, &evt); + Status status = WrapBidiEventInCdpEvent(bidi_evt, mapper_session_, &evt); EXPECT_TRUE(status.IsOk()) << status.message(); if (status.IsError()) { return false; @@ -2853,7 +2859,7 @@ if (status.IsError()) { return false; } - status = WrapBidiResponseInCdpEvent(bidi_response, wrapper_session_, &evt); + status = WrapBidiResponseInCdpEvent(bidi_response, mapper_session_, &evt); EXPECT_TRUE(status.IsOk()) << status.message(); if (status.IsError()) { return false; @@ -2898,8 +2904,8 @@ BidiEventListener bidi_listener; mapper_client.AddListener(&bidi_listener); ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); - ASSERT_TRUE(StatusOk(root_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + ASSERT_TRUE(StatusOk(mapper_client.AppointAsBidiServerForTesting())); base::Value::Dict bidi_cmd; ASSERT_TRUE(StatusOk(CreateBidiCommand(37, "method", base::Value::Dict(), nullptr, &bidi_cmd))); @@ -2926,10 +2932,11 @@ mapper_client.AddListener(&bidi_listener); ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); ASSERT_TRUE(StatusOk(page_client.AttachTo(&root_client))); - ASSERT_TRUE(StatusOk(root_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(page_client.ConnectIfNecessary())); - page_client.SetTunnelSessionId(mapper_client.SessionId()); + ASSERT_TRUE(StatusOk(mapper_client.AppointAsBidiServerForTesting())); + ASSERT_TRUE( + StatusOk(page_client.SetTunnelSessionId(mapper_client.SessionId()))); base::Value::Dict bidi_cmd; ASSERT_TRUE(StatusOk(CreateBidiCommand(414, "method", base::Value::Dict(), @@ -2961,10 +2968,11 @@ page_client.AddListener(&red_cdp_listener); ASSERT_TRUE(StatusOk(page_client.AttachTo(&root_client))); ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); - ASSERT_TRUE(StatusOk(root_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(page_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); - page_client.SetTunnelSessionId(mapper_client.SessionId()); + ASSERT_TRUE(StatusOk(mapper_client.AppointAsBidiServerForTesting())); + ASSERT_TRUE( + StatusOk(page_client.SetTunnelSessionId(mapper_client.SessionId()))); base::Value result; page_client.SendCommandAndGetResult("method", base::Value::Dict(), &result); @@ -2989,6 +2997,7 @@ ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); ASSERT_TRUE(StatusOk(root_client.ConnectIfNecessary())); ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + ASSERT_TRUE(StatusOk(mapper_client.AppointAsBidiServerForTesting())); for (std::string channel : {DevToolsClientImpl::kInfraChannel, DevToolsClientImpl::kClientChannelSuffix, ""}) { @@ -3018,3 +3027,279 @@ mapper_bidi_listener.payload_list.clear(); } } + +namespace { + +struct BidiMapperState { + // input + bool emit_launched = true; + bool fail_on_expose_devtools = false; + bool fail_on_add_bidi_response_binding = false; + bool fail_on_set_self_target_id = false; + bool fail_on_mapper = false; + bool fail_on_subscribe_to_cdp = false; + // output + bool devtools_exposed = false; + bool send_bidi_response_binding_added = false; + bool mapper_is_passed = false; + bool self_target_id_is_set = false; + bool subscribed_to_cdp = false; +}; +class BidiServerMockSyncWebSocket : public BidiMockSyncWebSocket { + public: + explicit BidiServerMockSyncWebSocket(BidiMapperState* mapper_state) + : BidiMockSyncWebSocket("mapper_session"), mapper_state_(mapper_state) {} + ~BidiServerMockSyncWebSocket() override = default; + + bool OnPureCdpCommand(SessionState* session_state, + int cmd_id, + std::string method, + base::Value::Dict params, + std::string session_id) override { + bool mapper_was_running = mapper_state_->mapper_is_passed; + if (method == "Target.exposeDevToolsProtocol") { + EXPECT_EQ("root_session", session_id); + EXPECT_THAT(params.FindString("bindingName"), Pointee(Eq("cdp"))); + mapper_state_->devtools_exposed = true; + if (mapper_state_->fail_on_expose_devtools) { + return false; + } + } else if (method == "Runtime.addBinding") { + EXPECT_EQ(mapper_session_, session_id); + EXPECT_THAT(params.FindString("name"), Pointee(Eq("sendBidiResponse"))); + mapper_state_->send_bidi_response_binding_added = true; + if (mapper_state_->fail_on_add_bidi_response_binding) { + return false; + } + } else if (method == "Runtime.evaluate") { + std::string* expression = params.FindString("expression"); + EXPECT_TRUE(expression != nullptr); + if (expression == nullptr) { + return false; + } + if (*expression == "window.setSelfTargetId(\"mapper_client\")") { + mapper_state_->self_target_id_is_set = true; + if (mapper_state_->fail_on_set_self_target_id) { + return false; + } + } else if (*expression == kTestMapperScript) { + mapper_state_->mapper_is_passed = true; + if (mapper_state_->fail_on_mapper) { + return false; + } + } + } + + if (!mapper_was_running && mapper_state_->mapper_is_passed && + mapper_state_->emit_launched) { + base::Value::Dict bidi_evt; + bidi_evt.Set("launched", true); + base::Value::Dict cdp_evt; + EXPECT_TRUE(StatusOk( + WrapBidiEventInCdpEvent(bidi_evt, mapper_session_, &cdp_evt))); + std::string message; + EXPECT_TRUE(StatusOk(SerializeAsJson(cdp_evt, &message))); + queued_response_.push(std::move(message)); + } + + base::Value::Dict response; + EXPECT_TRUE(StatusOk(CreateCdpResponse(cmd_id, base::Value::Dict(), + std::move(session_id), &response))); + std::string message; + EXPECT_TRUE(StatusOk(SerializeAsJson(response, &message))); + queued_response_.push(std::move(message)); + return true; + } + + bool OnPureBidiCommand(SessionState* session_state, + int cmd_id, + std::string method, + base::Value::Dict params, + const std::string* channel) override { + EXPECT_NE(nullptr, channel); + if (!channel) { + return false; + } + EXPECT_EQ(DevToolsClientImpl::kInfraChannel, *channel); + EXPECT_EQ("session.subscribe", method); + EXPECT_THAT(params.FindString("events"), Pointee(Eq("cdp.eventReceived"))); + mapper_state_->subscribed_to_cdp = true; + return !mapper_state_->fail_on_subscribe_to_cdp; + } + + raw_ptr<BidiMapperState> mapper_state_ = nullptr; +}; + +template <typename T> +std::unique_ptr<SyncWebSocket> CreateMockSyncWebSocket_BidiMapperState( + BidiMapperState* mapper_state) { + return std::unique_ptr<SyncWebSocket>(new T(mapper_state)); +} + +} // namespace + +TEST_F(DevToolsClientImplTest, StartBidiServer) { + BidiMapperState mapper_state; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + mapper_client.SetMainPage(true); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + + EXPECT_TRUE(StatusOk(mapper_client.StartBidiServer(kTestMapperScript))); + EXPECT_TRUE(mapper_state.devtools_exposed); + EXPECT_TRUE(mapper_state.mapper_is_passed); + EXPECT_TRUE(mapper_state.self_target_id_is_set); + EXPECT_TRUE(mapper_state.send_bidi_response_binding_added); + EXPECT_TRUE(mapper_state.subscribed_to_cdp); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerWaitsForLaunched) { + BidiMapperState mapper_state; + mapper_state.emit_launched = false; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + mapper_client.SetMainPage(true); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + + EXPECT_EQ(kTimeout, + mapper_client + .StartBidiServer(kTestMapperScript, Timeout(base::TimeDelta())) + .code()); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerNotConnected) { + BidiMapperState mapper_state; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + mapper_client.SetMainPage(true); + + EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError()); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerNotAPageClient) { + BidiMapperState mapper_state; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + + EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError()); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerTunnelIsAlreadySet) { + BidiMapperState mapper_state; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl pink_client("pink_client", "pink_session"); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + mapper_client.SetMainPage(true); + ASSERT_TRUE(StatusOk(pink_client.AttachTo(&root_client))); + ASSERT_TRUE(StatusOk(pink_client.ConnectIfNecessary())); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + mapper_client.SetTunnelSessionId(pink_client.SessionId()); + + EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError()); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerFailOnAddBidiResponseBinding) { + BidiMapperState mapper_state; + mapper_state.fail_on_add_bidi_response_binding = true; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + mapper_client.SetMainPage(true); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + + EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError()); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerFailOnSetSelfTarget) { + BidiMapperState mapper_state; + mapper_state.fail_on_set_self_target_id = true; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + mapper_client.SetMainPage(true); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + + EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError()); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerFailOnExposeDevTools) { + BidiMapperState mapper_state; + mapper_state.fail_on_expose_devtools = true; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + mapper_client.SetMainPage(true); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + + EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError()); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerFailOnMapper) { + BidiMapperState mapper_state; + mapper_state.fail_on_mapper = true; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + mapper_client.SetMainPage(true); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + + EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError()); +} + +TEST_F(DevToolsClientImplTest, StartBidiServerFailOnSubscribeToCdp) { + BidiMapperState mapper_state; + mapper_state.fail_on_subscribe_to_cdp = true; + SyncWebSocketFactory factory = base::BindRepeating( + &CreateMockSyncWebSocket_BidiMapperState<BidiServerMockSyncWebSocket>, + &mapper_state); + DevToolsClientImpl root_client("root", "root_session", "http://url", factory); + DevToolsClientImpl mapper_client("mapper_client", "mapper_session"); + mapper_client.EnableEventTunnelingForTesting(); + ASSERT_TRUE(StatusOk(mapper_client.AttachTo(&root_client))); + mapper_client.SetMainPage(true); + ASSERT_TRUE(StatusOk(mapper_client.ConnectIfNecessary())); + + EXPECT_TRUE(mapper_client.StartBidiServer(kTestMapperScript).IsError()); +}
diff --git a/chrome/test/chromedriver/chrome/stub_devtools_client.cc b/chrome/test/chromedriver/chrome/stub_devtools_client.cc index 1e95b0f..99b02e4 100644 --- a/chrome/test/chromedriver/chrome/stub_devtools_client.cc +++ b/chrome/test/chromedriver/chrome/stub_devtools_client.cc
@@ -27,8 +27,13 @@ return tunnel_session_id_; } -void StubDevToolsClient::SetTunnelSessionId(const std::string& session_id) { - tunnel_session_id_ = session_id; +Status StubDevToolsClient::SetTunnelSessionId(std::string session_id) { + tunnel_session_id_ = std::move(session_id); + return Status{kOk}; +} + +Status StubDevToolsClient::StartBidiServer(std::string bidi_mapper_script) { + return Status{kOk}; } bool StubDevToolsClient::IsNull() const {
diff --git a/chrome/test/chromedriver/chrome/stub_devtools_client.h b/chrome/test/chromedriver/chrome/stub_devtools_client.h index 4544d52..560fae4 100644 --- a/chrome/test/chromedriver/chrome/stub_devtools_client.h +++ b/chrome/test/chromedriver/chrome/stub_devtools_client.h
@@ -23,7 +23,8 @@ const std::string& GetId() override; const std::string& SessionId() const override; const std::string& TunnelSessionId() const override; - void SetTunnelSessionId(const std::string& session_id) override; + Status SetTunnelSessionId(std::string session_id) override; + Status StartBidiServer(std::string bidi_mapper_script) override; bool IsNull() const override; bool WasCrashed() override; Status ConnectIfNecessary() override;
diff --git a/chrome/test/chromedriver/chrome/stub_web_view.cc b/chrome/test/chromedriver/chrome/stub_web_view.cc index 61470ca..23198b2 100644 --- a/chrome/test/chromedriver/chrome/stub_web_view.cc +++ b/chrome/test/chromedriver/chrome/stub_web_view.cc
@@ -57,6 +57,10 @@ return Status(kOk); } +Status StubWebView::StartBidiServer(std::string bidi_mapper_script) { + return Status{kOk}; +} + Status StubWebView::PostBidiCommand(base::Value::Dict command) { return Status{kOk}; }
diff --git a/chrome/test/chromedriver/chrome/stub_web_view.h b/chrome/test/chromedriver/chrome/stub_web_view.h index 31aff6b..332398f 100644 --- a/chrome/test/chromedriver/chrome/stub_web_view.h +++ b/chrome/test/chromedriver/chrome/stub_web_view.h
@@ -28,6 +28,7 @@ Status Reload(const Timeout* timeout) override; Status Freeze(const Timeout* timeout) override; Status Resume(const Timeout* timeout) override; + Status StartBidiServer(std::string bidi_mapper_script) override; Status PostBidiCommand(base::Value::Dict command) override; Status SendCommand(const std::string& cmd, const base::Value::Dict& params) override;
diff --git a/chrome/test/chromedriver/chrome/web_view.h b/chrome/test/chromedriver/chrome/web_view.h index 21dc4e2..ac3c863 100644 --- a/chrome/test/chromedriver/chrome/web_view.h +++ b/chrome/test/chromedriver/chrome/web_view.h
@@ -72,6 +72,8 @@ // Resume the current page. virtual Status Resume(const Timeout* timeout) = 0; + virtual Status StartBidiServer(std::string bidi_mapper_string) = 0; + // Send the BiDi command to the BiDiMapper virtual Status PostBidiCommand(base::Value::Dict command) = 0;
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.cc b/chrome/test/chromedriver/chrome/web_view_impl.cc index fdf572c..13bb853 100644 --- a/chrome/test/chromedriver/chrome/web_view_impl.cc +++ b/chrome/test/chromedriver/chrome/web_view_impl.cc
@@ -514,6 +514,10 @@ timeout); } +Status WebViewImpl::StartBidiServer(std::string bidi_mapper_script) { + return client_->StartBidiServer(std::move(bidi_mapper_script)); +} + Status WebViewImpl::PostBidiCommand(base::Value::Dict command) { return client_->PostBidiCommand(std::move(command)); }
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.h b/chrome/test/chromedriver/chrome/web_view_impl.h index 5fb41b8..400471c 100644 --- a/chrome/test/chromedriver/chrome/web_view_impl.h +++ b/chrome/test/chromedriver/chrome/web_view_impl.h
@@ -61,6 +61,7 @@ Status Reload(const Timeout* timeout) override; Status Freeze(const Timeout* timeout) override; Status Resume(const Timeout* timeout) override; + Status StartBidiServer(std::string bidi_mapper_script) override; Status PostBidiCommand(base::Value::Dict command) override; Status SendCommand(const std::string& cmd, const base::Value::Dict& params) override;
diff --git a/chrome/test/chromedriver/session.cc b/chrome/test/chromedriver/session.cc index e87ea9e..5e981315 100644 --- a/chrome/test/chromedriver/session.cc +++ b/chrome/test/chromedriver/session.cc
@@ -160,16 +160,7 @@ } } -bool Session::BidiMapperIsLaunched() const { - return bidi_mapper_is_launched_; -} - void Session::OnBidiResponse(base::Value::Dict payload) { - if (payload.FindBool("launched").value_or(false)) { - bidi_mapper_is_launched_ = true; - return; - } - // If there is no active bidi connections the events will be accumulated. bidi_response_queue_.push(std::move(payload)); for (; bidi_response_queue_.size() > kBidiQueueCapacity;
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc index 9376ab9..2c6d605 100644 --- a/chrome/test/chromedriver/session_commands.cc +++ b/chrome/test/chromedriver/session_commands.cc
@@ -365,55 +365,12 @@ if (status.IsError()) return status; session->bidi_mapper_web_view_id = session->window; - ChromeImpl* chrome = static_cast<ChromeImpl*>(session->chrome.get()); - DevToolsClient* client = chrome->Client(); - { - base::Value::Dict body; - body.Set("bindingName", "cdp"); - body.Set("targetId", session->window); - client->SendCommandAndIgnoreResponse("Target.exposeDevToolsProtocol", - body); - } - - { - std::unique_ptr<base::Value> result; - base::Value::Dict body; - body.Set("name", "sendBidiResponse"); - web_view->SendCommandAndGetResult("Runtime.addBinding", body, &result); - } - - status = EvaluateScriptAndIgnoreResult(session, kMapperScript); - if (status.IsError()) + status = web_view->StartBidiServer(kMapperScript); + if (status.IsError()) { return status; - - { - std::unique_ptr<base::Value> result; - base::Value::Dict body; - std::string window_id; - if (!base::JSONWriter::Write(session->window, &window_id)) { - return Status(kUnknownError, - "cannot serialize be window id: " + session->window); - } - body.Set("expression", "window.setSelfTargetId(" + window_id + ")"); - status = - web_view->SendCommandAndGetResult("Runtime.evaluate", body, &result); - if (status.IsError()) - return status; } - base::RepeatingCallback<Status(bool*)> bidi_mapper_is_launched = - base::BindRepeating( - [](Session* session, bool* condition_is_met) { - *condition_is_met = session->BidiMapperIsLaunched(); - return Status{kOk}; - }, - base::Unretained(session)); - // Assume that BiDiMapper initialization requires the same time as a regular - // script - web_view->HandleEventsUntil(bidi_mapper_is_launched, - Timeout(session->script_timeout)); - { // Create a new tab because the default one is occupied by the BiDiMapper std::string web_view_id;
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/unmount/test.js b/chrome/test/data/extensions/api_test/file_system_provider/unmount/test.js index 3dd34c80..0b4d7f1 100644 --- a/chrome/test/data/extensions/api_test/file_system_provider/unmount/test.js +++ b/chrome/test/data/extensions/api_test/file_system_provider/unmount/test.js
@@ -23,7 +23,7 @@ * @param {function()} callback Success callback. */ function setUp(callback) { - Promise.race([ + Promise.all([ new Promise(function(fulfill, reject) { chrome.fileSystemProvider.mount( {fileSystemId: FIRST_FILE_SYSTEM_ID, displayName: 'vanilla.zip'},
diff --git a/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js b/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js index afcc23f..3d379d2 100644 --- a/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js
@@ -1378,6 +1378,36 @@ assertFalse(!!internetDetailPage.shadowRoot.querySelector( 'network-proxy-section')); }); + // Syntactic sugar for running test twice with different values for the + // apnRevamp feature flag. + [true, false].forEach(isApnRevampEnabled => { + test('Show/Hide APN row correspondingly to ApnRevamp flag', async () => { + loadTimeData.overrideValues({ + apnRevamp: isApnRevampEnabled, + }); + init(); + mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true); + const apnName = 'test'; + const cellularNetwork = + getManagedProperties(NetworkType.kCellular, 'cellular'); + cellularNetwork.typeProperties.cellular.connectedApn = {}; + cellularNetwork.typeProperties.cellular.connectedApn.accessPointName = + apnName; + mojoApi_.setManagedPropertiesForTest(cellularNetwork); + internetDetailPage.init('cellular_guid', 'Cellular', 'cellular'); + await flushAsync(); + const crLink = + internetDetailPage.shadowRoot.querySelector('#apnSubpageButton'); + const apn = + crLink ? crLink.shadowRoot.querySelector('#subLabel') : null; + if (isApnRevampEnabled) { + assertTrue(!!apn); + assertEquals(apn.textContent.trim(), apnName); + } else { + assertFalse(!!apn); + } + }); + }); }); suite('DetailsPageEthernet', function() {
diff --git a/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js b/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js index 9625c830..b77ed5e67 100644 --- a/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js +++ b/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js
@@ -111,9 +111,6 @@ async () => { loadTimeData.overrideValues({ showPrivacyHubPage: true, - showPrivacyHubMVPPage: true, - showPrivacyHubDogfoodPage: true, - showPrivacyHubFuturePage: true, }); privacyPage = document.createElement('os-settings-privacy-page'); @@ -126,9 +123,6 @@ test('Suggested content, pref disabled', async () => { loadTimeData.overrideValues({ showPrivacyHubPage: false, - showPrivacyHubMVPPage: false, - showPrivacyHubDogfoodPage: false, - showPrivacyHubFuturePage: false, }); privacyPage = document.createElement('os-settings-privacy-page'); @@ -144,9 +138,6 @@ test('Suggested content, pref enabled', async () => { loadTimeData.overrideValues({ showPrivacyHubPage: false, - showPrivacyHubMVPPage: false, - showPrivacyHubDogfoodPage: false, - showPrivacyHubFuturePage: false, }); // Update the backing pref to enabled.
diff --git a/chromeos/ash/components/audio/audio_device_selection_generated_unittest.cc b/chromeos/ash/components/audio/audio_device_selection_generated_unittest.cc index 0db3b4d..b1e66fff 100644 --- a/chromeos/ash/components/audio/audio_device_selection_generated_unittest.cc +++ b/chromeos/ash/components/audio/audio_device_selection_generated_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Generated test cases from cl/479121699. +// Generated test cases from cl/480876614. // DO NOT EDIT. #include "chromeos/ash/components/audio/audio_device_selection_test_base.h" @@ -1377,6 +1377,96 @@ EXPECT_EQ(ActiveOutputNodeId(), internal1.id); } +TEST_F(AudioDeviceSelectionGeneratedTest, HdmiReplugUsbOutput) { + AudioNode usb1 = NewOutputNode("USB"); + AudioNode hdmi2 = NewOutputNode("HDMI"); + + Plug(usb1); + // Devices: [usb1*] hdmi2 + // List: usb1 + EXPECT_EQ(ActiveOutputNodeId(), usb1.id); + + Plug(hdmi2); + // Devices: [usb1* hdmi2] + // List: usb1 + EXPECT_EQ(ActiveOutputNodeId(), usb1.id); + + Select(hdmi2); + // Devices: [usb1 hdmi2*] + // List: usb1 < hdmi2 + EXPECT_EQ(ActiveOutputNodeId(), hdmi2.id); + + Unplug(usb1); + // Devices: [hdmi2*] usb1 + // List: usb1 < hdmi2 + EXPECT_EQ(ActiveOutputNodeId(), hdmi2.id); + + Plug(usb1); + // Devices: [usb1 hdmi2*] + // List: usb1 < hdmi2 + EXPECT_EQ(ActiveOutputNodeId(), hdmi2.id); +} + +TEST_F(AudioDeviceSelectionGeneratedTest, InternalReplugUsbInput) { + AudioNode internal1 = NewInputNode("INTERNAL_MIC"); + AudioNode usb2 = NewInputNode("USB"); + + Plug(internal1); + // Devices: [internal1*] usb2 + // List: internal1 + EXPECT_EQ(ActiveInputNodeId(), internal1.id); + + Plug(usb2); + // Devices: [internal1 usb2*] + // List: internal1 < usb2 + EXPECT_EQ(ActiveInputNodeId(), usb2.id); + + Select(internal1); + // Devices: [internal1* usb2] + // List: usb2 < internal1 + EXPECT_EQ(ActiveInputNodeId(), internal1.id); + + Unplug(usb2); + // Devices: [internal1*] usb2 + // List: usb2 < internal1 + EXPECT_EQ(ActiveInputNodeId(), internal1.id); + + Plug(usb2); + // Devices: [internal1* usb2] + // List: usb2 < internal1 + EXPECT_EQ(ActiveInputNodeId(), internal1.id); +} + +TEST_F(AudioDeviceSelectionGeneratedTest, InternalReplugUsbOutput) { + AudioNode internal1 = NewOutputNode("INTERNAL_SPEAKER"); + AudioNode usb2 = NewOutputNode("USB"); + + Plug(internal1); + // Devices: [internal1*] usb2 + // List: internal1 + EXPECT_EQ(ActiveOutputNodeId(), internal1.id); + + Plug(usb2); + // Devices: [internal1 usb2*] + // List: internal1 < usb2 + EXPECT_EQ(ActiveOutputNodeId(), usb2.id); + + Select(internal1); + // Devices: [internal1* usb2] + // List: usb2 < internal1 + EXPECT_EQ(ActiveOutputNodeId(), internal1.id); + + Unplug(usb2); + // Devices: [internal1*] usb2 + // List: usb2 < internal1 + EXPECT_EQ(ActiveOutputNodeId(), internal1.id); + + Plug(usb2); + // Devices: [internal1* usb2] + // List: usb2 < internal1 + EXPECT_EQ(ActiveOutputNodeId(), internal1.id); +} + TEST_F(AudioDeviceSelectionGeneratedTest, SimpleInput) { AudioNode usb1 = NewInputNode("USB"); AudioNode usb2 = NewInputNode("USB");
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler.h b/chromeos/ash/components/audio/audio_devices_pref_handler.h index 8e0e619..3546a53 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler.h +++ b/chromeos/ash/components/audio/audio_devices_pref_handler.h
@@ -63,9 +63,10 @@ // priorities will be [.., base, target, A, B]. // If both target and base have kUserPriorityNone, // set the target's user priority to kUserPriorityMin. + // If base is nullptr, assign a minimal priority to `target`. // Do nothing if target already has a higher user priority. virtual void SetUserPriorityHigherThan(const AudioDevice& target, - const AudioDevice& base) = 0; + const AudioDevice* base) = 0; // Reads the user priority from prefs. virtual int GetUserPriority(const AudioDevice& device) = 0;
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc index 9b050dc1..5b1dc183 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.cc
@@ -231,9 +231,12 @@ void AudioDevicesPrefHandlerImpl::SetUserPriorityHigherThan( const AudioDevice& target, - const AudioDevice& base) { + const AudioDevice* base) { int t = GetUserPriority(target); - int b = GetUserPriority(base); + int b = 0; + if (base) { + b = GetUserPriority(*base); + } // Don't need to update the user priority of `target` if it's already has // higher priority than base. @@ -246,15 +249,19 @@ : output_device_user_priority_settings_; if (t != kUserPriorityNone) { - for (auto it = priority_prefs.begin(); it != priority_prefs.end(); ++it) { - if (it->second.GetInt() > t && it->second.GetInt() <= b) - it->second = base::Value(it->second.GetInt() - 1); + // before: [. . . t - - - b . . .] + // after: [. . . - - - b t . . .] + for (auto it : priority_prefs) { + if (it.second.GetInt() > t && it.second.GetInt() <= b) + it.second = base::Value(it.second.GetInt() - 1); } priority_prefs.Set(target_id, b); } else { - for (auto it = priority_prefs.begin(); it != priority_prefs.end(); ++it) { - if (it->second.GetInt() > b) - it->second = base::Value(it->second.GetInt() + 1); + // before: [. . . b + + +] + // after : [. . . b t + + +] + for (auto it : priority_prefs) { + if (it.second.GetInt() > b) + it.second = base::Value(it.second.GetInt() + 1); } priority_prefs.Set(target_id, b + 1); } @@ -266,8 +273,7 @@ } } -int AudioDevicesPrefHandlerImpl::GetUserPriority( - const AudioDevice& device) { +int AudioDevicesPrefHandlerImpl::GetUserPriority(const AudioDevice& device) { if (device.is_input) { return input_device_user_priority_settings_ .FindInt(GetDeviceIdString(device))
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h index e410ffa..f9a4040 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl.h
@@ -47,7 +47,7 @@ bool* activate_by_user) override; void SetUserPriorityHigherThan(const AudioDevice& target, - const AudioDevice& base) override; + const AudioDevice* base) override; int GetUserPriority(const AudioDevice& device) override; bool GetNoiseCancellationState() override;
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc index 7f3d8b0..4764828 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_impl_unittest.cc
@@ -482,30 +482,42 @@ EXPECT_EQ(kUserPriorityNone, GetUserPriority(device)); AudioDevice device2 = GetSecondaryDeviceWithVersion(2); - audio_pref_handler_->SetUserPriorityHigherThan(device2, device); + audio_pref_handler_->SetUserPriorityHigherThan(device2, &device); EXPECT_EQ(kUserPriorityNone, GetUserPriority(device)); EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2)); - audio_pref_handler_->SetUserPriorityHigherThan(device, device2); + audio_pref_handler_->SetUserPriorityHigherThan(device, &device2); EXPECT_EQ(2, GetUserPriority(device)); EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2)); AudioDevice device3 = GetDeviceWithSpecialCharactersWithVersion(2); - audio_pref_handler_->SetUserPriorityHigherThan(device3, device2); + audio_pref_handler_->SetUserPriorityHigherThan(device3, &device2); EXPECT_EQ(2, GetUserPriority(device3)); EXPECT_EQ(3, GetUserPriority(device)); EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2)); - audio_pref_handler_->SetUserPriorityHigherThan(device, device3); + audio_pref_handler_->SetUserPriorityHigherThan(device, &device3); EXPECT_EQ(2, GetUserPriority(device3)); EXPECT_EQ(3, GetUserPriority(device)); EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2)); - audio_pref_handler_->SetUserPriorityHigherThan(device3, device); + audio_pref_handler_->SetUserPriorityHigherThan(device3, &device); EXPECT_EQ(3, GetUserPriority(device3)); EXPECT_EQ(2, GetUserPriority(device)); EXPECT_EQ(kUserPriorityMin, GetUserPriority(device2)); } +TEST_P(AudioDevicesPrefHandlerTest, UserPrioritySingle) { + AudioDevice device = GetDeviceWithVersion(2); + AudioDevice device2 = GetSecondaryDeviceWithVersion(2); + audio_pref_handler_->SetUserPriorityHigherThan(device, nullptr); + EXPECT_EQ(kUserPriorityMin, GetUserPriority(device)); + + audio_pref_handler_->SetUserPriorityHigherThan(device2, nullptr); + EXPECT_LT(GetUserPriority(device2), GetUserPriority(device)); + EXPECT_NE(kUserPriorityNone, GetUserPriority(device2)); + EXPECT_NE(kUserPriorityNone, GetUserPriority(device)); +} + } // namespace ash
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc index fe64a02..d09d447a 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.cc
@@ -73,22 +73,31 @@ void AudioDevicesPrefHandlerStub::SetUserPriorityHigherThan( const AudioDevice& target, - const AudioDevice& base) { + const AudioDevice* base) { int t = user_priority_map_[target.stable_device_id]; - int b = user_priority_map_[base.stable_device_id]; + int b = 0; + if (base) { + b = user_priority_map_[base->stable_device_id]; + } // Don't need to update the user priority of `target` if it's already has // higher priority than base. if (t > b) return; + if (t != kUserPriorityNone) { + // before: [. . . t - - - b . . .] + // after: [. . . - - - b t . . .] for (auto& it : user_priority_map_) { if (it.second > t && it.second <= b) user_priority_map_[it.first] -= 1; } user_priority_map_[target.stable_device_id] = b; } else { + // before: [. . . b + + +] + // after : [. . . b t + + +] for (auto& it : user_priority_map_) { + DCHECK(it.second > 0); if (it.second > b) user_priority_map_[it.first] += 1; }
diff --git a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h index 1a4ac2d..710b49d 100644 --- a/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h +++ b/chromeos/ash/components/audio/audio_devices_pref_handler_stub.h
@@ -48,7 +48,7 @@ bool* active, bool* activate_by_user) override; void SetUserPriorityHigherThan(const AudioDevice& target, - const AudioDevice& base) override; + const AudioDevice* base) override; int32_t GetUserPriority(const AudioDevice& device) override; bool GetAudioOutputAllowedValue() const override; void AddAudioPrefObserver(AudioPrefObserver* observer) override;
diff --git a/chromeos/ash/components/audio/cras_audio_handler.cc b/chromeos/ash/components/audio/cras_audio_handler.cc index 75ce55f2..1615ce5 100644 --- a/chromeos/ash/components/audio/cras_audio_handler.cc +++ b/chromeos/ash/components/audio/cras_audio_handler.cc
@@ -1377,10 +1377,8 @@ chromeos::features::kRobustAudioDeviceSelectLogic)) { const AudioDevice* current_active_device = GetDeviceFromId(current_active_node_id); - if (current_active_device != nullptr) { - audio_pref_handler_->SetUserPriorityHigherThan(new_active_device, - *current_active_device); - } + audio_pref_handler_->SetUserPriorityHigherThan(new_active_device, + current_active_device); } // Set the current active input/output device to the new_active_device.
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index 27976c0..745678d2 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni
@@ -330,6 +330,13 @@ "policy.AllowedLanguages", "terminal.Crosh", + # https://crbug.com/1374943 + "hwsec.CrossVersionLogin", + + # https://crbug.com/1375191 + "login.ChangePassword.auth_factor_experiment_on", + "login.ChangePassword.auth_factor_experiment_off", + # READ COMMENT AT TOP BEFORE ADDING NEW TESTS HERE. ]
diff --git a/components/account_manager_core/chromeos/account_manager_mojo_service.h b/components/account_manager_core/chromeos/account_manager_mojo_service.h index 0a7b9a1..c2ae501b 100644 --- a/components/account_manager_core/chromeos/account_manager_mojo_service.h +++ b/components/account_manager_core/chromeos/account_manager_mojo_service.h
@@ -20,9 +20,9 @@ #include "mojo/public/cpp/bindings/receiver_set.h" #include "mojo/public/cpp/bindings/remote_set.h" -namespace chromeos { +namespace ash { class SigninHelper; -} // namespace chromeos +} namespace crosapi { @@ -75,9 +75,9 @@ friend class AccountManagerMojoServiceTest; friend class TestAccountManagerObserver; friend class AccountManagerFacadeAshTest; - friend class chromeos::SigninHelper; + friend class ash::SigninHelper; - // This method is called by `chromeos::SigninHelper` which passes `AccountKey` + // This method is called by `ash::SigninHelper` which passes `AccountKey` // of account that was added. void OnAccountAdditionFinished( const account_manager::AccountAdditionResult& result);
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorFieldModel.java b/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorFieldModel.java index 19c1afe9..fcd39cc 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorFieldModel.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorFieldModel.java
@@ -116,16 +116,19 @@ /** Indicates a password input. */ public static final int INPUT_TYPE_HINT_PASSWORD = 9; - private static final int INPUT_TYPE_HINT_MAX_TEXT_INPUT_EXCLUSIVE = 10; + /** Indicates a numeric pin input. */ + public static final int INPUT_TYPE_HINT_NUMERIC_PIN = 10; + + private static final int INPUT_TYPE_HINT_MAX_TEXT_INPUT_EXCLUSIVE = 11; /** Indicates a dropdown. */ - public static final int INPUT_TYPE_HINT_DROPDOWN = 11; + public static final int INPUT_TYPE_HINT_DROPDOWN = 12; /** Indicates a list of icons. */ - public static final int INPUT_TYPE_HINT_ICONS = 12; + public static final int INPUT_TYPE_HINT_ICONS = 13; /** Indicates a checkbox. */ - public static final int INPUT_TYPE_HINT_CHECKBOX = 13; + public static final int INPUT_TYPE_HINT_CHECKBOX = 14; /** * Indicates a label, e.g., for a server credit card. * @@ -139,9 +142,9 @@ * First Last [VISA] * Exp: 03/2021 */ - public static final int INPUT_TYPE_HINT_LABEL = 14; + public static final int INPUT_TYPE_HINT_LABEL = 15; - private static final int INPUT_TYPE_HINT_MAX_EXCLUSIVE = 15; + private static final int INPUT_TYPE_HINT_MAX_EXCLUSIVE = 16; /* Indicates that the length counter is disabled. */ public static final int LENGTH_COUNTER_LIMIT_NONE = 0;
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorTextField.java b/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorTextField.java index ebb18f61..c1c9d997 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorTextField.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/prefeditor/EditorTextField.java
@@ -246,6 +246,12 @@ InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); mInputLayout.setPasswordVisibilityToggleEnabled(true); break; + case EditorFieldModel.INPUT_TYPE_HINT_NUMERIC_PIN: + // Numeric pin field with an option to toggle the visibility + mInput.setInputType( + InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD); + mInputLayout.setPasswordVisibilityToggleEnabled(true); + break; default: mInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS);
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 9a4e769f..8e98beee 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -195,6 +195,8 @@ "form_parsing/merchant_promo_code_field.h", "form_parsing/name_field.cc", "form_parsing/name_field.h", + "form_parsing/numeric_quantity_field.cc", + "form_parsing/numeric_quantity_field.h", "form_parsing/phone_field.cc", "form_parsing/phone_field.h", "form_parsing/price_field.cc", @@ -841,6 +843,7 @@ "form_parsing/iban_field_unittest.cc", "form_parsing/merchant_promo_code_field_unittest.cc", "form_parsing/name_field_unittest.cc", + "form_parsing/numeric_quantity_field_unittest.cc", "form_parsing/parsing_test_utils.cc", "form_parsing/parsing_test_utils.h", "form_parsing/phone_field_unittest.cc",
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc index 5db7dd7e..9f03651 100644 --- a/components/autofill/core/browser/autofill_field.cc +++ b/components/autofill/core/browser/autofill_field.cc
@@ -5,16 +5,39 @@ #include "components/autofill/core/browser/autofill_field.h" #include <stdint.h> +#include <iterator> #include "base/feature_list.h" +#include "base/notreached.h" #include "base/strings/string_number_conversions.h" #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/proto/server.pb.h" #include "components/autofill/core/common/autofill_features.h" +#include "components/autofill/core/common/dense_set.h" #include "components/autofill/core/common/signatures.h" namespace autofill { +using FieldPrediction = + AutofillQueryResponse::FormSuggestion::FieldSuggestion::FieldPrediction; + +namespace { + +// Returns true, if the prediction is non-experimental and should be used by +// autofill or password manager. +// Note: A `NO_SERVER_DATA` prediction with `SOURCE_UNSPECIFIED` may also be a +// default prediction. We don't need to store it, because its meaning is that +// there is no default prediction. +bool IsDefaultPrediction(const FieldPrediction& prediction) { + constexpr DenseSet<FieldPrediction::Source, FieldPrediction::Source_MAX> + default_sources = {FieldPrediction::SOURCE_AUTOFILL_DEFAULT, + FieldPrediction::SOURCE_PASSWORDS_DEFAULT, + FieldPrediction::SOURCE_OVERRIDE}; + return default_sources.contains(prediction.source()); +} + +} // namespace + AutofillField::AutofillField() { local_type_predictions_.fill(NO_SERVER_DATA); } @@ -88,16 +111,42 @@ } void AutofillField::set_server_predictions( - std::vector< - AutofillQueryResponse::FormSuggestion::FieldSuggestion::FieldPrediction> - predictions) { - server_predictions_ = std::move(predictions); + std::vector<FieldPrediction> predictions) { overall_type_ = AutofillType(NO_SERVER_DATA); // Ensures that AutofillField::server_type() is a valid enum value. - for (auto& prediction : server_predictions_) { + for (auto& prediction : predictions) { prediction.set_type( ToSafeServerFieldType(prediction.type(), NO_SERVER_DATA)); } + + server_predictions_.clear(); + experimental_server_predictions_.clear(); + + for (auto& prediction : predictions) { + if (prediction.source() == FieldPrediction::SOURCE_UNSPECIFIED) + // A prediction with `SOURCE_UNSPECIFIED` is one of two things: + // 1. No prediction for default, a.k.a. `NO_SERVER_DATA`. The absence of + // a prediction may not be creditable to a particular prediction + // source. + // 2. An experiment that is missing from the `PredictionSource` enum. + // Protobuf corrects unknown values to 0 when parsing. + // Neither case is actionable. + continue; + if (IsDefaultPrediction(prediction)) { + server_predictions_.push_back(std::move(prediction)); + } else { + experimental_server_predictions_.push_back(std::move(prediction)); + } + } + + if (server_predictions_.empty()) + // Equivalent to a `NO_SERVER_DATA` prediction from `SOURCE_UNSPECIFIED`. + server_predictions_.emplace_back(); + + LOG_IF(ERROR, server_predictions_.size() > 2) + << "Expected up to 2 default predictions from the Autofill server. " + "Actual: " + << server_predictions_.size(); } std::vector<AutofillDataModel::ValidityState> @@ -204,6 +253,16 @@ // predictions get precedence over the server predictions. believe_server = believe_server && (heuristic_type() != IBAN_VALUE); + // The numeric quanity heuristic should get granted precedence over the + // server prediction since it tries to catch false-positive server + // predictions. + believe_server = + believe_server && + !(heuristic_type() == NUMERIC_QUANTITY && + server_type() != UNKNOWN_TYPE && + base::FeatureList::IsEnabled( + features::kAutofillGivePrecedenceToNumericQuantitites)); + if (believe_server) return AutofillType(server_type()); }
diff --git a/components/autofill/core/browser/autofill_field.h b/components/autofill/core/browser/autofill_field.h index 804f64a8..43b6fed 100644 --- a/components/autofill/core/browser/autofill_field.h +++ b/components/autofill/core/browser/autofill_field.h
@@ -55,6 +55,11 @@ server_predictions() const { return server_predictions_; } + const std::vector< + AutofillQueryResponse::FormSuggestion::FieldSuggestion::FieldPrediction>& + experimental_server_predictions() const { + return experimental_server_predictions_; + } bool may_use_prefilled_placeholder() const { return may_use_prefilled_placeholder_; } @@ -234,6 +239,11 @@ std::vector< AutofillQueryResponse::FormSuggestion::FieldSuggestion::FieldPrediction> server_predictions_; + // Predictions from the Autofill server which are not intended for general + // consumption. They are used for metrics and/or finch experiments. + std::vector< + AutofillQueryResponse::FormSuggestion::FieldSuggestion::FieldPrediction> + experimental_server_predictions_; // Whether the server-side classification believes that the field // may be pre-filled with a placeholder in the value attribute.
diff --git a/components/autofill/core/browser/autofill_form_test_utils.cc b/components/autofill/core/browser/autofill_form_test_utils.cc index 55e03c6..24fc341 100644 --- a/components/autofill/core/browser/autofill_form_test_utils.cc +++ b/components/autofill/core/browser/autofill_form_test_utils.cc
@@ -116,6 +116,8 @@ ff.name = *dd.name; if (dd.value) ff.value = *dd.value; + if (dd.placeholder) + ff.placeholder = *dd.placeholder; ff.is_autofilled = dd.is_autofilled.value_or(false); ff.origin = dd.origin.value_or(f.main_frame_origin); ff.should_autocomplete = dd.should_autocomplete;
diff --git a/components/autofill/core/browser/autofill_form_test_utils.h b/components/autofill/core/browser/autofill_form_test_utils.h index c49f6df..a70246d2 100644 --- a/components/autofill/core/browser/autofill_form_test_utils.h +++ b/components/autofill/core/browser/autofill_form_test_utils.h
@@ -49,6 +49,7 @@ absl::optional<std::u16string> label; absl::optional<std::u16string> name; absl::optional<std::u16string> value; + absl::optional<std::u16string> placeholder; const std::string autocomplete_attribute; absl::optional<AutocompleteParsingResult> parsed_autocomplete; const std::string form_control_type = "text";
diff --git a/components/autofill/core/browser/autofill_type.cc b/components/autofill/core/browser/autofill_type.cc index 12ba1841..9210bee 100644 --- a/components/autofill/core/browser/autofill_type.cc +++ b/components/autofill/core/browser/autofill_type.cc
@@ -116,6 +116,7 @@ case PRICE: case SEARCH_TERM: + case NUMERIC_QUANTITY: return FieldTypeGroup::kUnfillable; case UNKNOWN_TYPE:
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc index 659dec52..eb7917d 100644 --- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -36,6 +36,7 @@ #include "build/chromeos_buildflags.h" #include "components/autofill/core/browser/autocomplete_history_manager.h" #include "components/autofill/core/browser/autofill_download_manager.h" +#include "components/autofill/core/browser/autofill_form_test_utils.h" #include "components/autofill/core/browser/autofill_suggestion_generator.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/data_model/autofill_profile.h" @@ -3925,88 +3926,140 @@ } } -// Test that a field with an unrecognized autocomplete attribute is not filled. -TEST_F(BrowserAutofillManagerTest, FillAddressForm_UnrecognizedAttribute) { - FormData address_form; - address_form.name = u"MyForm"; - address_form.url = GURL("https://myform.com/form.html"); - address_form.action = GURL("https://myform.com/submit.html"); - FormFieldData field; - // Set a valid autocomplete attribute for the first name. - test::CreateTestFormField("First name", "firstname", "", "text", "given-name", - &field); - address_form.fields.push_back(field); - // Set no autocomplete attribute for the middle name. - test::CreateTestFormField("Middle name", "middle", "", "text", "", &field); - address_form.fields.push_back(field); - // Set an unrecognized autocomplete attribute for the last name. - test::CreateTestFormField("Last name", "lastname", "", "text", "unrecognized", - &field); - address_form.fields.push_back(field); - std::vector<FormData> address_forms(1, address_form); - FormsSeen(address_forms); +// Test parameter data for tests with a simple structure: Create a form, +// autofill it, check that values have been correctly filled. +struct AutofillSimpleFormCase { + struct FormFieldExpectedData { + const char* label; + const char* name; + const char* value = ""; + }; - // Fill the address form. - const char guid[] = "00000000-0000-0000-0000-000000000001"; + const std::string test_name; + const std::string cc_guid = ""; + const std::string profile_guid = "00000000-0000-0000-0000-000000000001"; + + const test::FormDescription form_description; + const std::vector<FormFieldExpectedData> expected_form_fields; +}; + +class AutofillSimpleFormTest + : public BrowserAutofillManagerTest, + public ::testing::WithParamInterface<AutofillSimpleFormCase> {}; + +const AutofillSimpleFormCase kAutofillSimpleFormCases[] = { + // Test that a field with an unrecognized autocomplete attribute is not + // filled. + {.test_name = "FillAddressForm_UnrecognizedAttribute", + .form_description = + {.fields = {{.label = u"First name", + .name = u"firstname", + .autocomplete_attribute = "given-name"}, + {.label = u"Middle name", .name = u"middle"}, + {.label = u"Last name", + .name = u"lastname", + .autocomplete_attribute = "unrecognized"}}}, + .expected_form_fields = + {{.label = "First name", .name = "firstname", .value = "Elvis"}, + {.label = "Middle name", .name = "middle", .value = "Aaron"}, + {.label = "Last name", .name = "lastname"}}}, + + // Test that non credit card related fields with the autocomplete attribute + // set to off are filled on all platforms when the feature to autofill all + // addresses is enabled (default). + {.test_name = "FillAddressForm_AutocompleteOffNotRespected", + .form_description = + {.fields = {{.label = u"First name", .name = u"firstname"}, + {.label = u"Middle name", + .name = u"middle", + .should_autocomplete = false}, + {.label = u"Last name", .name = u"lastname"}, + {.label = u"Address Line 1", + .name = u"addr1", + .should_autocomplete = false}}}, + .expected_form_fields = + {{.label = "First name", .name = "firstname", .value = "Elvis"}, + {.label = "Middle name", .name = "middle", .value = "Aaron"}, + {.label = "Last name", .name = "lastname", .value = "Presley"}, + {.label = "Address Line 1", + .name = "addr1", + .value = "3734 Elvis Presley Blvd."}}}, + + // Test that a field with a value equal to it's placeholder attribute is + // filled. + {.test_name = "FillAddressForm_PlaceholderEqualsValue", + .form_description = {.fields = {{.label = u"First name", + .name = u"firstname", + .value = u"First Name", + .placeholder = u"First Name"}, + {.label = u"Middle name", + .name = u"middle", + .value = u"Middle Name", + .placeholder = u"Middle Name"}, + {.label = u"Last name", + .name = u"lastname", + .value = u"Last Name", + .placeholder = u"Last Name"}}}, + .expected_form_fields = + {{.label = "First name", .name = "firstname", .value = "Elvis"}, + {.label = "Middle name", .name = "middle", .value = "Aaron"}, + {.label = "Last name", .name = "lastname", .value = "Presley"}}}, + + // Test that a credit card field with an unrecognized autocomplete attribute + // gets filled. + {.test_name = "FillCreditCardForm_UnrecognizedAttribute", + .cc_guid = "00000000-0000-0000-0000-000000000004", + .profile_guid = "", + .form_description = + {.fields = {{.label = u"Name on Card", + .name = u"nameoncard", + .autocomplete_attribute = "cc-name"}, + {.label = u"Card Number", .name = u"cardnumber"}, + {.label = u"Expiration Date", + .name = u"ccmonth", + .autocomplete_attribute = "unrecognized"}}}, + .expected_form_fields = {{.label = "Name on Card", + .name = "nameoncard", + .value = "Elvis Presley"}, + {.label = "Card Number", + .name = "cardnumber", + .value = "4234567890123456"}, + {.label = "Expiration Date", + .name = "ccmonth", + .value = "04/2999"}}}, + +}; + +TEST_P(AutofillSimpleFormTest, FillSimpleForm) { + const AutofillSimpleFormCase& params = GetParam(); + FormData form = test::GetFormData(params.form_description); + form.name = u"MyForm"; + form.url = GURL("https://myform.com/form.html"); + form.action = GURL("https://myform.com/submit.html"); + + FormsSeen({form}); + int response_page_id = 0; FormData response_data; FillAutofillFormDataAndSaveResults( - kDefaultPageID, address_form, address_form.fields[0], - MakeFrontendId(std::string(), guid), &response_page_id, &response_data); + kDefaultPageID, form, form.fields[0], + MakeFrontendId(params.cc_guid, params.profile_guid), &response_page_id, + &response_data); - // The fist and middle names should be filled. - ExpectFilledField("First name", "firstname", "Elvis", "text", - response_data.fields[0]); - ExpectFilledField("Middle name", "middle", "Aaron", "text", - response_data.fields[1]); - - // The last name should not be filled. - ExpectFilledField("Last name", "lastname", "", "text", - response_data.fields[2]); + ASSERT_EQ(response_data.fields.size(), params.expected_form_fields.size()); + for (size_t i = 0; i < response_data.fields.size(); ++i) { + SCOPED_TRACE(params.test_name + ", fields expectations"); + const auto& [label, name, value] = params.expected_form_fields[i]; + ExpectFilledField(label, name, value, "text", response_data.fields[i]); + } } -// Test that non credit card related fields with the autocomplete attribute set -// to off are filled on all platforms when the feature to autofill all addresses -// is enabled (default). -TEST_F(BrowserAutofillManagerTest, - FillAddressForm_AutocompleteOffNotRespected) { - FormData address_form; - address_form.name = u"MyForm"; - address_form.url = GURL("https://myform.com/form.html"); - address_form.action = GURL("https://myform.com/submit.html"); - FormFieldData field; - test::CreateTestFormField("First name", "firstname", "", "text", &field); - address_form.fields.push_back(field); - test::CreateTestFormField("Middle name", "middle", "", "text", &field); - field.should_autocomplete = false; - address_form.fields.push_back(field); - test::CreateTestFormField("Last name", "lastname", "", "text", &field); - field.should_autocomplete = true; - address_form.fields.push_back(field); - test::CreateTestFormField("Address Line 1", "addr1", "", "text", &field); - field.should_autocomplete = false; - address_form.fields.push_back(field); - std::vector<FormData> address_forms(1, address_form); - FormsSeen(address_forms); - - // Fill the address form. - const char guid[] = "00000000-0000-0000-0000-000000000001"; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - kDefaultPageID, address_form, address_form.fields[0], - MakeFrontendId(std::string(), guid), &response_page_id, &response_data); - - // All fields should be filled. - ExpectFilledField("First name", "firstname", "Elvis", "text", - response_data.fields[0]); - ExpectFilledField("Middle name", "middle", "Aaron", "text", - response_data.fields[1]); - ExpectFilledField("Last name", "lastname", "Presley", "text", - response_data.fields[2]); - ExpectFilledField("Address Line 1", "addr1", "3734 Elvis Presley Blvd.", - "text", response_data.fields[3]); -} +INSTANTIATE_TEST_SUITE_P( + BrowserAutofillManagerTest, + AutofillSimpleFormTest, + ::testing::ValuesIn(kAutofillSimpleFormCases), + [](const ::testing::TestParamInfo<AutofillSimpleFormTest::ParamType>& + info) { return info.param.test_name; }); // Test that if a company is of a format of a birthyear and the relevant feature // is enabled, we would not fill it. @@ -4055,89 +4108,6 @@ ExpectFilledField("Company", "company", "", "text", response_data.fields[3]); } -// Test that a field with a value equal to it's placeholder attribute is filled. -TEST_F(BrowserAutofillManagerTest, FillAddressForm_PlaceholderEqualsValue) { - FormData address_form; - address_form.name = u"MyForm"; - address_form.url = GURL("https://myform.com/form.html"); - address_form.action = GURL("https://myform.com/submit.html"); - FormFieldData field; - // Set the same placeholder and value for each field. - test::CreateTestFormField("First name", "firstname", "", "text", &field); - field.placeholder = u"First Name"; - field.value = u"First Name"; - address_form.fields.push_back(field); - test::CreateTestFormField("Middle name", "middle", "", "text", &field); - field.placeholder = u"Middle Name"; - field.value = u"Middle Name"; - address_form.fields.push_back(field); - test::CreateTestFormField("Last name", "lastname", "", "text", &field); - field.placeholder = u"Last Name"; - field.value = u"Last Name"; - address_form.fields.push_back(field); - std::vector<FormData> address_forms(1, address_form); - FormsSeen(address_forms); - - // Fill the address form. - const char guid[] = "00000000-0000-0000-0000-000000000001"; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults( - kDefaultPageID, address_form, address_form.fields[0], - MakeFrontendId(std::string(), guid), &response_page_id, &response_data); - - // All the fields should be filled. - ExpectFilledField("First name", "firstname", "Elvis", "text", - response_data.fields[0]); - ExpectFilledField("Middle name", "middle", "Aaron", "text", - response_data.fields[1]); - ExpectFilledField("Last name", "lastname", "Presley", "text", - response_data.fields[2]); -} - -// Test that a credit card field with an unrecognized autocomplete attribute -// gets filled. -TEST_F(BrowserAutofillManagerTest, FillCreditCardForm_UnrecognizedAttribute) { - // Set up the form data. - FormData form; - form.name = u"MyForm"; - form.url = GURL("https://myform.com/form.html"); - form.action = GURL("https://myform.com/submit.html"); - - FormFieldData field; - // Set a valid autocomplete attribute on the card name. - test::CreateTestFormField("Name on Card", "nameoncard", "", "text", "cc-name", - &field); - form.fields.push_back(field); - // Set no autocomplete attribute on the card number. - test::CreateTestFormField("Card Number", "cardnumber", "", "text", "", - &field); - form.fields.push_back(field); - // Set an unrecognized autocomplete attribute on the expiration month. - test::CreateTestFormField("Expiration Date", "ccmonth", "", "text", - "unrecognized", &field); - form.fields.push_back(field); - std::vector<FormData> forms(1, form); - FormsSeen(forms); - - const char guid[] = "00000000-0000-0000-0000-000000000004"; - int response_page_id = 0; - FormData response_data; - FillAutofillFormDataAndSaveResults(kDefaultPageID, form, *form.fields.begin(), - MakeFrontendId(guid, std::string()), - &response_page_id, &response_data); - - // The credit card name and number should be filled. - ExpectFilledField("Name on Card", "nameoncard", "Elvis Presley", "text", - response_data.fields[0]); - ExpectFilledField("Card Number", "cardnumber", "4234567890123456", "text", - response_data.fields[1]); - - // The expiration month should be filled. - ExpectFilledField("Expiration Date", "ccmonth", "04/2999", "text", - response_data.fields[2]); -} - // Test that credit card fields are filled even if they have the autocomplete // attribute set to off. TEST_F(BrowserAutofillManagerTest, FillCreditCardForm_AutocompleteOff) {
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc index 92392e0e..bfbdf55 100644 --- a/components/autofill/core/browser/field_types.cc +++ b/components/autofill/core/browser/field_types.cc
@@ -141,6 +141,7 @@ case FIELD_WITH_DEFAULT_VALUE: case MERCHANT_EMAIL_SIGNUP: case PRICE: + case NUMERIC_QUANTITY: case SEARCH_TERM: case BIRTHDATE_DAY: case BIRTHDATE_MONTH: @@ -293,6 +294,8 @@ return "SEARCH_TERM"; case PRICE: return "PRICE"; + case NUMERIC_QUANTITY: + return "NUMERIC_QUANTITY"; case NOT_PASSWORD: return "NOT_PASSWORD"; case SINGLE_USERNAME:
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h index 332c19b..7c26d70d 100644 --- a/components/autofill/core/browser/field_types.h +++ b/components/autofill/core/browser/field_types.h
@@ -348,11 +348,16 @@ // Reserved for a server-side-only use: 127 + // Type of a field that asks for a numeric quantity. Not fillable by Autofill. + // The purpose is to ignore false positive server classification for numeric + // types that a prone to false-positive votes. + NUMERIC_QUANTITY = 128, + // No new types can be added without a corresponding change to the Autofill // server. // Please update enum `AutofillServerFieldType` in // `tools/metrics/histogram/enums.xml` for metrics tracking. - MAX_VALID_FIELD_TYPE = 128, + MAX_VALID_FIELD_TYPE = 129, }; enum class FieldTypeGroup {
diff --git a/components/autofill/core/browser/field_types_unittest.cc b/components/autofill/core/browser/field_types_unittest.cc index 7b194dad..a29050d 100644 --- a/components/autofill/core/browser/field_types_unittest.cc +++ b/components/autofill/core/browser/field_types_unittest.cc
@@ -92,6 +92,7 @@ BIRTHDATE_DAY, BIRTHDATE_MONTH, BIRTHDATE_4_DIGIT_YEAR, + NUMERIC_QUANTITY, }; ServerFieldType kInvalidValue = static_cast<ServerFieldType>(123456); ASSERT_FALSE(kValidFieldTypes.count(kInvalidValue));
diff --git a/components/autofill/core/browser/form_parsing/address_field.cc b/components/autofill/core/browser/form_parsing/address_field.cc index 6fc42efe..1415214 100644 --- a/components/autofill/core/browser/form_parsing/address_field.cc +++ b/components/autofill/core/browser/form_parsing/address_field.cc
@@ -11,7 +11,6 @@ #include <utility> #include "base/check.h" -#include "base/strings/string_util.h" #include "components/autofill/core/browser/autofill_field.h" #include "components/autofill/core/browser/field_types.h" #include "components/autofill/core/browser/form_parsing/autofill_scanner.h"
diff --git a/components/autofill/core/browser/form_parsing/form_field.cc b/components/autofill/core/browser/form_parsing/form_field.cc index 9a3bfe9..7e89349 100644 --- a/components/autofill/core/browser/form_parsing/form_field.cc +++ b/components/autofill/core/browser/form_parsing/form_field.cc
@@ -28,14 +28,15 @@ #include "components/autofill/core/browser/form_parsing/iban_field.h" #include "components/autofill/core/browser/form_parsing/merchant_promo_code_field.h" #include "components/autofill/core/browser/form_parsing/name_field.h" +#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h" #include "components/autofill/core/browser/form_parsing/phone_field.h" #include "components/autofill/core/browser/form_parsing/price_field.h" #include "components/autofill/core/browser/form_parsing/search_field.h" #include "components/autofill/core/browser/form_parsing/standalone_cvc_field.h" #include "components/autofill/core/browser/form_parsing/travel_field.h" -#include "components/autofill/core/common/autocomplete_parsing_util.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/logging/log_manager.h" +#include "components/autofill/core/common/autocomplete_parsing_util.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_internals/log_message.h" @@ -104,6 +105,11 @@ log_manager); } + // Numeric quantity pass. + ParseFormFieldsPass(NumericQuantityField::Parse, processed_fields, + field_candidates, page_language, pattern_source, + log_manager); + // Credit card pass. ParseFormFieldsPass(CreditCardField::Parse, processed_fields, field_candidates, page_language, pattern_source,
diff --git a/components/autofill/core/browser/form_parsing/form_field.h b/components/autofill/core/browser/form_parsing/form_field.h index 4d15cf3..962308ce 100644 --- a/components/autofill/core/browser/form_parsing/form_field.h +++ b/components/autofill/core/browser/form_parsing/form_field.h
@@ -105,6 +105,7 @@ static constexpr float kBaseNameParserScore = 0.9f; static constexpr float kBaseMerchantPromoCodeParserScore = 0.85f; static constexpr float kBaseSearchParserScore = 0.8f; + static constexpr float kBaseNumericQuantityParserScore = 0.75f; static constexpr float kBaseAutocompleteParserScore = 0.05f; // Only derived classes may instantiate.
diff --git a/components/autofill/core/browser/form_parsing/form_field_unittest.cc b/components/autofill/core/browser/form_parsing/form_field_unittest.cc index c3997d1..dd0be09 100644 --- a/components/autofill/core/browser/form_parsing/form_field_unittest.cc +++ b/components/autofill/core/browser/form_parsing/form_field_unittest.cc
@@ -10,7 +10,6 @@ #include "base/test/scoped_feature_list.h" #include "components/autofill/core/browser/autofill_field.h" #include "components/autofill/core/browser/form_parsing/autofill_scanner.h" -#include "components/autofill/core/browser/form_parsing/buildflags.h" #include "components/autofill/core/browser/form_parsing/form_field.h" #include "components/autofill/core/browser/form_parsing/parsing_test_utils.h" #include "components/autofill/core/browser/form_structure.h"
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc b/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc new file mode 100644 index 0000000..54a0592 --- /dev/null +++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc
@@ -0,0 +1,45 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h" + +#include "components/autofill/core/browser/autofill_field.h" +#include "components/autofill/core/browser/form_parsing/autofill_scanner.h" +#include "components/autofill/core/browser/form_parsing/regex_patterns.h" +#include "components/autofill/core/common/autofill_regex_constants.h" + +namespace autofill { + +// static +std::unique_ptr<FormField> NumericQuantityField::Parse( + AutofillScanner* scanner, + const LanguageCode& page_language, + PatternSource pattern_source, + LogManager* log_manager) { + AutofillField* field; + base::span<const MatchPatternRef> quantity_patterns = + GetMatchPatterns("NUMERIC_QUANTITY", page_language, pattern_source); + + if (ParseFieldSpecifics( + scanner, kNumericQuantityRe, + kDefaultMatchParamsWith< + MatchFieldType::kNumber, MatchFieldType::kSelect, + MatchFieldType::kTextArea, MatchFieldType::kSearch>, + quantity_patterns, &field, {log_manager, "kNumericQuantityRe"})) { + return base::WrapUnique(new NumericQuantityField(field)); + } + + return nullptr; +} + +NumericQuantityField::NumericQuantityField(const AutofillField* field) + : field_(field) {} + +void NumericQuantityField::AddClassifications( + FieldCandidatesMap& field_candidates) const { + AddClassification(field_, NUMERIC_QUANTITY, kBaseNumericQuantityParserScore, + field_candidates); +} + +} // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field.h b/components/autofill/core/browser/form_parsing/numeric_quantity_field.h new file mode 100644 index 0000000..d70241d --- /dev/null +++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field.h
@@ -0,0 +1,42 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_ + +#include <memory> + +#include "base/memory/raw_ptr.h" +#include "components/autofill/core/browser/form_parsing/form_field.h" +#include "components/autofill/core/common/language_code.h" + +namespace autofill { + +class AutofillField; +class AutofillScanner; +class LogManager; + +// Numeric quantities that are not eligible to be filled by Autofill. +class NumericQuantityField : public FormField { + public: + static std::unique_ptr<FormField> Parse(AutofillScanner* scanner, + const LanguageCode& page_language, + PatternSource pattern_source, + LogManager* log_manager); + + NumericQuantityField(const NumericQuantityField&) = delete; + NumericQuantityField& operator=(const NumericQuantityField&) = delete; + + protected: + void AddClassifications(FieldCandidatesMap& field_candidates) const override; + + private: + explicit NumericQuantityField(const AutofillField* field); + + raw_ptr<const AutofillField> field_; +}; + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc b/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc new file mode 100644 index 0000000..dca79c6 --- /dev/null +++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc
@@ -0,0 +1,46 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h" + +#include "components/autofill/core/browser/form_parsing/parsing_test_utils.h" + +namespace autofill { + +class NumericQuantityFieldTest + : public FormFieldTestBase, + public testing::TestWithParam<PatternProviderFeatureState> { + public: + explicit NumericQuantityFieldTest() : FormFieldTestBase(GetParam()) {} + NumericQuantityFieldTest(const NumericQuantityFieldTest&) = delete; + NumericQuantityFieldTest& operator=(const NumericQuantityFieldTest&) = delete; + + protected: + std::unique_ptr<FormField> Parse( + AutofillScanner* scanner, + const LanguageCode& page_language = LanguageCode("en")) override { + return NumericQuantityField::Parse(scanner, page_language, + GetActivePatternSource(), + /*log_manager=*/nullptr); + } +}; + +INSTANTIATE_TEST_SUITE_P( + NumericQuantityFieldTest, + NumericQuantityFieldTest, + ::testing::ValuesIn(PatternProviderFeatureState::All())); + +TEST_P(NumericQuantityFieldTest, ParseNumericQuantity) { + AddTextFormFieldData("quantity", "quantity", NUMERIC_QUANTITY); + + ClassifyAndVerify(ParseResult::PARSED); +} + +TEST_P(NumericQuantityFieldTest, ParseNonNumericQuantity) { + AddTextFormFieldData("name", "Name", UNKNOWN_TYPE); + + ClassifyAndVerify(ParseResult::NOT_PARSED); +} + +} // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json b/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json index eab373e..d5c4b67 100644 --- a/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json +++ b/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json
@@ -1298,6 +1298,18 @@ } ] }, + "NUMERIC_QUANTITY": { + "en": [ + { + "pattern_identifier": "en_numeric_quantity_preserving", + "positive_pattern": "size|height|quantity|length|amount", + "positive_score": 0.95, + "negative_pattern": null, + "match_field_attributes": ["LABEL", "NAME"], + "match_field_input_types": ["TEXT", "SELECT", "TEXT_AREA", "NUMBER", "SEARCH"] + } + ] + }, "PRICE": { "en": [ {
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index bcf94a6f..a14530ab 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -1054,6 +1054,33 @@ const ServerFieldTypeSet& field_types = field->possible_types(); DCHECK(!field_types.empty()); + // For every field that has a heuristics prediction for a + // NUMERIC_QUANTITY, log if there was a colliding server + // prediction and if the NUMERIC_QUANTITY was a false-positive prediction. + // The latter is true when the field was correctly filled. This can + // only be recorded when the feature to grant precedence to + // NUMERIC_QUANTITY predictions is disabled. + if (observed_submission && field->heuristic_type() == NUMERIC_QUANTITY) { + bool field_has_non_empty_server_prediction = + field->server_type() != UNKNOWN_TYPE && + field->server_type() != NO_SERVER_DATA; + + // Log if there was a colliding server prediction. + AutofillMetrics::LogNumericQuantityCollidesWithServerPrediction( + field_has_non_empty_server_prediction); + + // If there was a collision, log if the NUMERIC_QUANTITY was a false + // positive since the field was correctly filled. + if ((field->is_autofilled || field->previously_autofilled()) && + field_has_non_empty_server_prediction && + !base::FeatureList::IsEnabled( + features::kAutofillGivePrecedenceToNumericQuantitites)) { + AutofillMetrics:: + LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction( + !field->previously_autofilled()); + } + } + // Skip all remaining metrics if there wasn't a single possible field type // detected. if (!FieldHasMeaningfulFieldTypes(*field))
diff --git a/components/autofill/core/browser/form_structure_rationalizer.cc b/components/autofill/core/browser/form_structure_rationalizer.cc index 4e5b574..2866cfa 100644 --- a/components/autofill/core/browser/form_structure_rationalizer.cc +++ b/components/autofill/core/browser/form_structure_rationalizer.cc
@@ -286,11 +286,6 @@ previous_field.server_type_prediction_is_override()) { continue; } - // TODO(crbug.com/1326425): Remove once feature is lanuched. - if (!base::FeatureList::IsEnabled( - features::kAutofillRationalizeStreetAddressAndAddressLine)) { - continue; - } LOG_AF(log_manager) << LoggingScope::kRationalization << LogMessage::kRationalization << "Street Address Rationalization: Converting sequence of (street "
diff --git a/components/autofill/core/browser/form_structure_rationalizer_unittest.cc b/components/autofill/core/browser/form_structure_rationalizer_unittest.cc index b2b7715..f2771cd 100644 --- a/components/autofill/core/browser/form_structure_rationalizer_unittest.cc +++ b/components/autofill/core/browser/form_structure_rationalizer_unittest.cc
@@ -229,10 +229,6 @@ } TEST_F(FormStructureRationalizerTest, RationalizeStreetAddressAndAddressLine) { - base::test::ScopedFeatureList enabled; - enabled.InitAndEnableFeature( - features::kAutofillRationalizeStreetAddressAndAddressLine); - auto [form, response_string] = CreateFormAndServerClassification({ {"Full Name", "fullName", NAME_FULL}, {"Address1", "address1", ADDRESS_HOME_STREET_ADDRESS},
diff --git a/components/autofill/core/browser/form_structure_test_api.cc b/components/autofill/core/browser/form_structure_test_api.cc index 983985f..e6e1fc0b 100644 --- a/components/autofill/core/browser/form_structure_test_api.cc +++ b/components/autofill/core/browser/form_structure_test_api.cc
@@ -4,6 +4,7 @@ #include "components/autofill/core/browser/form_structure_test_api.h" +#include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/form_parsing/field_candidates.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -14,12 +15,14 @@ using ::testing::Contains; using ::testing::Each; using ::testing::Pair; +using FieldPrediction = + AutofillQueryResponse::FormSuggestion::FieldSuggestion::FieldPrediction; // static void FormStructureTestApi::SetFieldTypes( const std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>& heuristic_types, - const std::vector<ServerFieldType>& server_types) { + const std::vector<FieldPrediction>& server_types) { ASSERT_EQ(form_structure_->field_count(), heuristic_types.size()); ASSERT_EQ(form_structure_->field_count(), server_types.size()); ASSERT_THAT(heuristic_types, @@ -32,16 +35,23 @@ for (const auto& [source, type] : heuristic_types[i]) form_field->set_heuristic_type(source, type); - AutofillQueryResponse::FormSuggestion::FieldSuggestion::FieldPrediction - prediction; - prediction.set_type(server_types[i]); - form_field->set_server_predictions({prediction}); + form_field->set_server_predictions({server_types[i]}); } form_structure_->UpdateAutofillCount(); } void FormStructureTestApi::SetFieldTypes( + const std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>& + heuristic_types, + const std::vector<ServerFieldType>& server_types) { + std::vector<FieldPrediction> server_predictions; + for (ServerFieldType type : server_types) + server_predictions.push_back(::autofill::test::CreateFieldPrediction(type)); + SetFieldTypes(heuristic_types, server_predictions); +} + +void FormStructureTestApi::SetFieldTypes( const std::vector<ServerFieldType>& heuristic_types, const std::vector<ServerFieldType>& server_types) { std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>
diff --git a/components/autofill/core/browser/form_structure_test_api.h b/components/autofill/core/browser/form_structure_test_api.h index d373db9..b0530cd 100644 --- a/components/autofill/core/browser/form_structure_test_api.h +++ b/components/autofill/core/browser/form_structure_test_api.h
@@ -58,6 +58,11 @@ void SetFieldTypes( const std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>& heuristic_types, + const std::vector<AutofillQueryResponse::FormSuggestion::FieldSuggestion:: + FieldPrediction>& server_types); + void SetFieldTypes( + const std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>& + heuristic_types, const std::vector<ServerFieldType>& server_types); // Set the heuristic and server types for each field. The `heuristic_types`
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index 8c187dd4..fdac98f 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -124,8 +124,14 @@ #endif }; +Matcher<FieldPrediction> EqualsPrediction(const FieldPrediction& prediction) { + return AllOf( + Property("type", &FieldPrediction::type, prediction.type()), + Property("source", &FieldPrediction::source, prediction.source())); +} + Matcher<FieldPrediction> EqualsPrediction(ServerFieldType type) { - return Property(&FieldPrediction::type, type); + return Property("type", &FieldPrediction::type, type); } } // namespace @@ -6500,6 +6506,112 @@ FormStructure::FindFieldsEligibleForManualFilling(forms)); } +// Test that experimental server predictions are not used. +TEST_F(FormStructureTestImpl, ExperimentalServerPredictionsAreSeparate) { + FormData form_data; + form_data.url = GURL("http://foo.com"); + + // Add 6 fields. + for (int i = 0; i < 6; i++) { + FormFieldData field; + field.form_control_type = "text"; + field.label = field.name = base::NumberToString16(i); + field.unique_renderer_id = test::MakeFieldRendererId(); + form_data.fields.push_back(field); + } + + FormStructure form(form_data); + form.DetermineHeuristicTypes(nullptr, nullptr); + + const auto default_autofill_prediction = CreateFieldPrediction( + NAME_FIRST, FieldPrediction::SOURCE_AUTOFILL_DEFAULT); + const auto default_password_prediction = CreateFieldPrediction( + USERNAME, FieldPrediction::SOURCE_PASSWORDS_DEFAULT); + const auto experimental_prediction = CreateFieldPrediction( + EMAIL_ADDRESS, FieldPrediction::SOURCE_ALL_APPROVED_EXPERIMENTS); + const auto null_prediction = CreateFieldPrediction( + NO_SERVER_DATA, FieldPrediction::SOURCE_UNSPECIFIED); + const auto unknown_prediction_source = CreateFieldPrediction( + PHONE_HOME_NUMBER, FieldPrediction::SOURCE_UNSPECIFIED); + + // Setup the query response. Default predictions must be returned by + // `server_type()` and `server_predictions()` as provided. + AutofillQueryResponse response; + auto* form_suggestion = response.add_form_suggestions(); + // 2 default + 1 experimental predictions. + AddFieldPredictionsToForm( + form_data.fields[0], + {default_autofill_prediction, default_password_prediction, + experimental_prediction}, + form_suggestion); + // 1 default + 1 experimental predictions. + AddFieldPredictionsToForm( + form_data.fields[1], + {default_autofill_prediction, experimental_prediction}, form_suggestion); + // 2 default predictions. + AddFieldPredictionsToForm( + form_data.fields[2], + {default_autofill_prediction, default_password_prediction}, + form_suggestion); + // 1 null + 1 experimental predictions. + AddFieldPredictionsToForm(form_data.fields[3], + {null_prediction, experimental_prediction}, + form_suggestion); + // 1 experimental prediction. The server doesn't do that, but we can defend + // against it anyway. The default prediction should be effectively + // `NO_SERVER_DATA`. + AddFieldPredictionsToForm(form_data.fields[4], {experimental_prediction}, + form_suggestion); + // A prediction without the source specified. + AddFieldPredictionsToForm(form_data.fields[5], {unknown_prediction_source}, + form_suggestion); + + // Parse the response and update the field type predictions. + std::vector<FormStructure*> forms{&form}; + FormStructure::ParseApiQueryResponse(SerializeAndEncode(response), forms, + test::GetEncodedSignatures(forms), + nullptr, nullptr); + + ASSERT_EQ(form.field_count(), 6U); + + auto form_as_span = base::make_span(form.begin(), form.end()); + EXPECT_THAT( + form_as_span, + Each(Pointee(Property(&AutofillField::server_type, + Not(AnyOf(experimental_prediction.type(), + unknown_prediction_source.type())))))) + << "server_type() must not return a type provided as an experiment."; + + // `server_predictions` should only return default predictions. + EXPECT_THAT(form.field(0)->server_predictions(), + ElementsAre(EqualsPrediction(default_autofill_prediction), + EqualsPrediction(default_password_prediction))); + EXPECT_THAT(form.field(1)->server_predictions(), + ElementsAre(EqualsPrediction(default_autofill_prediction))); + EXPECT_THAT(form.field(2)->server_predictions(), + ElementsAre(EqualsPrediction(default_autofill_prediction), + EqualsPrediction(default_password_prediction))); + EXPECT_THAT(form.field(3)->server_predictions(), + ElementsAre(EqualsPrediction(null_prediction))); + EXPECT_THAT(form.field(4)->server_predictions(), + ElementsAre(EqualsPrediction(null_prediction))); + EXPECT_THAT(form.field(5)->server_predictions(), + ElementsAre(EqualsPrediction(null_prediction))); + + // `experimental_server_predictions` should only return experimental + // predictions. + EXPECT_THAT(form.field(0)->experimental_server_predictions(), + ElementsAre(EqualsPrediction(experimental_prediction))); + EXPECT_THAT(form.field(1)->experimental_server_predictions(), + ElementsAre(EqualsPrediction(experimental_prediction))); + EXPECT_THAT(form.field(2)->experimental_server_predictions(), IsEmpty()); + EXPECT_THAT(form.field(3)->experimental_server_predictions(), + ElementsAre(EqualsPrediction(experimental_prediction))); + EXPECT_THAT(form.field(4)->experimental_server_predictions(), + ElementsAre(EqualsPrediction(experimental_prediction))); + EXPECT_THAT(form.field(5)->experimental_server_predictions(), IsEmpty()); +} + // Tests that ParseFieldTypesWithPatterns() sets (only) the PatternSource. TEST_P(FormStructureTest_ForPatternSource, ParseFieldTypesWithPatterns) { FormData form;
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc index eef13ac7..63988e0 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -365,6 +365,7 @@ case AMBIGUOUS_TYPE: case SEARCH_TERM: case PRICE: + case NUMERIC_QUANTITY: case NOT_PASSWORD: case SINGLE_USERNAME: case NOT_USERNAME: @@ -3288,4 +3289,20 @@ return result_suffix; } +// // static +void AutofillMetrics::LogNumericQuantityCollidesWithServerPrediction( + bool collision) { + base::UmaHistogramBoolean( + "Autofill.NumericQuantityCollidesWithServerPrediction", collision); +} + +// static +void AutofillMetrics:: + LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction( + bool accepted) { + base::UmaHistogramBoolean( + "Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction", + accepted); +} + } // namespace autofill
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.h b/components/autofill/core/browser/metrics/autofill_metrics.h index 1169240..2c29c28 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics.h +++ b/components/autofill/core/browser/metrics/autofill_metrics.h
@@ -1767,6 +1767,16 @@ ServerFieldType server_type, ServerFieldType heuristic_types); + // Logs whether a heuristic detection for an NUMERIC_QUANTITY collides with a + // server prediction. + static void LogNumericQuantityCollidesWithServerPrediction(bool collision); + + // Logs if the filling of a field was accepted even though it had a + // NUMERIC_QUANTITY. This metric is only emitted if the feature to grant the + // heuristic precedence is disabled. + static void LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction( + bool accepted); + private: static void Log(AutocompleteEvent event); };
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc index 93e5f27..b1ad5b43 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -646,6 +646,78 @@ BucketsAre(test_case.credit_card_buckets)); } +// Test the emission of collisions between NUMERIC_QUANTITY and server +// predictions as well as the potential false positives. +TEST_F(AutofillMetricsTest, NumericQuantityCollision) { + // Those metrics are only collected when the numeric quantities are not + // getting precedence over server predictions. + base::test::ScopedFeatureList numeric_quanity_feature_list; + numeric_quanity_feature_list.InitAndDisableFeature( + features::kAutofillGivePrecedenceToNumericQuantitites); + + // Set up our form data. + test::FormDescription form_description = { + .description_for_logging = "AutofilledStateFieldSource", + .fields = {{.server_type = NO_SERVER_DATA, + .heuristic_type = NUMERIC_QUANTITY, + .is_autofilled = false}, + // We add a second field to make sure the metrics are only + // recorded for the field with the numeric quantity prediction. + {.server_type = ADDRESS_HOME_LINE1, + .heuristic_type = ADDRESS_HOME_LINE1, + .is_autofilled = false}}}; + + // Helper to submit the `form` and test the expectations. `collision` + // indicates that there was a collision between the NUMERIC_QUANTITY + // prediction and a server prediction. + // If `autofill_used` and a `collision` exists, the histogram to + // track `false_positive` is checked. + auto SubmitAndTest = [this](const FormData& form, bool collision, + bool autofill_used, bool false_positive) { + base::HistogramTester histogram_tester; + SubmitForm(form); + histogram_tester.ExpectUniqueSample( + "Autofill.NumericQuantityCollidesWithServerPrediction", collision, 1); + if (collision && autofill_used) { + histogram_tester.ExpectUniqueSample( + "Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction", + false_positive, 1); + } + }; + + { + SCOPED_TRACE( + "No collision case - The numeric quanity does not collide with a " + "server prediction."); + FormData form = GetAndAddSeenForm(form_description); + SubmitAndTest(form, /*collision=*/false, /*autofill_used=*/false, + /*false_positive=*/false); + } + { + SCOPED_TRACE("Collision, but nothing is filled."); + // Add a server prediction to create a collision. + form_description.fields[0].server_type = NAME_FIRST; + FormData form = GetAndAddSeenForm(form_description); + SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/false, + /*false_positive=*/false); + } + { + SCOPED_TRACE("Collision, the field is autofilled."); + form_description.fields[0].is_autofilled = true; + FormData form = GetAndAddSeenForm(form_description); + SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/true, + /*false_positive=*/true); + } + { + SCOPED_TRACE( + "Collision, the field is autofilled and subsequently changed."); + FormData form = GetAndAddSeenForm(form_description); + SimulateUserChangedTextField(form, form.fields[0]); + SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/true, + /*false_positive=*/false); + } +} + // Test that we log quality metrics appropriately. TEST_F(AutofillMetricsTest, QualityMetrics) { // Set up our form data.
diff --git a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h index df95b860c..65b3af3 100644 --- a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h +++ b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
@@ -91,11 +91,9 @@ return form_interaction_counts_; } -#ifdef UNIT_TEST const FormInteractionsFlowId& form_interactions_flow_id_for_test() { return flow_id_; } -#endif protected: virtual ~FormEventLoggerBase();
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc index edb0c107..5db261253 100644 --- a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc +++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
@@ -96,8 +96,7 @@ // If this test fails after adding a type, update // `AutofillPredictionsComparisonResult` in tools/metrics/histograms/enums.xml // and set `last_known_type` to the last entry in the enum. - constexpr ServerFieldType last_known_type = - CREDIT_CARD_STANDALONE_VERIFICATION_CODE; + constexpr ServerFieldType last_known_type = NUMERIC_QUANTITY; int max_comparison = GetShadowPrediction(last_known_type, NAME_FIRST, {NAME_LAST});
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 90b9ab9..17e67c13 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -63,6 +63,12 @@ "AutofillAddressProfileSavePromptAddressVerificationSupport", base::FEATURE_DISABLED_BY_DEFAULT); +// Use the heuristic parser to detected unfillable numeric types in field labels +// and grant the heuristic precedence over non-override server predictions. +BASE_FEATURE(kAutofillGivePrecedenceToNumericQuantitites, + "AutofillGivePrecedenceToNumericQuantitites", + base::FEATURE_DISABLED_BY_DEFAULT); + // TODO(crbug.com/1135188): Remove this feature flag after the explicit save // prompts for address profiles is complete. // When enabled, address profile save problem will contain a dropdown for @@ -464,13 +470,6 @@ "AutofillProbableFormSubmissionInBrowser", base::FEATURE_DISABLED_BY_DEFAULT); -// If we observe a sequence of fields of (street address, address line 2), these -// get rationalized to (address line 1, address line 2). -// TODO(crbug.com/1326425): Remove once feature is lanuched. -BASE_FEATURE(kAutofillRationalizeStreetAddressAndAddressLine, - "AutofillRationalizeStreetAddressAndAddressLine", - base::FEATURE_ENABLED_BY_DEFAULT); - // Removes setting-inaccessible field types from existing profiles on startup. // TODO(crbug.com/1300548): Cleanup when launched. BASE_FEATURE(kAutofillRemoveInaccessibleProfileValuesOnStartup,
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index cc274fae..8954b8c 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -39,6 +39,8 @@ BASE_DECLARE_FEATURE( kAutofillAddressProfileSavePromptAddressVerificationSupport); COMPONENT_EXPORT(AUTOFILL) +BASE_DECLARE_FEATURE(kAutofillGivePrecedenceToNumericQuantitites); +COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAddressProfileSavePromptNicknameSupport); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillAllowDuplicateFormSubmissions); @@ -151,8 +153,6 @@ COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillProbableFormSubmissionInBrowser); COMPONENT_EXPORT(AUTOFILL) -BASE_DECLARE_FEATURE(kAutofillRationalizeStreetAddressAndAddressLine); -COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillRemoveInvalidPhoneNumberOnImport); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillRemoveInaccessibleProfileValuesOnStartup);
diff --git a/components/autofill/core/common/autofill_regex_constants.h b/components/autofill/core/common/autofill_regex_constants.h index 0d71910..3c9870b 100644 --- a/components/autofill/core/common/autofill_regex_constants.h +++ b/components/autofill/core/common/autofill_regex_constants.h
@@ -206,6 +206,12 @@ u"|\\bprix\\b|\\bcoût\\b|\\bcout\\b|\\btarif\\b"; // fr-CA ///////////////////////////////////////////////////////////////////////////// +// numeric_quanitity.cc +///////////////////////////////////////////////////////////////////////////// +inline constexpr char16_t kNumericQuantityRe[] = + u"size|height|quantity|length|amount"; + +///////////////////////////////////////////////////////////////////////////// // credit_card_field.cc ///////////////////////////////////////////////////////////////////////////// inline constexpr char16_t kNameOnCardRe[] =
diff --git a/components/autofill_assistant/browser/view_layout.proto b/components/autofill_assistant/browser/view_layout.proto index 933a251..535537b 100644 --- a/components/autofill_assistant/browser/view_layout.proto +++ b/components/autofill_assistant/browser/view_layout.proto
@@ -290,6 +290,7 @@ CREDIT_CARD = 7; NUMERIC = 8; PASSWORD = 9; + NUMERIC_PIN = 10; } // The hint to display when the input is empty.
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb index 83a1b53..e6037788 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -159,6 +159,7 @@ <translation id="4402755511846832236">Keer dat werwe weet wanneer jy hierdie toestel aktief gebruik</translation> <translation id="4428065317363009941">Advertensiepersonalisering</translation> <translation id="4434045419905280838">Opspringers en herleidings</translation> +<translation id="4440642537584213025">Vou <ph name="TARGET_DESCRIPTION" /> uit</translation> <translation id="445467742685312942">Laat werwe toe om beskermde inhoud te speel</translation> <translation id="4468959413250150279">Demp klank vir 'n spesifieke werf.</translation> <translation id="4475912480633855319">{COOKIES,plural, =1{# webkoekie}other{# webkoekies}}</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index 1b6eb99..7dc1e556 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">ማይክሮፎን</translation> <translation id="3248611290851046188">ይህ ጣቢያ የሚገልጸው ማስታወቂያዎችን ለእርስዎ ለማሳየት ሌሎች ጣቢያዎች ሊጠቀሙባቸው የሚችሏቸውን ዝንባሌዎች ነው። እንዲሁም ይህ ጣቢያ ይበልጥ አግባብነት ያላቸውን ማስታወቂያዎች ለእርስዎ ለማሳየት የእርስዎን ዝንባሌዎች ከChrome ያገኛል።</translation> <translation id="3277252321222022663">ጣቢያዎች ዳሳሾችን እንዲደርሱ ይፍቀዱላቸው (የሚመከር)</translation> +<translation id="3285500645985761267">ተዛማጅ ጣቢያዎች በቡድኑ ውስጥ ያለዎትን እንቅስቃሴ እንዲመለከቱ ይፍቀዱ</translation> <translation id="3295602654194328831">መረጃ ደብቅ</translation> <translation id="3328801116991980348">የጣቢያ መረጃ</translation> <translation id="3333961966071413176">ሁሉም እውቂያዎች</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">ጣቢያዎች አካባቢዎን እንዲያውቁ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation> <translation id="3521663503435878242">ከ<ph name="DOMAIN" /> ስር ያሉ ጣቢያዎች</translation> <translation id="3538390592868664640">ጣቢያዎች የዙሪያዎ የ3ል ካርታ እንዳይፈጥሩ ወይም የካሜራ ቦታን እንዳይከታተሉ ያግዷቸው</translation> +<translation id="3544058026430919413">አንድ ኩባንያ በቡድኑ ውስጥ ያለዎትን እንቅስቃሴ ለማጋራት ኩኪዎችን መጠቀም የሚችሉ የጣቢያዎች ቡድንን ሊገልጽ ይችላል። ይህ ማንነት የማያሳውቅ ውስጥ ጠፍቷል።</translation> <translation id="3551268116566418498">ከማንነት የማያሳውቅ ሁነታ ይውጣ?</translation> <translation id="3586500876634962664">የካሜራ እና ማይክሮፎን ጥቅም</translation> <translation id="358794129225322306">አንድ ጣቢያ በራስ-ሰር በርካታ ፋይሎችን እንዲያወርድ ይፍቀዱ።</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">ብቅ-ባዮች እና አቅጣጫ ማዞሮች</translation> <translation id="445467742685312942">ጣቢያዎች የተጠበቀ ይዘትን እንዲያጫውት ይፍቀዱ</translation> <translation id="4468959413250150279">በአንድ የተወሰነ ጣቢያ ላይ ድምጸ-ከል አድርግ።</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# ኩኪ}one{# ኩኪ}other{# ኩኪዎች}}</translation> <translation id="4479647676395637221">ጣቢያዎች ካሜራዎን እንዲጠቀሙ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation> <translation id="4505788138578415521">ዩአርኤል ተዘርግቷል</translation> <translation id="4534723447064627427"><ph name="APP_NAME" /> የእርስዎን ማይክራፎን እንዲደርስ ለማድረግ፣ በ <ph name="BEGIN_LINK" />Android ቅንብሮች<ph name="END_LINK" /> ውስጥ ማይክራፎንን በተጨማሪ ያብሩ።</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb index 8fe8386..031bb8d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">মাইক্ৰ’ফ’ন</translation> <translation id="3248611290851046188">এই ছাইটটোৱে সেই আগ্ৰহসমূহ সংজ্ঞাবদ্ধ কৰে যিবোৰ অন্য ছাইটে আপোনাক বিজ্ঞাপন দেখুৱাবলৈ ব্যৱহাৰ কৰিব পাৰে। আপোনাক অধিক প্ৰাসংগিক বিজ্ঞাপন দেখুৱাবলৈও এই ছাইটটোৱে Chromeৰ পৰা আপোনাৰ আগ্ৰহসমূহ পায়।</translation> <translation id="3277252321222022663">ছেন্সৰসমূহলৈ এক্সেছ পাবলৈ ছাইটসমূহক অনুমতি দিয়ক (চুপাৰিছ কৰা)</translation> +<translation id="3285500645985761267">জড়িত হৈ থকা ছাইটসমূহক গোটত আপুনি কৰা কাৰ্যকলাপ চাবলৈ অনুমতি দিয়ক</translation> <translation id="3295602654194328831">তথ্য লুকুৱাওক</translation> <translation id="3328801116991980348">ছাইটৰ তথ্য</translation> <translation id="3333961966071413176">সকলো সম্পৰ্ক</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">ছাইটসমূহে আপোনাৰ অৱস্থান জনাৰ অনুমতি দিয়াৰ পূৰ্বে সোধক (চুপাৰিছ কৰা হয়)</translation> <translation id="3521663503435878242"><ph name="DOMAIN" />ৰ অধীনত থকা ছাইট</translation> <translation id="3538390592868664640">ছাইটসমূহক আপোনাৰ চৌপাশৰ এখন 3D মেপ সৃষ্টি কৰাৰ পৰা অথবা কেমেৰাৰ স্থান ট্ৰেক কৰাৰ পৰা অৱৰোধ কৰক</translation> +<translation id="3544058026430919413">এটা কোম্পানীয়ে গোটটোত আপোনাৰ কাৰ্যকলাপ শ্বেয়াৰ কৰিবলৈ কুকি ব্যৱহাৰ কৰিব পৰা ছাইটৰ এটা গোট সংজ্ঞায়িত কৰিব পাৰে। এয়া ইনক’গনিট’ত অফ কৰা আছে।</translation> <translation id="3551268116566418498">ইনক’গনিট’ ম’ডৰ পৰা বাহিৰ হ’বনে?</translation> <translation id="3586500876634962664">কেমেৰা আৰু মাইক্ৰ’ফ’নৰ ব্যৱহাৰ</translation> <translation id="358794129225322306">এটা ছাইটক একাধিক ফাইল স্বয়ংক্ৰিয়ভাৱে ডাউনল’ড কৰাৰ অনুমতি দিয়ক।</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">পপ-আপ আৰু পুনৰ নির্দেশ</translation> <translation id="445467742685312942">ছাইটসমূহক সুৰক্ষিত সমল প্লে' কৰিবলৈ অনুমতি দিয়ক</translation> <translation id="4468959413250150279">নিৰ্দিষ্ট ছাইটৰ বাবে ধ্বনি মিউট কৰক।</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# টা কুকি}one{# টা কুকি}other{# টা কুকি}}</translation> <translation id="4479647676395637221">আপোনাৰ কেমেৰা ছাইটসমূহক ব্যৱহাৰ কৰিবলৈ দিয়াৰ পূর্বে অনুমতি ল'বলৈ দিয়ক(চুপাৰিছ কৰা)</translation> <translation id="4505788138578415521">URL বিস্তাৰ কৰা হৈছে</translation> <translation id="4534723447064627427"><ph name="APP_NAME" />ক আপোনাৰ মাইক্ৰ’ফ’ন এক্সেছ কৰিবলৈ দিবলৈ <ph name="BEGIN_LINK" />Android ছেটিংসমূহ<ph name="END_LINK" />তো মাইক্ৰ’ফ’ন অন কৰক।</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index e037301..235e9eb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3248611290851046188">Bu sayt digər saytların sizə reklam göstərmək üçün istifadə edə biləcəyi maraqları müəyyən edir. Bu sayt sizə daha uyğun reklamlar göstərmək üçün Chrome'dan maraqlarınızı da əldə edir.</translation> <translation id="3277252321222022663">Saytların sensorlara daxil olmasına icazə verin (tövsiyə edilir)</translation> +<translation id="3285500645985761267">Əlaqədar saytlara qrupdakı fəaliyyətinizi görməyə icazə verin</translation> <translation id="3295602654194328831">Məlumatı gizlədin</translation> <translation id="3328801116991980348">Sayt haqqında</translation> <translation id="3333961966071413176">Bütün kontaktar</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Saytlara məkanınızı bilmək icazəsi verməmişdən əvvəl soruşun (tövsiyə olunur)</translation> <translation id="3521663503435878242"><ph name="DOMAIN" /> domenindəki saytlar</translation> <translation id="3538390592868664640">Saytların ətrafınızdakı sahələrin 3D xəritəsini yaratmasına və ya kamera mövqeyini izləməsinə qarşı blok qoyun</translation> +<translation id="3544058026430919413">Şirkət qrupda fəaliyyətinizi paylaşmaq üçün kukilərdən istifadə edə biləcək saytlar qrupu təyin edə bilər. Bu, Anonim rejimdə deaktivdir.</translation> <translation id="3551268116566418498">Anonim rejimdən çıxılsın?</translation> <translation id="3586500876634962664">Kamera və mikrofondan istifadə</translation> <translation id="358794129225322306">Sayta çoxsaylı faylları avtomatik endirmək icazəsi verin.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Popap və yönləndirmələr</translation> <translation id="445467742685312942">Saytlara qorunan kontenti oxutmağa icazə verin</translation> <translation id="4468959413250150279">Xüsusi saytı səsiz rejimə keçirin.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# kuki}other{# kuki}}</translation> <translation id="4479647676395637221">Saytlara kameranızı istifadə etmək icazəsi verməmişdən əvvəl soruşun (tövsiyə olunur)</translation> <translation id="4505788138578415521">URL genişləndirilib</translation> <translation id="4534723447064627427"><ph name="APP_NAME" /> tətbiqinə mikrofonunuza giriş icazəsi vermək üçün <ph name="BEGIN_LINK" />Android Ayarlarında<ph name="END_LINK" /> mikrofonu da aktiv edin.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb index 131487d6..9796033 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -159,6 +159,7 @@ <translation id="4402755511846832236">Blokirajte web lokacijama informacije o vašem aktivnom korištenju ovog uređaja</translation> <translation id="4428065317363009941">Personalizacija oglasa</translation> <translation id="4434045419905280838">Skočni proz. i preusmjeravanja</translation> +<translation id="4440642537584213025">Proširi odjeljak <ph name="TARGET_DESCRIPTION" /></translation> <translation id="445467742685312942">Dozvoljava web lokacijama da reproduciraju zaštićen sadržaj</translation> <translation id="4468959413250150279">Isključen zvuk za određenu web lokaciju.</translation> <translation id="4475912480633855319">{COOKIES,plural, =1{# kolačić}one{# kolačić}few{# kolačića}other{# kolačića}}</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb index 7beb98a..fabbf0a1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3248611290851046188">Dette website definerer interesser, som andre websites kan bruge til at vise dig annoncer. Dette website henter også dine interesser fra Chrome og bruger dem til at vise dig mere relevante annoncer.</translation> <translation id="3277252321222022663">Tillad, at websites kan få adgang til sensorer (anbefales)</translation> +<translation id="3285500645985761267">Giv relaterede websites tilladelse til at se din aktivitet i gruppen</translation> <translation id="3295602654194328831">Skjul oplysninger</translation> <translation id="3328801116991980348">Webstedoplysninger</translation> <translation id="3333961966071413176">Alle kontakter</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Spørg, om websites må få adgang til din lokation (anbefales)</translation> <translation id="3521663503435878242">Websites på <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Bloker oprettelsen af 3D-kort over dine omgivelser eller registrering af kamerapositionen for websites</translation> +<translation id="3544058026430919413">En virksomhed kan definere en gruppe af websites, der kan bruge cookies til at dele din aktivitet i gruppen. Dette er deaktiveret i inkognitotilstand.</translation> <translation id="3551268116566418498">Forlad inkognitotilstand?</translation> <translation id="3586500876634962664">Brug af kamera og mikrofon</translation> <translation id="358794129225322306">Tillad, at et website kan downloade flere filer automatisk.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Pop op-vinduer og omdirigeringer</translation> <translation id="445467742685312942">Tillad, at websites afspiller beskyttet indhold</translation> <translation id="4468959413250150279">Slå lyden fra for et bestemt website.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# cookie}one{# cookie}other{# cookies}}</translation> <translation id="4479647676395637221">Spørg, før websites bruger dit kamera (anbefales)</translation> <translation id="4505788138578415521">Webadressen er udvidet</translation> <translation id="4534723447064627427">Aktivér også din mikrofon i <ph name="BEGIN_LINK" />Android-indstillingerne<ph name="END_LINK" /> for at give <ph name="APP_NAME" /> adgang til mikrofonen.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb index 2251b7f..ac4444a4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3248611290851046188">Diese Website definiert Interessen, die von anderen Websites dazu verwendet werden können, dir Werbung zu zeigen. Außerdem ruft diese Website deine Interessen von Chrome ab, damit sie dir relevantere Werbung anzeigen kann.</translation> <translation id="3277252321222022663">Websites den Zugriff auf Sensoren erlauben (empfohlen)</translation> +<translation id="3285500645985761267">Ähnliche Websites dürfen meine Aktivitäten in der Gruppe sehen</translation> <translation id="3295602654194328831">Informationen ausblenden</translation> <translation id="3328801116991980348">Websiteinformationen</translation> <translation id="3333961966071413176">Alle Kontakte</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Nachfragen, bevor Websites mein Standort angezeigt wird (empfohlen)</translation> <translation id="3521663503435878242">Websites unter <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Websites daran hindern, eine 3D-Karte meiner Umgebung zu erstellen oder die Kameraposition zu verfolgen</translation> +<translation id="3544058026430919413">Ein Unternehmen kann eine Gruppe von Websites festlegen, die deine Aktivitäten in der Gruppe mithilfe von Cookies teilen. Im Inkognitomodus ist diese Funktion deaktiviert.</translation> <translation id="3551268116566418498">Inkognitomodus deaktivieren?</translation> <translation id="3586500876634962664">Kamera- und Mikrofonnutzung</translation> <translation id="358794129225322306">Einer Website erlauben, automatisch mehrere Dateien herunterzuladen.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Pop-ups und Weiterleitungen</translation> <translation id="445467742685312942">Websites erlauben, geschützte Inhalte wiederzugeben</translation> <translation id="4468959413250150279">Eine bestimmte Website stummschalten.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# Cookie}other{# Cookies}}</translation> <translation id="4479647676395637221">Nachfragen, bevor Websites Zugriff auf meine Kamera erhalten (empfohlen)</translation> <translation id="4505788138578415521">URL maximiert</translation> <translation id="4534723447064627427">Um <ph name="APP_NAME" /> Zugriff auf dein Mikrofon zu gewähren, muss die Mikrofonberechtigung auch in den <ph name="BEGIN_LINK" />Android-Einstellungen<ph name="END_LINK" /> aktiviert werden.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb index 3406922..3e653b0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Μικρόφωνο</translation> <translation id="3248611290851046188">Αυτός ο ιστότοπος ορίζει ενδιαφέροντα που άλλοι ιστότοποι μπορούν να χρησιμοποιούν για να σας εμφανίζουν διαφημίσεις. Αυτός ο ιστότοπος λαμβάνει επίσης τα ενδιαφέροντά σας από το Chrome για να εμφανίζει πιο συναφείς διαφημίσεις.</translation> <translation id="3277252321222022663">Να επιτρέπεται στους ιστοτόπους η πρόσβαση στους αισθητήρες (συνιστάται)</translation> +<translation id="3285500645985761267">Να επιτρέπεται σε σχετικούς ιστοτόπους να βλέπουν τη δραστηριότητά σας στην ομάδα</translation> <translation id="3295602654194328831">Απόκρυψη πληροφοριών</translation> <translation id="3328801116991980348">Πληροφορίες ιστοτόπου</translation> <translation id="3333961966071413176">Όλες οι επαφές</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Να γίνεται ερώτηση προτού επιτραπεί η κοινοποίηση της τοποθεσίας σας σε ιστότοπους (συνιστάται)</translation> <translation id="3521663503435878242">Ιστότοποι του τομέα <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Αποκλείστε ιστοτόπους από τη δημιουργία ενός τρισδιάστατου χάρτη του περιβάλλοντα χώρου σας ή την παρακολούθηση της θέσης της κάμερας.</translation> +<translation id="3544058026430919413">Μια εταιρεία μπορεί να ορίσει μια ομάδα ιστοτόπων που μπορούν να χρησιμοποιούν cookie για την κοινοποίηση της δραστηριότητάς σας στην ομάδα. Αυτή η επιλογή είναι απενεργοποιημένη στην Ανώνυμη περιήγηση.</translation> <translation id="3551268116566418498">Έξοδος από ανώνυμη περιήγηση;</translation> <translation id="3586500876634962664">Χρήση κάμερας και μικροφώνου</translation> <translation id="358794129225322306">Να επιτρέπεται σε έναν ιστότοπο να κατεβάζει αυτόματα πολλά αρχεία.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Αναδυόμενα παράθυρα και ανακατευθύνσεις</translation> <translation id="445467742685312942">Να επιτρέπεται στους ιστοτόπους η αναπαραγωγή προστατευμένου περιεχομένου</translation> <translation id="4468959413250150279">Σίγαση ήχου για συγκεκριμένο ιστότοπο.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# cookie}other{# cookie}}</translation> <translation id="4479647676395637221">Να γίνεται ερώτηση προτού επιτραπεί στους ιστότοπους να χρησιμοποιούν την κάμερά σας (συνιστάται)</translation> <translation id="4505788138578415521">Το URL επεκτάθηκε</translation> <translation id="4534723447064627427">Για να επιτρέψετε στην εφαρμογή <ph name="APP_NAME" /> να αποκτήσει πρόσβαση στο μικρόφωνό σας, ενεργοποιήστε επίσης το μικρόφωνο στις <ph name="BEGIN_LINK" />Ρυθμίσεις Android<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb index 4621112..11f57ae5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Micrófono</translation> <translation id="3248611290851046188">Este sitio define intereses que otros sitios pueden usar para mostrarte anuncios. Este sitio también consulta tus intereses de Chrome para mostrarte anuncios más relevantes.</translation> <translation id="3277252321222022663">Permitir que los sitios accedan a los sensores (recomendado)</translation> +<translation id="3285500645985761267">Permitir que los sitios relacionados vean tu actividad en el grupo</translation> <translation id="3295602654194328831">Ocultar información</translation> <translation id="3328801116991980348">Información del sitio</translation> <translation id="3333961966071413176">Todos los contactos</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Preguntar antes de permitir que los sitios detecten tu ubicación (recomendado)</translation> <translation id="3521663503435878242">Sitios de <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">No permitir que los sitios creen un mapa 3D de tu entorno o hagan un seguimiento de la posición de la cámara</translation> +<translation id="3544058026430919413">Una empresa puede definir un grupo de sitios que pueden usar cookies para compartir tu actividad dentro del grupo. Esta función está desactivada en el modo Incógnito.</translation> <translation id="3551268116566418498">¿Salir del modo Incógnito?</translation> <translation id="3586500876634962664">Uso de cámara y micrófono</translation> <translation id="358794129225322306">Permitir que un sitio web descargue varios archivos automáticamente.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Ventanas emergentes y redirecciones</translation> <translation id="445467742685312942">Permitir que los sitios reproduzcan contenido protegido</translation> <translation id="4468959413250150279">Silencia el sonido de un sitio específico.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# cookie}other{# cookies}}</translation> <translation id="4479647676395637221">Preguntar antes de permitir que los sitios utilicen la cámara (recomendado)</translation> <translation id="4505788138578415521">URL ampliada</translation> <translation id="4534723447064627427">Para que <ph name="APP_NAME" /> pueda acceder al micrófono, actívalo también en los <ph name="BEGIN_LINK" />ajustes de Android<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index 8e29a49b..bca9f6d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3248611290851046188">See sait defineerib huvid, mida muud saidid saavad teile reklaamide kuvamiseks kasutada. Samuti hangib see sait Chrome'ist teie huvid, et näidata teile asjakohasemaid reklaame.</translation> <translation id="3277252321222022663">Luba saitide jaoks juurdepääs anduritele (soovitatav)</translation> +<translation id="3285500645985761267">Luba seotud saitidel näha minu tegevusi grupis</translation> <translation id="3295602654194328831">Peida teave</translation> <translation id="3328801116991980348">Saiditeave</translation> <translation id="3333961966071413176">Kõik kontaktid</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Küsi enne saitidele minu asukoha avaldamist (soovitatav)</translation> <translation id="3521663503435878242">Saidid domeenil <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Saitide jaoks blokeeritakse teid ümbritsevast 3D-kaardi loomine või kaamera asendi jälgimine</translation> +<translation id="3544058026430919413">Ettevõte saab määratleda saitide grupi, mis saavad kasutada küpsisefaile, et teie tegevusi grupis jagada. See on inkognito režiimis välja lülitatud.</translation> <translation id="3551268116566418498">Kas lahkuda inkognito režiimist?</translation> <translation id="3586500876634962664">Kaamera ja mikrofoni kasutamine</translation> <translation id="358794129225322306">Lubab saidil automaatselt mitut faili alla laadida.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Hüpikaknad ja ümbersuunamised</translation> <translation id="445467742685312942">Saitidel on lubatud esitada kaitstud sisu</translation> <translation id="4468959413250150279">Konkreetse saidi heli vaigistamine.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# küpsisefail}other{# küpsisefaili}}</translation> <translation id="4479647676395637221">Küsi enne saitidele minu kaamera kasutamiseks juurdepääsu lubamist (soovitatav)</translation> <translation id="4505788138578415521">Laiendatud URL</translation> <translation id="4534723447064627427">Selleks et anda rakendusele <ph name="APP_NAME" /> juurdepääs teie mikrofonile, lülitage mikrofon sisse ka <ph name="BEGIN_LINK" />Androidi seadetes<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb index ff62b7549..fc671bc 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">میکروفن</translation> <translation id="3248611290851046188">این سایت علایقی را که دیگر سایتها برای نمایش آگهی استفاده میکنند مشخص میکند. این سایت علایقتان را نیز از Chrome میگیرد تا آگهیهای مرتبطتری به شما نشان دهد.</translation> <translation id="3277252321222022663">مجاز بودن دسترسی سایتها به حسگرها (توصیه میشود)</translation> +<translation id="3285500645985761267">به سایتهای مرتبط اجازه دهید فعالیت شما را در گروه ببینند</translation> <translation id="3295602654194328831">پنهان کردن اطلاعات</translation> <translation id="3328801116991980348">اطلاعات سایت</translation> <translation id="3333961966071413176">همه مخاطبین</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">قبل از اجازه به سایتها برای اطلاع از مکانتان، ابتدا سؤال شود (توصیه میشود)</translation> <translation id="3521663503435878242">سایتهای تحت <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">قابلیت سایتها برای ایجاد نقشه سهبعدی از محیط یا ردیابی موقعیت دوربین مسدود میشود</translation> +<translation id="3544058026430919413">شرکتها میتوانند گروهی از سایتها تعریف کنند که فعالیت شما را بااستفاده از کوکی در گروه همرسانی کنند. این ویژگی در «حالت ناشناس» خاموش است.</translation> <translation id="3551268116566418498">از «حالت ناشناس» خارج میشوید؟</translation> <translation id="3586500876634962664">استفاده از دوربین و میکروفون</translation> <translation id="358794129225322306">به سایت اجازه داده شود چند فایل را بهطور خودکار بارگیری کند.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">پنجرههای بازشو و هدایتها</translation> <translation id="445467742685312942">به سایتها اجازه داده شود محتوای محافظتشده پخش کنند</translation> <translation id="4468959413250150279">سایتی خاص بیصدا شود.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# کوکی}one{# کوکی}other{# کوکی}}</translation> <translation id="4479647676395637221">قبل از اجازه به سایتها برای استفاده از دوربین، ابتدا سؤال شود (توصیه میشود)</translation> <translation id="4505788138578415521">نشانی وب گسترده شد</translation> <translation id="4534723447064627427">برای اینکه به <ph name="APP_NAME" /> اجازه دهید به میکروفون دسترسی پیدا کند، میکروفون را در <ph name="BEGIN_LINK" />تنظیمات Android<ph name="END_LINK" /> نیز روشن کنید.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb index b6daed9..66576ec 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -111,6 +111,7 @@ <translation id="3227137524299004712">Mikropono</translation> <translation id="3248611290851046188">Tinutukoy ng site na ito ang mga interes na magagamit ng iba pang site para magpakita sa iyo ng mga ad. Kinukuha rin ng site na ito ang mga interes mo mula sa Chrome para makapagpakita sa iyo ng higit pang nauugnay na ad.</translation> <translation id="3277252321222022663">Payagan ang mga site na i-access ang mga sensor (inirerekomenda)</translation> +<translation id="3285500645985761267">Payagan ang mga kaugnay na site na makita ang iyong aktibidad sa grupo</translation> <translation id="3295602654194328831">Itago ang Impormasyon</translation> <translation id="3328801116991980348">Impormasyon ng site</translation> <translation id="3333961966071413176">Lahat ng contact</translation> @@ -118,6 +119,7 @@ <translation id="3386292677130313581">Magtanong bago payagan ang mga site na malaman ang iyong lokasyon (inirerekomenda)</translation> <translation id="3521663503435878242">Mga site sa ilalim ng <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">I-block ang mga site sa paggawa ng 3D na mapa ng iyong kapaligiran o pagsubaybay sa posisyon ng camera</translation> +<translation id="3544058026430919413">Puwedeng tukuyin ng isang kumpanya ang grupo ng mga site na puwedeng gumamit ng cookies para i-share ang iyong aktibidad sa grupo. Naka-off ito sa Incognito.</translation> <translation id="3551268116566418498">Umalis sa Incognito mode?</translation> <translation id="3586500876634962664">Paggamit ng camera at mikropono</translation> <translation id="358794129225322306">Payagan ang isang site na awtomatikong mag-download ng maraming file.</translation> @@ -160,6 +162,7 @@ <translation id="4434045419905280838">Mga pop-up at pag-redirect</translation> <translation id="445467742685312942">Pahintulutan ang mga site na mag-play ng pinoprotektahang content</translation> <translation id="4468959413250150279">I-mute ang tunog para sa isang partikular na site.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# cookie}one{# cookie}other{# na cookie}}</translation> <translation id="4479647676395637221">Magtanong muna bago payagan ang mga site na gamitin ang iyong camera (inirerekomenda)</translation> <translation id="4505788138578415521">Na-expand ang URL</translation> <translation id="4534723447064627427">Para payagan ang <ph name="APP_NAME" /> na i-access ang iyong mikropono, i-on din ang mikropono sa <ph name="BEGIN_LINK" />Mga Setting ng Android<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb index 56c55374..25629fd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -159,6 +159,7 @@ <translation id="4402755511846832236">Onemogućivanje web-lokacijama da znaju kad aktivno upotrebljavate ovaj uređaj</translation> <translation id="4428065317363009941">Prilagodba oglasa</translation> <translation id="4434045419905280838">Skočni prozori i preusmjeravanja</translation> +<translation id="4440642537584213025">Proširi odjeljak <ph name="TARGET_DESCRIPTION" /></translation> <translation id="445467742685312942">Web-lokacijama je dopuštena reprodukcija zaštićenog sadržaja</translation> <translation id="4468959413250150279">Isključivanje zvuka za određenu web-lokaciju.</translation> <translation id="4475912480633855319">{COOKIES,plural, =1{# kolačić}one{# kolačić}few{# kolačića}other{# kolačića}}</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb index 34185bd..af6482e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3248611290851046188">Situs ini menentukan minat yang dapat digunakan oleh situs lain untuk menampilkan iklan kepada Anda. Situs ini juga mendapatkan minat Anda dari Chrome untuk menampilkan iklan yang lebih relevan.</translation> <translation id="3277252321222022663">Mengizinkan situs untuk mengakses sensor (disarankan)</translation> +<translation id="3285500645985761267">Izinkan situs terkait melihat aktivitas Anda di grup</translation> <translation id="3295602654194328831">Sembunyikan Info</translation> <translation id="3328801116991980348">Informasi situs</translation> <translation id="3333961966071413176">Semua kontak</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Minta izin sebelum mengizinkan situs mengetahui lokasi Anda (disarankan)</translation> <translation id="3521663503435878242">Situs di domain <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Blokir situs agar tidak membuat peta 3D untuk area di sekeliling Anda atau melacak posisi kamera</translation> +<translation id="3544058026430919413">Perusahaan dapat menentukan grup situs yang dapat menggunakan cookie untuk membagikan aktivitas Anda di grup tersebut. Ini nonaktif dalam mode Samaran.</translation> <translation id="3551268116566418498">Keluar dari mode Samaran?</translation> <translation id="3586500876634962664">Kamera dan mikrofon aktif</translation> <translation id="358794129225322306">Izinkan situs untuk otomatis mendownload beberapa file.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Pop-up dan pengalihan</translation> <translation id="445467742685312942">Izinkan situs memutar konten yang dilindungi</translation> <translation id="4468959413250150279">Mematikan suara untuk situs tertentu.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# cookie}other{# cookie}}</translation> <translation id="4479647676395637221">Minta izin terlebih dahulu sebelum memungkinkan situs menggunakan kamera Anda (disarankan)</translation> <translation id="4505788138578415521">URL ditampilkan penuh</translation> <translation id="4534723447064627427">Untuk mengizinkan <ph name="APP_NAME" /> mengakses mikrofon, aktifkan juga mikrofon di <ph name="BEGIN_LINK" />Setelan Android<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb index 1e15be180..e4a503ea 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -34,6 +34,7 @@ <translation id="1785415724048343560">რეკომენდებულია საუკეთესო შედეგების მისაღებად</translation> <translation id="1818308510395330587"><ph name="APP_NAME" />-მა AR რომ გამოიყენოს, გაააქტიურეთ კამერაზე წვდომის ნებართვაც <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation> <translation id="1864927262126810325">წყარო: <ph name="SOURCE_NAME" /></translation> +<translation id="187227595286001730">დაკავშირებულ საიტებს შეუძლია თქვენი აქტივობის ნახვა ჯგუფში</translation> <translation id="1887786770086287077">მდებარეობაზე წვდომა გამორთულია ამ მოწყობილობისთვის. ჩართეთ ის <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation> <translation id="1915307458270490472">გათიშვა</translation> <translation id="1919345977826869612">რეკლამა</translation> @@ -110,6 +111,7 @@ <translation id="3227137524299004712">მიკროფონი</translation> <translation id="3248611290851046188">ეს საიტი განსაზღვრავს ინტერესებს, რომელთა გამოყენებაც შეუძლია სხვა საიტებს, რეკლამა რომ გაჩვენოთ. გარდა ამისა, ეს საიტი Chrome-იდან იღებს ინფორმაციას თქვენი ინტერესების შესახებ, უფრო შესაფერისი რეკლამა რომ შემოგთავაზოთ.</translation> <translation id="3277252321222022663">საიტებისთვის სენსორებზე წვდომის დაშვება (რეკომენდებული)</translation> +<translation id="3285500645985761267">საიტებისთვის ჯგუფში თქვენი აქტივობის ნახვის დაშვება</translation> <translation id="3295602654194328831">ინფორმაციის დამალვა</translation> <translation id="3328801116991980348">საიტის ინფორმაცია</translation> <translation id="3333961966071413176">ყველა კონტაქტი</translation> @@ -117,6 +119,7 @@ <translation id="3386292677130313581">შეკითხვა საიტებისთვის თქვენი მდებარეობის დადგენის დაშვებამდე (რეკომენდებული)</translation> <translation id="3521663503435878242">საიტები <ph name="DOMAIN" />-ის ფარგლებში</translation> <translation id="3538390592868664640">საიტებისთვის თქვენი გარემოს 3-განზომილებიანი რუკის შექმნის ან კამერის პოზიციისთვის თვალის მიდევნების დაბლოკვა</translation> +<translation id="3544058026430919413">კომპანიას შეუძლია საიტების იმ ჯგუფის განსაზღვრა, რომელსაც საშუალება აქვს, ქუქი-ჩანაწერების მეშვეობით გააზიაროთ თქვენი აქტივობა ჯგუფში. აღნიშნული გამორთულია ინკოგნიტო რეჟიმში.</translation> <translation id="3551268116566418498">გავიდეთ ინკოგნიტო რეჟიმიდან?</translation> <translation id="3586500876634962664">კამერის/მიკროფონის გამოყენება</translation> <translation id="358794129225322306">საიტისთვის რამდენიმე ფაილის ავტომატურად ჩამოტვირთვის დაშვება.</translation> @@ -159,6 +162,7 @@ <translation id="4434045419905280838">ამომხ. ფანჯრები/გადამისამართება</translation> <translation id="445467742685312942">საიტებისთვის დაცული კონტენტის დაკვრის დაშვება</translation> <translation id="4468959413250150279">ხმის დადუმება კონკრეტული საიტისთვის.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# ქუქი-ჩანაწერი}other{# ქუქი-ჩანაწერი}}</translation> <translation id="4479647676395637221">შეკითხვა საიტებისთვის თქვენი კამერის გამოყენების დაშვებამდე (რეკომენდებული)</translation> <translation id="4505788138578415521">URL გაშლილია</translation> <translation id="4534723447064627427"><ph name="APP_NAME" />-მა მიკროფონით რომ ისარგებლოს, გაააქტიურეთ მიკროფონზე წვდომის ნებართვაც <ph name="BEGIN_LINK" />Android-ის პარამეტრებიდან<ph name="END_LINK" />.</translation> @@ -172,6 +176,7 @@ <translation id="483914009762354899">ამ დომენში არსებული ყველა საიტის დართვა</translation> <translation id="4883854917563148705">მართული პარამეტრების გადაყენება ვერ მოხერხდება</translation> <translation id="4887024562049524730">საიტების მიერ თქვენი ვირტუალური რეალობის მოწყობილობების/მონაცემების გამოყენების მოთხოვნა (რეკომენდებული)</translation> +<translation id="4955223779495905865">საიტს, რომელსაც ეწვევით, შეუძლია სხვა საიტების კონტენტის (მაგალითად, სურათების, რეკლამისა და ტექსტის) ჩაშენება. ამ საიტებიდან ნებისმიერს შეუძლია ქუქი-ჩანაწერებისა და საიტების სხვა მონაცემების შენახვა, ფუნქციების თქვენზე მორგების მიზნით.</translation> <translation id="4962975101802056554">მოწყობილობისთვის ყველა ნებართვის გაუქმება</translation> <translation id="497421865427891073">გადასვლა წინ</translation> <translation id="4976702386844183910">ბოლო ვიზიტი: <ph name="DATE" /></translation> @@ -181,6 +186,7 @@ <translation id="5048398596102334565">საიტებისთვის მოძრაობის სენსორებზე წვდომის დაშვება (რეკომენდებული)</translation> <translation id="5050380848339752099">ეს საიტი აპირებს, ინკოგნიტო რეჟიმის გარეთ გაუზიაროს ინფორმაცია აპს.</translation> <translation id="5063480226653192405">გამოყენება</translation> +<translation id="5082281938627763039">ეს მოქმედება წაშლის ქუქი-ჩანაწერებსა და საიტების სხვა მონაცემებს როგორც <ph name="FPS_MEMBER" />-ისთვის, ისე საიტებისთვის, რომლებიც შედის <ph name="FPS_OWNER" />-ის საიტების ჯგუფში</translation> <translation id="5091013926750941408">მობილური საიტი</translation> <translation id="509133520954049755">დესკტოპის ხედის მოთხოვნა</translation> <translation id="5100237604440890931">ჩაკეცილია — დააწკაპუნეთ გასაშლელად.</translation> @@ -217,6 +223,7 @@ <translation id="5677928146339483299">დაბლოკილი</translation> <translation id="5689516760719285838">მდებარეობა</translation> <translation id="5690795753582697420">კამერა გამორთულია Android-ის პარამეტრებში</translation> +<translation id="5706552988683188916">ეს მოქმედება წაშლის ქუქი-ჩანაწერებსა და საიტის სხვა მონაცემებს <ph name="WEBSITE" />-ისთვის</translation> <translation id="5719847187258001597">ამ მოქმედებით გასუფთავდება <ph name="ORIGIN" />-ის ან მისი აპის მიერ თქვენს მთავარ ეკრანზე შენახული ყველა მონაცემი.</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> დაბლოკილია</translation> <translation id="5804241973901381774">ნებართვები</translation> @@ -317,6 +324,7 @@ <translation id="7882806643839505685">ხმის დაშვება კონკრეტული საიტისთვის.</translation> <translation id="789180354981963912">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა ინკოგნიტო რეჟიმში:</translation> <translation id="7940722705963108451">შემახსენეთ</translation> +<translation id="7974024493641668069">{COUNT,plural, =1{<ph name="FPS_OWNER" />-ის იმ საიტების ჯგუფში, რომლებსაც შეუძლია თქვენი აქტივობის ნახვა ჯგუფში, არის <ph name="FPS_MEMBERS_COUNT" /> საიტი}other{<ph name="FPS_OWNER" />-ის იმ საიტების ჯგუფში, რომლებსაც შეუძლია თქვენი აქტივობის ნახვა ჯგუფში, არის <ph name="FPS_MEMBERS_COUNT" /> საიტი}}</translation> <translation id="7986741934819883144">აირჩიეთ კონტაქტი</translation> <translation id="7999064672810608036">დარწმუნებული ხართ, რომ გსურთ ყველა ადგილობრივი მონაცემების წაშლა, მათ შორის ქუქი ფაილების, და ამ გვერდისათვის ყველა ნებართვების აღდგენა?</translation> <translation id="8007176423574883786">გამორთულია ამ მოწყობილობისთვის</translation> @@ -355,6 +363,7 @@ <translation id="8499083585497694743">მიკროფონის დადუმების მოხსნა</translation> <translation id="851751545965956758">საიტებისთვის მოწყობილობებთან დაკავშირების აკრძალვა</translation> <translation id="8525306231823319788">მთელ ეკრანზე</translation> +<translation id="8564613706851221529">{COUNT,plural, =1{ქუქი-ჩანაწერები დაშვებულია <ph name="FPS_OWNER" />-ის <ph name="FPS_MEMBERS_COUNT" /> საიტისთვის}other{ქუქი-ჩანაწერები დაშვებულია <ph name="FPS_OWNER" />-ის <ph name="FPS_MEMBERS_COUNT" /> საიტისთვის}}</translation> <translation id="857943718398505171">დაშვებული (რეკომენდებულია)</translation> <translation id="8609465669617005112">გადაადგილება ზემოთ</translation> <translation id="8676374126336081632">შეყვანილი ტექსტის გასუფთავება</translation> @@ -380,6 +389,8 @@ <translation id="8986362086234534611">დავიწყება</translation> <translation id="9019902583201351841">იმართება თქვენი მშობლების მიერ</translation> <translation id="9074739597929991885">Bluetooth</translation> +<translation id="9090268041676521955">ეს საიტი არის ჯგუფში, რომელსაც შეუძლია თქვენი აქტივობის ნახვა. ჯგუფი განსაზღვრულია <ph name="FPS_OWNER" />-ის მიერ.</translation> +<translation id="9106233582039520022">გსურთ, წაშალოთ ქუქი-ჩანაწერები?</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> და <ph name="NUM_MORE" /> სხვა}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> და <ph name="NUM_MORE" /> სხვა}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" />-ისთვის ნებართვების გააქტიურება <ph name="BEGIN_LINK" />Android-ის პარამეტრებში<ph name="END_LINK" /> შეგიძლიათ.</translation> <translation id="9162462602695099906">ეს გვერდი სახიფათოა</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb index afef4f9..eae67bab 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">마이크</translation> <translation id="3248611290851046188">다른 사이트에서 이 사이트에서 정의하는 내 관심분야를 사용해 광고를 표시할 수 있습니다. 이 사이트는 Chrome에 저장된 내 관심분야 정보를 토대로 더욱 관련성 있는 광고를 표시할 수도 있습니다.</translation> <translation id="3277252321222022663">사이트의 센서 액세스 허용(권장)</translation> +<translation id="3285500645985761267">관련 사이트에서 내 그룹 활동을 볼 수 있도록 허용</translation> <translation id="3295602654194328831">정보 숨기기</translation> <translation id="3328801116991980348">사이트 정보</translation> <translation id="3333961966071413176">모든 연락처</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">사이트에서 내 위치를 파악하도록 허용하기 전에 확인(권장)</translation> <translation id="3521663503435878242"><ph name="DOMAIN" />의 사이트</translation> <translation id="3538390592868664640">사이트에서 주변 환경의 3D 지도를 생성하거나 카메라 위치를 추적하지 못하도록 차단</translation> +<translation id="3544058026430919413">회사는 쿠키를 사용하여 내 그룹 활동을 공유하는 사이트 그룹을 정의할 수 있습니다. 시크릿 모드에서는 이 기능이 사용 중지되어 있습니다.</translation> <translation id="3551268116566418498">시크릿 모드를 종료하시겠습니까?</translation> <translation id="3586500876634962664">카메라 및 마이크 사용</translation> <translation id="358794129225322306">사이트에서 여러 파일을 자동으로 다운로드하도록 허용합니다.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">팝업 및 리디렉션</translation> <translation id="445467742685312942">사이트에서 보호된 콘텐츠를 재생하도록 허용</translation> <translation id="4468959413250150279">특정 사이트를 음소거합니다.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{쿠키 #개}other{쿠키 #개}}</translation> <translation id="4479647676395637221">사이트에서 카메라를 사용하도록 허용하기 전에 확인(권장)</translation> <translation id="4505788138578415521">URL 펼쳐짐</translation> <translation id="4534723447064627427"><ph name="APP_NAME" />에서 마이크에 액세스하도록 허용하려면 <ph name="BEGIN_LINK" />Android 설정<ph name="END_LINK" />에서도 마이크를 사용 설정하세요.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb index 73d3212..b74e77e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -34,6 +34,7 @@ <translation id="1785415724048343560">Препорачано за најдобро доживување</translation> <translation id="1818308510395330587">За да овозможите <ph name="APP_NAME" /> да користи AR, вклучете ја дозволата за камерата и во <ph name="BEGIN_LINK" />Поставки за Android<ph name="END_LINK" />.</translation> <translation id="1864927262126810325">Од <ph name="SOURCE_NAME" /></translation> +<translation id="187227595286001730">Слични сајтов може да ја гледаат вашата активност во групата</translation> <translation id="1887786770086287077">Пристапот до локацијата е исклучен за уредов. Вклучете го во <ph name="BEGIN_LINK" />Поставки за Android<ph name="END_LINK" />.</translation> <translation id="1915307458270490472">Спушти</translation> <translation id="1919345977826869612">Реклами</translation> @@ -175,6 +176,7 @@ <translation id="483914009762354899">Вклучете ги сите сајтови од доменов</translation> <translation id="4883854917563148705">Управуваните поставки не може да се ресетираат</translation> <translation id="4887024562049524730">Прашувај пред да им дозволиш на сајтовите да ги користат уредот и податоците за виртуелна реалност (препорачано)</translation> +<translation id="4955223779495905865">Сајтот што го посетувате може да вметне содржини од други сајтови, на пример, слики, реклами и текст. Кој било од сајтовиве може да има колачиња и други податоци за персонализирање на вашето доживување.</translation> <translation id="4962975101802056554">Повлечи ги сите дозволи за уредот</translation> <translation id="497421865427891073">Оди напред</translation> <translation id="4976702386844183910">Последно посетено на <ph name="DATE" /></translation> @@ -184,6 +186,7 @@ <translation id="5048398596102334565">Дозволете сајтовите да пристапуваат до сензорите за движење (препорачано)</translation> <translation id="5050380848339752099">Сајтов ќе сподели информации со апликација надвор од режимот „Инкогнито“.</translation> <translation id="5063480226653192405">Користење</translation> +<translation id="5082281938627763039">Ова ги брише колачињата и другите податоци од сајтот за <ph name="FPS_MEMBER" /> и за сајтовите во групата сајтови на <ph name="FPS_OWNER" /></translation> <translation id="5091013926750941408">Сајт за мобилен</translation> <translation id="509133520954049755">Побарајте приказ на компјутер</translation> <translation id="5100237604440890931">Проширено - кликни да се прошири.</translation> @@ -220,6 +223,7 @@ <translation id="5677928146339483299">Блокирано</translation> <translation id="5689516760719285838">Локација</translation> <translation id="5690795753582697420">Камерата е исклучена во поставките за Android</translation> +<translation id="5706552988683188916">Ова ги брише колачињата и другите податоците од сајтот за <ph name="WEBSITE" /></translation> <translation id="5719847187258001597">Ова ќе ги избрише сите податоци и колачиња складирани од сајтот <ph name="ORIGIN" /> или од неговата апликација на почетниот екран.</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> е блокирана</translation> <translation id="5804241973901381774">Дозволи</translation> @@ -320,6 +324,7 @@ <translation id="7882806643839505685">Дозволете го звукот за одреден сајт.</translation> <translation id="789180354981963912">Блокирајте колачиња од трети страни во „Инкогнито“:</translation> <translation id="7940722705963108451">Потсети ме</translation> +<translation id="7974024493641668069">{COUNT,plural, =1{<ph name="FPS_MEMBERS_COUNT" /> сајт во групата сајтови на <ph name="FPS_OWNER" /> што може да ја гледаат вашата активност во групата}one{<ph name="FPS_MEMBERS_COUNT" /> сајт во групата сајтови на <ph name="FPS_OWNER" /> што може да ја гледаат вашата активност во групата}other{<ph name="FPS_MEMBERS_COUNT" /> сајтови во групата сајтови на <ph name="FPS_OWNER" /> што може да ја гледаат вашата активност во групата}}</translation> <translation id="7986741934819883144">Изберете контакт</translation> <translation id="7999064672810608036">Дали сте сигурни дека сакате да ги исчистите сите локални податоци, вклучувајќи ги колачињата, и да ги ресетирате сите дозволи за веб-локацијата?</translation> <translation id="8007176423574883786">Исклучена за овој уред</translation> @@ -358,6 +363,7 @@ <translation id="8499083585497694743">Вклучи го звукот на микрофонот</translation> <translation id="851751545965956758">Блокирај ги сајтовите од поврзување со уреди</translation> <translation id="8525306231823319788">Цел екран</translation> +<translation id="8564613706851221529">{COUNT,plural, =1{Колачињата се дозволени за <ph name="FPS_MEMBERS_COUNT" /> сајт на <ph name="FPS_OWNER" />}one{Колачињата се дозволени за <ph name="FPS_MEMBERS_COUNT" /> сајт на <ph name="FPS_OWNER" />}other{Колачињата се дозволени за <ph name="FPS_MEMBERS_COUNT" /> сајтови на <ph name="FPS_OWNER" />}}</translation> <translation id="857943718398505171">Дозволено (препорачано)</translation> <translation id="8609465669617005112">Премести нагоре</translation> <translation id="8676374126336081632">Јасно внесување</translation> @@ -383,6 +389,8 @@ <translation id="8986362086234534611">Заборави</translation> <translation id="9019902583201351841">Управувано од вашите родители</translation> <translation id="9074739597929991885">Bluetooth</translation> +<translation id="9090268041676521955">Сајтов е во група што може да ја гледа вашата активност. Групата ја дефинираше <ph name="FPS_OWNER" /></translation> +<translation id="9106233582039520022">Да се избришат колачињата?</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> друго}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> друго}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> и уште <ph name="NUM_MORE" /> други}}</translation> <translation id="913657688200966289">Вклучете ги дозволите за <ph name="APP_NAME" /> во <ph name="BEGIN_LINK" />Поставки за Android<ph name="END_LINK" />.</translation> <translation id="9162462602695099906">Страницава е опасна</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb index f1dcfc1..b8a0089d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Микрофон</translation> <translation id="3248611290851046188">Энэ сайт бусад сайтын танд зар харуулахын тулд ашиглаж болох сонирхлыг тодорхойлно. Энэ сайт мөн танд илүү хамааралтай зар харуулахын тулд таны сонирхлуудыг Chrome-с авдаг.</translation> <translation id="3277252321222022663">Сайтуудад мэдрэгчид хандахыг зөвшөөрөх (санал болгосон)</translation> +<translation id="3285500645985761267">Холбоотой сайтуудад таны бүлэг дэх үйл ажиллагааг харахыг зөвшөөрнө үү</translation> <translation id="3295602654194328831">Мэдээллийг нуух</translation> <translation id="3328801116991980348">Сайтын мэдээлэл</translation> <translation id="3333961966071413176">Бүх харилцагч</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Сайтууд байршил мэдэх зөвшөөрөл авах (санал болгосон)</translation> <translation id="3521663503435878242"><ph name="DOMAIN" />-н сайтууд</translation> <translation id="3538390592868664640">Сайтуудад таны эргэн тойрны 3D газрын зургийг үүсгэх эсвэл камерын хөдөлгөөнийг хянахыг хориглох</translation> +<translation id="3544058026430919413">Таны үйл ажиллагааг бүлэгт хуваалцахын тулд күүки ашиглах боломжтой сайтуудын бүлгийг компаниас тодорхойлох боломжтой. Энэ нь Нууцлалтай горимд унтраалттай.</translation> <translation id="3551268116566418498">Нууцлалтай горимоос гарах уу?</translation> <translation id="3586500876634962664">Камер болон микрофоны ашиглалт</translation> <translation id="358794129225322306">Сайтад олон файлыг автоматаар татахыг зөвшөөрнө үү.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Попап болон дахин чиглүүлэлт</translation> <translation id="445467742685312942">Сайтуудад хамгаалагдсан контент тоглуулахыг зөвшөөрөх</translation> <translation id="4468959413250150279">Тодорхой сайтын дууг хаана уу.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# күүки}other{# күүки}}</translation> <translation id="4479647676395637221">Сайтууд камер ашиглах зөвшөөрөл авах (санал болгосон)</translation> <translation id="4505788138578415521">URL-г өргөтгөсөн</translation> <translation id="4534723447064627427"><ph name="APP_NAME" />-д таны микрофонд хандахыг зөвшөөрөхийн тулд микрофоныг мөн <ph name="BEGIN_LINK" />Андройдын тохиргоо<ph name="END_LINK" />-нд асаана уу.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb index 2eed914..93f4359 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">मायक्रोफोन</translation> <translation id="3248611290851046188">ही साइट तुम्हाला जाहिराती दाखवण्यासाठी इतर साइट वापरू शकतात अशी स्वारस्ये परिभाषित करते. तुम्हाला आणखी उपयुक्त जाहिराती दाखवण्यासाठी ही साइट Chrome मधून तुमची स्वारस्येदेखील मिळवते.</translation> <translation id="3277252321222022663">साइटना सेन्सर ॲक्सेस करण्याची अनुमती द्या (शिफारस केलेले)</translation> +<translation id="3285500645985761267">संबंधित साइटना गटामधील तुमच्या अॅक्टिव्हिटी पाहण्याची अनुमती द्या</translation> <translation id="3295602654194328831">माहिती लपवा</translation> <translation id="3328801116991980348">साइट माहिती</translation> <translation id="3333961966071413176">सर्व संपर्क</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">साइटना तुमचे स्थान जाणून घेण्याची अनुमती देण्यापूर्वी विचारा (शिफारस केलेले)</translation> <translation id="3521663503435878242"><ph name="DOMAIN" /> अंतर्गत साइट</translation> <translation id="3538390592868664640">तुमच्या आसपासच्या परिसराचा 3D नकाशा तयार करण्यापासून किंवा कॅमेर्याचे स्थान ट्रॅक करण्यापासून साइट ब्लॉक करा</translation> +<translation id="3544058026430919413">गटामध्ये तुमच्या अॅक्टिव्हिटी शेअर करण्यासाठी कुकीज वापरू शकणार्या साइटचा गट कंपनी नमूद करू शकते. हे गुप्त मोड मध्ये बंद आहे.</translation> <translation id="3551268116566418498">गुप्त मोडमधून बाहेर पडायचे का?</translation> <translation id="3586500876634962664">कॅमेरा आणि मायक्रोफोन वापरा</translation> <translation id="358794129225322306">साइटला एकाहून अधिक फाइल आपोआप डाउनलोड करू द्या.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">पॉप-अप आणि रीडिरेक्ट</translation> <translation id="445467742685312942">साइटना संरक्षित आशय प्ले करू द्या</translation> <translation id="4468959413250150279">विशिष्ट साइटसाठी ध्वनी म्यूट करा.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# कुकी}other{# कुकी}}</translation> <translation id="4479647676395637221">साइटना तुमचा कॅमेरा वापरण्याची अनुमती देण्यापूर्वी प्रथम विचारा (शिफारस केलेले)</translation> <translation id="4505788138578415521">URL चा विस्तार केला गेला</translation> <translation id="4534723447064627427"><ph name="APP_NAME" /> ला तुमचा मायक्रोफोन ॲक्सेस करू देण्यासाठी, <ph name="BEGIN_LINK" />Android सेटिंग्ज<ph name="END_LINK" /> मध्येदेखील मायक्रोफोन सुरू करा.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb index cf950d7a..9e611bb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">မိုက်ခရိုဖုန်း</translation> <translation id="3248611290851046188">သင့်ကိုကြော်ငြာပြရန် အခြားဝဘ်ဆိုက်များသုံးနိုင်သော စိတ်ဝင်စားမှုများအား ဤဝဘ်ဆိုက်က သတ်မှတ်သည်။ နောက်ထပ်သက်ဆိုင်ရာ ကြော်ငြာများပြရန် ဤဝဘ်ဆိုက်က သင့်စိတ်ဝင်စားမှုများကိုလည်း Chrome မှ ရယူပါသည်။</translation> <translation id="3277252321222022663">အာရုံခံစနစ်များ အသုံးပြုရန် ဤဝဘ်ဆိုက်များကို ခွင့်ပြုသည် (အကြံပြုထားသည်)</translation> +<translation id="3285500645985761267">အုပ်စုတွင်း သင့်လှုပ်ရှားမှုကို ကြည့်ရန်အတွက် ဆက်စပ်ဝဘ်ဆိုက်များ ခွင့်ပြုရန်</translation> <translation id="3295602654194328831">အချက်အလက်များကို ဖျောက်ထားရန်</translation> <translation id="3328801116991980348">ဆိုက် အချက်အလက်များ</translation> <translation id="3333961966071413176">အဆက်အသွယ်အားလုံး</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">သင့်တည်နေရာကို ဆိုက်များအား အသိမပေးမီ မေးပါ (အကြံပြုထားသည်)</translation> <translation id="3521663503435878242"><ph name="DOMAIN" /> အောက်ရှိ ဝဘ်ဆိုက်များ</translation> <translation id="3538390592868664640">သင့်ပတ်ဝန်းကျင်၏ 3D မြေပုံဆွဲခြင်း သို့မဟုတ် ကင်မရာအနေအထား ခြေရာခံခြင်းတို့ မပြုလုပ်ရန် ဝဘ်ဆိုက်များကို ပိတ်ထားသည်</translation> +<translation id="3544058026430919413">အုပ်စုတွင်း သင့်လှုပ်ရှားမှုအား မျှဝေရန် ကွတ်ကီးသုံးနိုင်သည့် ဝဘ်ဆိုက်အုပ်စုကို ကုမ္ပဏီက သတ်မှတ်နိုင်သည်။ ၎င်းသည် ရုပ်ဖျက်တွင် ပိတ်နေမည်။</translation> <translation id="3551268116566418498">ရုပ်ဖျက်မုဒ်မှ ထွက်လိုသလား။</translation> <translation id="3586500876634962664">ကင်မရာနှင့် မိုက် အသုံးပြုသည်</translation> <translation id="358794129225322306">ဝဘ်ဆိုက်အား ဖိုင်အမြောက်အမြား အလိုအလျောက်ဒေါင်းလုဒ်လုပ်ခြင်းကို ခွင့်ပြုသည်</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">ပေါ့ပ်အပ်နှင့် တစ်ဆင့်ညွှန်ချက်</translation> <translation id="445467742685312942">ကာကွယ်ထားသော အကြောင်းအရာများ ဖွင့်ရန် ဝဘ်ဆိုက်များကို� ခွင့်ပြုသည်</translation> <translation id="4468959413250150279">ဝဘ်ဆိုက်တစ်ခုအတွက် အသံတိတ်ထားသည်။</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{ကွတ်ကီး # ခု}other{ကွတ်ကီး # ခု}}</translation> <translation id="4479647676395637221">သင့်ကမရာကို ဆိုက်များအား အသုံးပြုခွင့်မပေးမီ ဦးစွာမေးမြန်းပါ (အကြံပြုထားသည်)</translation> <translation id="4505788138578415521">URL ကို ချဲ့လိုက်သည်</translation> <translation id="4534723447064627427"><ph name="APP_NAME" /> က သင့်မိုက်ခရိုဖုန်းကို သုံးနိုင်ရန် <ph name="BEGIN_LINK" />Android ဆက်တင်များ<ph name="END_LINK" /> တွင်လည်း မိုက်ခရိုဖုန်း ဖွင့်ပါ။</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb index 2e03a13..19170a55 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3248611290851046188">Dette nettstedet definerer interesser som andre nettsteder kan bruke til å vise deg annonser. Dette nettstedet mottar også interessene dine fra Chrome for å kunne vise deg mer relevante annonser.</translation> <translation id="3277252321222022663">Gi nettsteder tilgang til sensorer (anbefalt)</translation> +<translation id="3285500645985761267">Tillat relaterte nettsteder å se aktiviteten din i gruppen</translation> <translation id="3295602654194328831">Skjul informasjonen</translation> <translation id="3328801116991980348">Informasjon om nettstedet</translation> <translation id="3333961966071413176">Alle kontakter</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Spør før nettsteder får vite posisjonen min (anbefales)</translation> <translation id="3521663503435878242">Nettsteder under <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Blokkér nettsteder fra å lage 3D-kart av omgivelsene dine eller spore kameraposisjonen</translation> +<translation id="3544058026430919413">Bedrifter kan definere grupper av nettsteder som kan bruke informasjonskapsler for å dele aktiviteten din i gruppen. Dette er av i Inkognito.</translation> <translation id="3551268116566418498">Vil du avslutte Inkognitomodus?</translation> <translation id="3586500876634962664">Kamera- og mikrofonbruk</translation> <translation id="358794129225322306">Tillat at et nettsted kan laste ned flere filer automatisk.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Forgrunnsvinduer/viderekoblinger</translation> <translation id="445467742685312942">Tillat at nettsteder kan spille beskyttet innhold</translation> <translation id="4468959413250150279">Kutt lyden for et bestemt nettsted.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# informasjonskapsel}other{# informasjonskapsler}}</translation> <translation id="4479647676395637221">Spør før nettsteder får bruke kameraet (anbefales)</translation> <translation id="4505788138578415521">Nettadressen er utvidet</translation> <translation id="4534723447064627427">For å gi <ph name="APP_NAME" /> tilgang til mikrofonen må du også slå på mikrofonen i <ph name="BEGIN_LINK" />Android-innstillingene<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb index e893bb6..95ea932 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Microfon</translation> <translation id="3248611290851046188">Acest site definește categorii de interese pe care le pot folosi alte site-uri pentru a-ți afișa anunțuri. În plus, site-ul preia interesele tale din Chrome ca să-ți afișeze anunțuri mai relevante.</translation> <translation id="3277252321222022663">Permite accesul site-urilor la senzori (recomandat)</translation> +<translation id="3285500645985761267">Permite site-urilor conexe să-ți vadă activitatea în grup</translation> <translation id="3295602654194328831">Ascunde informațiile</translation> <translation id="3328801116991980348">Informații despre site</translation> <translation id="3333961966071413176">Toată agenda</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Întreabă înainte de a permite site-urilor să afle locația (recomandat)</translation> <translation id="3521663503435878242">Site-uri din <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Împiedică site-urile să creeze o hartă 3D a lucrurilor din jur sau să urmărească poziția camerei video</translation> +<translation id="3544058026430919413">O companie poate defini un grup de site-uri care pot folosi cookie-uri pentru a-ți afișa activitatea în grup. Această opțiune este dezactivată în modul incognito.</translation> <translation id="3551268116566418498">Ieși din modul incognito?</translation> <translation id="3586500876634962664">Folosirea camerei și a microfonului</translation> <translation id="358794129225322306">Permite unui site să descarce automat mai multe fișiere.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Ferestre pop-up și redirecționări</translation> <translation id="445467742685312942">Permite site-urilor să redea conținut protejat</translation> <translation id="4468959413250150279">Dezactivează sunetul pentru un anumit site.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# cookie}few{# cookie-uri}other{# de cookie-uri}}</translation> <translation id="4479647676395637221">Întreabă înainte de a permite site-urilor să folosească camera foto (recomandat)</translation> <translation id="4505788138578415521">Adresă URL extinsă</translation> <translation id="4534723447064627427">Pentru a permite aplicației <ph name="APP_NAME" /> să acceseze microfonul, activează microfonul și în <ph name="BEGIN_LINK" />Setările Android<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb index dc26200..a8e946a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -34,6 +34,7 @@ <translation id="1785415724048343560">හොඳම අත්දැකීම සඳහා නිර්දේශ කරනු ලැබේ</translation> <translation id="1818308510395330587"><ph name="APP_NAME" /> හට AR භාවිත කිරීමට ඉඩ දීමට, <ph name="BEGIN_LINK" />Android සැකසීම්<ph name="END_LINK" /> තුළ කැමරාවද ක්රියාත්මක කරන්න.</translation> <translation id="1864927262126810325"><ph name="SOURCE_NAME" /> සිට</translation> +<translation id="187227595286001730">අදාළ වෙබ් අඩවි සමූහය තුළ ඔබේ ක්රියාකාරකම් දැකිය හැකි ය</translation> <translation id="1887786770086287077">මෙම උපාංගය සඳහා ස්ථාන ප්රවේශය ක්රියා විරහිතයි. <ph name="BEGIN_LINK" />Android සැකසීම්<ph name="END_LINK" /> තුළ එය ක්රියාත්මක කරන්න.</translation> <translation id="1915307458270490472">විසන්ධි කරන්න</translation> <translation id="1919345977826869612">වෙළඳ දැන්වීම්</translation> @@ -172,6 +173,7 @@ <translation id="483914009762354899">මෙම වසම යටතේ සියලු අඩවි ඇතුළත් කරන්න</translation> <translation id="4883854917563148705">කළමනා කෙරෙන සැකසීම් යළි සැකසිය නොහැක</translation> <translation id="4887024562049524730">වෙබ් අඩවිවලට ඔබේ අතත්ය යථාර්ථ උපාංගය සහ දත්ත භාවිත කිරීමට ඉඩ දීමට පෙර අසන්න (නිර්දේශිතයි)</translation> +<translation id="4955223779495905865">ඔබ පිවිසෙන වෙබ් අඩවියකට වෙනත් වෙබ් අඩවි වලින් අන්තර්ගතය කාවැද්දීමට හැකිය, උදාහරණයක් ලෙස රූප, දැන්වීම් සහ පාඨය. මෙම ඕනෑම වෙබ් අඩවියකට ඔබේ අත්දැකීම පුද්ගලායන කිරීමට කුකී සහ අනෙකුත් දත්ත සුරැකිය හැකි ය.</translation> <translation id="4962975101802056554">උපාංගය සඳහා සියලුම අවසර අහෝසි කරන්න</translation> <translation id="497421865427891073">ඉදිරියට යන්න</translation> <translation id="4976702386844183910">අවසන් වරට <ph name="DATE" /> පිවිසි</translation> @@ -181,6 +183,7 @@ <translation id="5048398596102334565">වෙබ් අඩවිවලට චලන සංවේදකවලට ප්රවේශ වීමට ඉඩ දෙන්න (නිර්දේශිතයි)</translation> <translation id="5050380848339752099">මෙම අඩවිය අප්රසිද්ධ ප්රකාරයෙන් පිටත යෙදුමක් සමග තොරතුරු බෙදා ගැනීමට සූදානම්ය.</translation> <translation id="5063480226653192405">භාවිතය</translation> +<translation id="5082281938627763039">මෙය <ph name="FPS_MEMBER" /> සහ <ph name="FPS_OWNER" />ගේ වෙබ් අඩවි සමූහයේ වෙබ් අඩවි සඳහා කුකී සහ අනෙකුත් වෙබ් අඩවි දත්ත මකා දමයි</translation> <translation id="5091013926750941408">ජංගම අඩවිය</translation> <translation id="509133520954049755">ඩෙස්ක්ටොප් දසුන ඉල්ලන්න</translation> <translation id="5100237604440890931">හකුළන ලදි - දිග හැරීමට ක්ලික් කරන්න</translation> @@ -217,6 +220,7 @@ <translation id="5677928146339483299">බාධාකළ</translation> <translation id="5689516760719285838">ස්ථානය</translation> <translation id="5690795753582697420">Android සැකසීම් තුළ කැමරාව අක්රිය කර ඇත</translation> +<translation id="5706552988683188916">මෙය <ph name="WEBSITE" /> සඳහා වන කුකී සහ අනෙකුත් අඩවි දත්ත මකයි</translation> <translation id="5719847187258001597">මෙය <ph name="ORIGIN" /> හෝ එහි යෙදුම විසින් ඔබේ මුල් තිරය මත ගබා කරනු ලැබූ සියලුම දත්ත සහ කුකී ඉවත් කරයි.</translation> <translation id="5771720122942595109"><ph name="PERMISSION_1" /> අවහිර කරන ලදී</translation> <translation id="5804241973901381774">අවසර</translation> @@ -317,6 +321,7 @@ <translation id="7882806643839505685">නිශ්චිත අඩවියක් සඳහා ශබ්දයට ඉඩ දෙන්න.</translation> <translation id="789180354981963912">අප්රසිද්ධ තුළ තෙවන පාර්ශ්ව කුකී අවහිර කරන්න:</translation> <translation id="7940722705963108451">මට සිහිකැඳවන්න</translation> +<translation id="7974024493641668069">{COUNT,plural, =1{සමූහය තුළ ඔබේ ක්රියාකාරකම් දැකිය හැකි <ph name="FPS_OWNER" /> ගේ වෙබ් අඩවි සමූහයේ <ph name="FPS_MEMBERS_COUNT" /> වෙබ් අඩවියක්}one{සමූහය තුළ ඔබේ ක්රියාකාරකම් දැකිය හැකි <ph name="FPS_OWNER" /> ගේ වෙබ් අඩවි සමූහයේ වෙබ් අඩවි <ph name="FPS_MEMBERS_COUNT" /> ක්}other{සමූහය තුළ ඔබේ ක්රියාකාරකම් දැකිය හැකි <ph name="FPS_OWNER" /> ගේ වෙබ් අඩවි සමූහයේ වෙබ් අඩවි <ph name="FPS_MEMBERS_COUNT" /> ක්}}</translation> <translation id="7986741934819883144">සම්බන්ධතාවක් තෝරාගන්න</translation> <translation id="7999064672810608036">කුකීස් ඇතුළු සියලු පෙදෙසි දත්ත හිස් කිරීමට අවශ්ය යැයි සහ මෙම වෙබ් අඩවිය සඳහා සියලු අවසර නැවත සැකසිය යුතු යැයි ඔබට විශ්වාස ද?</translation> <translation id="8007176423574883786">මෙම උපාංගය සඳහා ක්රියාවිරහිත කරන ලදී.</translation> @@ -355,6 +360,7 @@ <translation id="8499083585497694743">මයික්රෆෝනය නිහඬ කිරීම ඉවත් කරන්න</translation> <translation id="851751545965956758">අඩවි උපාංගවලට සම්බන්ධ වීම අවහිර කරන්න</translation> <translation id="8525306231823319788">සම්පුර්ණ තිරය</translation> +<translation id="8564613706851221529">{COUNT,plural, =1{<ph name="FPS_MEMBERS_COUNT" /> <ph name="FPS_OWNER" /> වෙබ් අඩවියක් සඳහා කුකීවලට ඉඩ දී ඇත}one{වෙබ් අඩවි <ph name="FPS_MEMBERS_COUNT" /> <ph name="FPS_OWNER" />කට කුකීවලට ඉඩ දී ඇත}other{වෙබ් අඩවි <ph name="FPS_MEMBERS_COUNT" /> <ph name="FPS_OWNER" />කට කුකීවලට ඉඩ දී ඇත}}</translation> <translation id="857943718398505171">ඉඩ දේ (නිර්දේශිතයි)</translation> <translation id="8609465669617005112">ඉහළට යන්න</translation> <translation id="8676374126336081632">ආදානය හිස් කරන්න</translation> @@ -380,6 +386,8 @@ <translation id="8986362086234534611">අමතක</translation> <translation id="9019902583201351841">ඔබේ දෙමව්පියන් පාලනය කරයි</translation> <translation id="9074739597929991885">Bluetooth</translation> +<translation id="9090268041676521955">මෙම වෙබ් අඩවිය ඔබේ ක්රියාකාරකම් දැකිය හැකි සමූහයක ඇත. <ph name="FPS_OWNER" /> ලෙස සමූහය නිර්වචනය කර ඇත</translation> +<translation id="9106233582039520022">කුකී මකන්න ද?</translation> <translation id="9109747640384633967">{PERMISSIONS_SUMMARY_MIXED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> සහ තවත් <ph name="NUM_MORE" />}}</translation> <translation id="913657688200966289"><ph name="APP_NAME" /> සඳහා අවසර <ph name="BEGIN_LINK" />Android සැකසීම්<ph name="END_LINK" /> තුළ ක්රියාත්මක කරන්න.</translation> <translation id="9162462602695099906">මෙම පිටුව අනතුරුදායකයි</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb index a96ded7..9f907ba 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3248611290851046188">Ovaj sajt definiše interesovanja koja drugi sajtovi mogu da koriste da bi vam prikazivali oglase. Ovaj sajt takođe prima podatke o vašim interesovanjima iz Chrome-a da bi vam prikazivao relevantnije oglase.</translation> <translation id="3277252321222022663">Dozvoli sajtovima da pristupaju senzorima (preporučeno)</translation> +<translation id="3285500645985761267">Dozvolite srodnim sajtovima da vide vaše aktivnosti u grupi</translation> <translation id="3295602654194328831">Sakrij informacije</translation> <translation id="3328801116991980348">Informacije o sajtu</translation> <translation id="3333961966071413176">Svi kontakti</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Pitaj pre nego što dozvoliš sajtovima da znaju lokaciju (preporučeno)</translation> <translation id="3521663503435878242">Sajtovi na domenu <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Sprečite sajtove da prave 3D mapu okruženja ili da prate položaj kamere</translation> +<translation id="3544058026430919413">Preduzeće može da definiše grupu sajtova koji mogu da koriste kolačiće da bi delili aktivnosti u grupi. Ovo je isključeno u režimu bez arhiviranja.</translation> <translation id="3551268116566418498">Izlazite iz rež. bez arhiviranja?</translation> <translation id="3586500876634962664">Korišćenje kamere i mikrofona</translation> <translation id="358794129225322306">Dozvolite sajtu da automatski preuzima više datoteka.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Iskačući prozori i preusmeravanja</translation> <translation id="445467742685312942">Dozvolite sajtovima da puštaju zaštićeni sadržaj</translation> <translation id="4468959413250150279">Isključi zvuk za određeni sajt</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# kolačić}one{# kolačić}few{# kolačića}other{# kolačića}}</translation> <translation id="4479647676395637221">Pitaj pre nego što dozvoliš sajtovima da koriste kameru (preporučeno)</translation> <translation id="4505788138578415521">URL je proširen</translation> <translation id="4534723447064627427">Da biste dozvolili da <ph name="APP_NAME" /> pristupa mikrofonu, uključite mikrofon i u <ph name="BEGIN_LINK" />Android podešavanjima<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb index 22ba177..795443e8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Микрофон</translation> <translation id="3248611290851046188">Овај сајт дефинише интересовања која други сајтови могу да користе да би вам приказивали огласе. Овај сајт такође прима податке о вашим интересовањима из Chrome-а да би вам приказивао релевантније огласе.</translation> <translation id="3277252321222022663">Дозволи сајтовима да приступају сензорима (препоручено)</translation> +<translation id="3285500645985761267">Дозволите сродним сајтовима да виде ваше активности у групи</translation> <translation id="3295602654194328831">Сакриј информације</translation> <translation id="3328801116991980348">Информације о сајту</translation> <translation id="3333961966071413176">Сви контакти</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Питај пре него што дозволиш сајтовима да знају локацију (препоручено)</translation> <translation id="3521663503435878242">Сајтови на домену <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Спречите сајтове да праве 3D мапу окружења или да прате положај камере</translation> +<translation id="3544058026430919413">Предузеће може да дефинише групу сајтова који могу да користе колачиће да би делили активности у групи. Ово је искључено у режиму без архивирања.</translation> <translation id="3551268116566418498">Излазите из реж. без архивирања?</translation> <translation id="3586500876634962664">Коришћење камере и микрофона</translation> <translation id="358794129225322306">Дозволите сајту да аутоматски преузима више датотека.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Искачући прозори и преусмеравања</translation> <translation id="445467742685312942">Дозволите сајтовима да пуштају заштићени садржај</translation> <translation id="4468959413250150279">Искључи звук за одређени сајт</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# колачић}one{# колачић}few{# колачића}other{# колачића}}</translation> <translation id="4479647676395637221">Питај пре него што дозволиш сајтовима да користе камеру (препоручено)</translation> <translation id="4505788138578415521">URL је проширен</translation> <translation id="4534723447064627427">Да бисте дозволили да <ph name="APP_NAME" /> приступа микрофону, укључите микрофон и у <ph name="BEGIN_LINK" />Android подешавањима<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb index aa33341..61ee139f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Mikrofon</translation> <translation id="3248611290851046188">Bu sayt boshqa saytlar reklama chiqarishda ishlata oladigan qiziqishlarni ifodalaydi. Bu sayt ham mos reklamalarni chiqarish uchun qiziqishlaringiz haqidagi Chrome maʼlumotlaridan foydalanadi.</translation> <translation id="3277252321222022663">Saytlarga sensorlardan foydalanish uchun ruxsat berish (tavsiya etiladi)</translation> +<translation id="3285500645985761267">Aloqador saytlarga guruhdagi faoliyatni koʻrishga ruxsat berish</translation> <translation id="3295602654194328831">Ma’lumotlarni yashirish</translation> <translation id="3328801116991980348">Sayt haqida ma’lumot</translation> <translation id="3333961966071413176">Barcha kontaktlar</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Joylashuv ma’lumotini ko‘rishiga ruxsat so‘ralsin (tavsiya etiladi)</translation> <translation id="3521663503435878242"><ph name="DOMAIN" /> domenidagi saytlar</translation> <translation id="3538390592868664640">Saytlarni atrofingizning 3D xaritasini yaratish yoki kamera joylashuvini aniqlashdan bloklash</translation> +<translation id="3544058026430919413">Kompaniya saytlar guruhini jamlashi va cookielar yordamida guruhdagi faoliyatni ulashishi mumkin. Inkognito rejimidan chiqish.</translation> <translation id="3551268116566418498">Inkognito rejimi tark etilsinmi?</translation> <translation id="3586500876634962664">Kamera va mikrofonni ishlatish</translation> <translation id="358794129225322306">Saytga birdaniga bir nechta fayl yuklab olishga ruxsat berish.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Qalquvchi oyna va yo‘naltirishlar</translation> <translation id="445467742685312942">Saytlarga himoyalangan kontentni ijro qilish uchun ruxsat berish</translation> <translation id="4468959413250150279">Muayyan saytdagi ovozni o‘chirish.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# ta cookie}other{# ta cookie}}</translation> <translation id="4479647676395637221">Kameradan foydalanishga ruxsat so‘ralsin (tavsiya etiladi)</translation> <translation id="4505788138578415521">URL manzil yoyildi</translation> <translation id="4534723447064627427"><ph name="APP_NAME" /> mikrofondan foydalanishiga ruxsat berish uchun <ph name="BEGIN_LINK" />Android sozlamalari<ph name="END_LINK" /> orqali mikrofonni yoqing.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb index a052532..3d756ee3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -110,6 +110,7 @@ <translation id="3227137524299004712">Micrô</translation> <translation id="3248611290851046188">Trang web này xác định các mối quan tâm mà các trang web khác có thể sử dụng để hiển thị quảng cáo cho bạn. Trang web này cũng lấy thông tin về mối quan tâm của bạn qua Chrome để hiển thị cho bạn những quảng cáo phù hợp hơn</translation> <translation id="3277252321222022663">Cho phép các trang web sử dụng cảm biến của thiết bị (nên dùng)</translation> +<translation id="3285500645985761267">Cho phép các trang web liên quan xem hoạt động của bạn trong nhóm</translation> <translation id="3295602654194328831">Ẩn thông tin</translation> <translation id="3328801116991980348">Thông tin về trang web</translation> <translation id="3333961966071413176">Tất cả người liên hệ</translation> @@ -117,6 +118,7 @@ <translation id="3386292677130313581">Hỏi trước khi cho phép các trang web biết vị trí của bạn (được đề xuất)</translation> <translation id="3521663503435878242">Các trang web trong <ph name="DOMAIN" /></translation> <translation id="3538390592868664640">Chặn không cho trang web tạo bản đồ 3D về các khu vực xung quanh bạn hoặc theo dõi thông tin vị trí của máy ảnh</translation> +<translation id="3544058026430919413">Một công ty có thể xác định nhóm các trang web được sử dụng cookie để chia sẻ hoạt động của bạn trong nhóm. Tính năng này bị tắt trong chế độ Ẩn danh.</translation> <translation id="3551268116566418498">Thoát khỏi chế độ Ẩn danh?</translation> <translation id="3586500876634962664">Đang sử dụng máy ảnh và micrô</translation> <translation id="358794129225322306">Cho phép một trang web tự động tải xuống nhiều tệp.</translation> @@ -159,6 +161,7 @@ <translation id="4434045419905280838">Cửa sổ bật lên và liên kết chuyển hướng</translation> <translation id="445467742685312942">Cho phép trang web phát nội dung được bảo vệ</translation> <translation id="4468959413250150279">Tắt âm thanh trên một trang web cụ thể.</translation> +<translation id="4475912480633855319">{COOKIES,plural, =1{# cookie}other{# cookie}}</translation> <translation id="4479647676395637221">Hỏi trước trước khi cho phép các trang web sử dụng máy ảnh của bạn (được đề xuất)</translation> <translation id="4505788138578415521">URL đã được mở rộng</translation> <translation id="4534723447064627427">Để cho phép <ph name="APP_NAME" /> truy cập vào micrô của bạn, hãy bật cả micrô trong phần <ph name="BEGIN_LINK" />Cài đặt Android<ph name="END_LINK" />.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index 7388f77..f83dfa3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -110,7 +110,7 @@ <translation id="3227137524299004712">麥克風</translation> <translation id="3248611290851046188">其他網站可使用此網站定義的興趣來向您展示廣告。此網站亦會從 Chrome 取得您的興趣,以便為您顯示更相關的廣告。</translation> <translation id="3277252321222022663">允許網站存取感應器 (建議)</translation> -<translation id="3285500645985761267">允許相關網站查看你在群組中的活動</translation> +<translation id="3285500645985761267">允許相關網站查看您在群組中的活動</translation> <translation id="3295602654194328831">隱藏資料</translation> <translation id="3328801116991980348">網站資料</translation> <translation id="3333961966071413176">所有聯絡人</translation> @@ -118,7 +118,7 @@ <translation id="3386292677130313581">允許網站存取您的位置前先詢問您 (建議)</translation> <translation id="3521663503435878242"><ph name="DOMAIN" /> 下的網站</translation> <translation id="3538390592868664640">禁止網站建立您身處環境的 3D 地圖或追蹤攝錄機位置</translation> -<translation id="3544058026430919413">公司可定義網站群組,指定哪些網站能夠使用 Cookie 分享你在群組中的活動。網站群組不會在無痕模式下啟用。</translation> +<translation id="3544058026430919413">公司可定義網站群組,指定哪些網站可使用 Cookie 分享您在群組中的活動。網站群組不會在無痕模式下啟用。</translation> <translation id="3551268116566418498">要退出無痕模式嗎?</translation> <translation id="3586500876634962664">使用攝錄機和麥克風</translation> <translation id="358794129225322306">允許網站自動下載多個檔案。</translation>
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 47cdff8..776b552 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "13.19", - "log_list_timestamp": "2022-10-16T12:56:49Z", + "version": "13.20", + "log_list_timestamp": "2022-10-17T12:56:01Z", "operators": [ { "name": "Google",
diff --git a/components/dom_distiller/content/browser/dom_distiller_viewer_source.cc b/components/dom_distiller/content/browser/dom_distiller_viewer_source.cc index 710ecc4..484d978 100644 --- a/components/dom_distiller/content/browser/dom_distiller_viewer_source.cc +++ b/components/dom_distiller/content/browser/dom_distiller_viewer_source.cc
@@ -221,12 +221,14 @@ #endif // !BUILDFLAG(IS_ANDROID) if (kViewerCssPath == path) { std::string css = viewer::GetCss(); - std::move(callback).Run(base::RefCountedString::TakeString(&css)); + std::move(callback).Run( + base::MakeRefCounted<base::RefCountedString>(std::move(css))); return; } if (kViewerLoadingImagePath == path) { std::string image = viewer::GetLoadingImage(); - std::move(callback).Run(base::RefCountedString::TakeString(&image)); + std::move(callback).Run( + base::MakeRefCounted<base::RefCountedString>(std::move(image))); return; } if (base::StartsWith(path, kViewerSaveFontScalingPath, @@ -276,8 +278,8 @@ } // Place template on the page. - std::move(callback).Run( - base::RefCountedString::TakeString(&unsafe_page_html)); + std::move(callback).Run(base::MakeRefCounted<base::RefCountedString>( + std::move(unsafe_page_html))); } std::string DomDistillerViewerSource::GetMimeType(const GURL& url) {
diff --git a/components/exo/data_offer.cc b/components/exo/data_offer.cc index 8a2862e..6b9a14b6 100644 --- a/components/exo/data_offer.cc +++ b/components/exo/data_offer.cc
@@ -75,7 +75,7 @@ base::UTF16ToCodepage(text, charset.c_str(), base::OnStringConversionError::SUBSTITUTE, &encoded_text); - return base::RefCountedString::TakeString(&encoded_text); + return base::MakeRefCounted<base::RefCountedString>(std::move(encoded_text)); } DataOffer::AsyncSendDataCallback AsyncEncodeAsRefCountedString( @@ -137,7 +137,8 @@ std::string text; ui::Clipboard::GetForCurrentThread()->ReadRTF(ui::ClipboardBuffer::kCopyPaste, &data_dst, &text); - std::move(callback).Run(base::RefCountedString::TakeString(&text)); + std::move(callback).Run( + base::MakeRefCounted<base::RefCountedString>(std::move(text))); } void OnReceivePNGFromClipboard(DataOffer::SendDataCallback callback, @@ -302,7 +303,8 @@ DataOffer::SendDataCallback callback) { std::move(callback).Run(std::move(contents)); }, - base::RefCountedString::TakeString(&file_contents)); + base::MakeRefCounted<base::RefCountedString>(std::move(file_contents))); + data_callbacks_.emplace(mime_type, std::move(callback)); delegate_->OnOffer(mime_type); }
diff --git a/components/exo/wayland/protocol/aura-shell.xml b/components/exo/wayland/protocol/aura-shell.xml index 1b25c351..5ab00a5 100644 --- a/components/exo/wayland/protocol/aura-shell.xml +++ b/components/exo/wayland/protocol/aura-shell.xml
@@ -24,7 +24,7 @@ DEALINGS IN THE SOFTWARE. </copyright> - <interface name="zaura_shell" version="43"> + <interface name="zaura_shell" version="42"> <description summary="aura_shell"> The global interface exposing aura shell capabilities is used to instantiate an interface extension for a wl_surface object. @@ -536,7 +536,7 @@ </request> </interface> - <interface name="zaura_output" version="43"> + <interface name="zaura_output" version="38"> <description summary="aura shell interface to a wl_output"> An additional interface to a wl_output object, which allows the client to access aura shell specific functionality for output. @@ -682,15 +682,6 @@ See zaura_shell.release for destructor naming. </description> </request> - - <event name="display_id" since="43"> - <description summary="advertise the output's display id"> - This event describes the 64bit display id assigned to each display by ChromeOS. - The value is opaque and should not be interpreted. - </description> - <arg name="display_id_hi" type="uint"/> - <arg name="display_id_lo" type="uint"/> - </event> </interface> <interface name="zaura_toplevel" version="42"> @@ -755,7 +746,7 @@ <arg name="y" type="int"/> <arg name="width" type="int"/> <arg name="height" type="int"/> - <arg name="output" type="object" interface="wl_output" summary="the output" allow-null="true"/> + <arg name="output" type="object" interface="wl_output" summary="the output"/> </request> <event name="configure" since="29">
diff --git a/components/exo/wayland/zaura_shell.cc b/components/exo/wayland/zaura_shell.cc index bd73ae9..5530233 100644 --- a/components/exo/wayland/zaura_shell.cc +++ b/components/exo/wayland/zaura_shell.cc
@@ -865,13 +865,6 @@ const display::ManagedDisplayInfo& display_info = wm_helper->GetDisplayInfo(display.id()); - if (wl_resource_get_version(resource_) >= - ZAURA_OUTPUT_DISPLAY_ID_SINCE_VERSION) { - uint32_t display_id_hi = static_cast<uint32_t>(display.id() >> 32); - uint32_t display_id_lo = static_cast<uint32_t>(display.id()); - zaura_output_send_display_id(resource_, display_id_hi, display_id_lo); - } - if (wl_resource_get_version(resource_) >= ZAURA_OUTPUT_SCALE_SINCE_VERSION) { display::ManagedDisplayMode active_mode; bool rv = wm_helper->GetActiveModeForDisplayId(display.id(), &active_mode);
diff --git a/components/exo/wayland/zaura_shell.h b/components/exo/wayland/zaura_shell.h index 31f1d5f..a2e42f6e 100644 --- a/components/exo/wayland/zaura_shell.h +++ b/components/exo/wayland/zaura_shell.h
@@ -26,7 +26,7 @@ namespace wayland { class SerialTracker; -constexpr uint32_t kZAuraShellVersion = 43; +constexpr uint32_t kZAuraShellVersion = 42; // Adds bindings to the Aura Shell. Normally this implies Ash on ChromeOS // builds. On non-ChromeOS builds the protocol provides access to Aura windowing
diff --git a/components/external_intents/DIR_METADATA b/components/external_intents/DIR_METADATA new file mode 100644 index 0000000..59ca88f --- /dev/null +++ b/components/external_intents/DIR_METADATA
@@ -0,0 +1,13 @@ +# Metadata information for this directory. +# +# For more information on DIR_METADATA files, see: +# https://source.chromium.org/chromium/infra/infra/+/main:go/src/infra/tools/dirmd/README.md +# +# For the schema of this file, see Metadata message: +# https://source.chromium.org/chromium/infra/infra/+/main:go/src/infra/tools/dirmd/proto/dir_metadata.proto + +os: ANDROID + +monorail { + component: "Mobile>Intents" +}
diff --git a/components/feedback/content/content_tracing_manager.cc b/components/feedback/content/content_tracing_manager.cc index 8f970ac..3bea68a 100644 --- a/components/feedback/content/content_tracing_manager.cc +++ b/components/feedback/content/content_tracing_manager.cc
@@ -31,7 +31,7 @@ std::string output_val; feedback_util::ZipString(base::FilePath(kTracingFilename), *trace_data, &output_val); - return base::RefCountedString::TakeString(&output_val); + return base::MakeRefCounted<base::RefCountedString>(std::move(output_val)); } } // namespace
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java index b3ab550..22e53fc0 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java
@@ -105,12 +105,12 @@ address, result); if (mSubPage != null) { mSubPage.setStorageUsage(mWebsite.getTotalUsage()); - } - boolean isFPSInfoShown = mSubPage.maybeShowFPSInfo( - mWebsite.getFPSCookieInfo(), mWebsite.getAddress().getOrigin()); - RecordHistogram.recordBooleanHistogram( - "Security.PageInfo.Cookies.HasFPSInfo", isFPSInfoShown); + boolean isFPSInfoShown = mSubPage.maybeShowFPSInfo( + mWebsite.getFPSCookieInfo(), mWebsite.getAddress().getOrigin()); + RecordHistogram.recordBooleanHistogram( + "Security.PageInfo.Cookies.HasFPSInfo", isFPSInfoShown); + } } private void onCheckedChangedCallback(boolean state) {
diff --git a/components/password_manager/core/browser/password_autofill_manager.cc b/components/password_manager/core/browser/password_autofill_manager.cc index 25e7ed7..1733987 100644 --- a/components/password_manager/core/browser/password_autofill_manager.cc +++ b/components/password_manager/core/browser/password_autofill_manager.cc
@@ -537,15 +537,20 @@ base::UTF8ToUTF16(GetShownOrigin(url::Origin::Create( password_manager_driver_->GetLastCommittedURL()))); + auto on_reath_complete = + base::BindOnce(&PasswordAutofillManager::OnBiometricReauthCompleted, + base::Unretained(this), suggestion.main_text.value, + suggestion.frontend_id); + // `this` cancels the authentication when it is destructed, which // invalidates the callback, so using base::Unretained here is safe. authenticator_->AuthenticateWithMessage( device_reauth::BiometricAuthRequester::kAutofillSuggestion, l10n_util::GetStringFUTF16(IDS_PASSWORD_MANAGER_FILLING_REAUTH, origin), - base::BindOnce(&PasswordAutofillManager::OnBiometricReauthCompleted, - base::Unretained(this), suggestion.main_text.value, - suggestion.frontend_id)); + metrics_util::TimeCallback( + std::move(on_reath_complete), + "PasswordManager.PasswordFilling.AuthenticationTime")); #endif } } @@ -960,6 +965,8 @@ int frontend_id, bool auth_succeeded) { authenticator_.reset(); + base::UmaHistogramBoolean( + "PasswordManager.PasswordFilling.AuthenticationResult", auth_succeeded); if (!auth_succeeded) return; bool success = FillSuggestion(GetUsernameFromSuggestion(value), frontend_id);
diff --git a/components/password_manager/core/browser/password_autofill_manager_unittest.cc b/components/password_manager/core/browser/password_autofill_manager_unittest.cc index 24d5ff8b..2987035de 100644 --- a/components/password_manager/core/browser/password_autofill_manager_unittest.cc +++ b/components/password_manager/core/browser/password_autofill_manager_unittest.cc
@@ -15,10 +15,12 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/test/gmock_callback_support.h" +#include "base/test/gmock_move_support.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/user_action_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "base/timer/elapsed_timer.h" #include "build/build_config.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/test_autofill_client.h" @@ -2062,6 +2064,52 @@ #endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) +TEST_F(PasswordAutofillManagerTest, MetricsRecordedForBiometricAuth) { + base::ScopedMockElapsedTimersForTest mock_elapsed_timers_; + base::HistogramTester histograms; + TestPasswordManagerClient client; + ON_CALL(*client.GetPasswordFeatureManager(), + IsBiometricAuthenticationBeforeFillingEnabled) + .WillByDefault(Return(true)); + NiceMock<MockAutofillClient> autofill_client; + client.SetBiometricAuthenticator(authenticator_); + + InitializePasswordAutofillManager(&client, &autofill_client); + + // Show the popup. + password_autofill_manager_->OnShowPasswordSuggestions( + base::i18n::RIGHT_TO_LEFT, std::u16string(), 0, gfx::RectF()); + + // The authenticator exists and is available. + EXPECT_CALL(*authenticator_.get(), CanAuthenticate).WillOnce(Return(true)); + base::OnceCallback<void(bool)> auth_callback; + EXPECT_CALL(*authenticator_.get(), AuthenticateWithMessage) + .WillOnce(MoveArg<2>(&auth_callback)); + + // Accept the suggestion to start the filing process which tries to + // reauthenticate the user. + password_autofill_manager_->DidAcceptSuggestion( + autofill::test::CreateAutofillSuggestion( + autofill::POPUP_ITEM_ID_PASSWORD_ENTRY, test_username_), + 1); + + // Simulate successful authentication and expect successful filling. + EXPECT_CALL(*client.mock_driver(), + FillSuggestion(test_username_, test_password_)); + std::move(auth_callback).Run(true); + + // Verify reported metrics. + const int64_t kMockElapsedTime = + base::ScopedMockElapsedTimersForTest::kMockElapsedTime.InMilliseconds(); + histograms.ExpectUniqueSample( + "PasswordManager.PasswordFilling.AuthenticationResult", true, 1); + histograms.ExpectUniqueSample( + "PasswordManager.PasswordFilling.AuthenticationTime", kMockElapsedTime, + 1); +} +#endif + TEST_F(PasswordAutofillManagerTest, ShowsWebAuthnSuggestions) { TestPasswordManagerClient client; NiceMock<MockAutofillClient> autofill_client;
diff --git a/components/performance_manager/v8_memory/v8_context_tracker_internal.cc b/components/performance_manager/v8_memory/v8_context_tracker_internal.cc index f4d7acd..043b8af4 100644 --- a/components/performance_manager/v8_memory/v8_context_tracker_internal.cc +++ b/components/performance_manager/v8_memory/v8_context_tracker_internal.cc
@@ -135,7 +135,7 @@ static_cast<bool>(description.execution_context_token)); if (execution_context_data) { DCHECK_EQ(execution_context_data->GetToken(), - *description.execution_context_token); + description.execution_context_token.value()); // These must be same process. DCHECK_EQ(process_data, execution_context_data->process_data());
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index 0da30e3..43b4470 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -2846,13 +2846,13 @@ repeated SignedData secure_commands = 2; } -// Sent by the client to the server to check if the current user is allowed -// to update attributes (asset id and location). The HTTP request contains an -// end-user OAuth token. +// Sent by the client to the server to check if the current user or device is +// allowed to update attributes (asset id and location). The HTTP request +// can contain an end-user OAuth token or a device DM Token. message DeviceAttributeUpdatePermissionRequest {} -// Response from the server specifying whether the current user is allowed to -// update attributes (asset id and location). +// Response from the server specifying whether the current user or device is +// allowed to update attributes (asset id and location). message DeviceAttributeUpdatePermissionResponse { enum ResultType { ATTRIBUTE_UPDATE_DISALLOWED = 0; @@ -2863,7 +2863,8 @@ } // Sent by the client to the server to update device attributes (asset id and -// location). The HTTP request contains an end-user OAuth token. +// location). The HTTP request can contain an end-user OAuth token or a device +// DM Token. message DeviceAttributeUpdateRequest { // The user-generated asset identifier. optional string asset_id = 1;
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index ce63436..ef28a5c 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -227,6 +227,7 @@ Standardwert ist RollbackDisabled.</translation> <translation id="1221359380862872747">Bei Demo-Anmeldung angegebene URLs laden</translation> +<translation id="1221955019309484560">Updates für alle Komponenten aktivieren</translation> <translation id="1223789468190631420">Safe Browsing-Aktivierungsstatus für vertrauenswürdige Quellen</translation> <translation id="123018742985150697">Übereinstimmung von lokalem Nutzer und dem Inhaber des Hosts für den Remote-Zugriff voraussetzen</translation> <translation id="123081309365616809">Streamen von Inhalten an das Gerät aktivieren</translation> @@ -491,6 +492,7 @@ Wenn die Richtlinie konfiguriert ist, wird ihr Wert als die vorgeschlagene Konfiguration angewendet und im Authentifizierungsdialogfeld im Bereich „Erweitert“ angezeigt. Wenn die Richtlinie nicht konfiguriert ist, wird stattdessen die empfohlene <ph name="PRODUCT_OS_NAME" />-Konfiguration angewendet. Sie wird auch im Authentifizierungsdialogfeld im Bereich „Erweitert“ angezeigt.</translation> +<translation id="1487722536912664411">Nutzern erlauben, <ph name="PRODUCT_NAME" /> zu verwenden</translation> <translation id="1487916040416013623">Wenn diese Richtlinie konfiguriert ist, wird festgelegt, welche Server für die integrierte Authentifizierung zulässig sind. Die integrierte Authentifizierung wird nur dann aktiviert, wenn <ph name="PRODUCT_NAME" /> eine Authentifizierungsaufforderung von einem Proxy oder einem Server erhält, der sich in dieser Liste zulässiger Programme befindet. Wenn die Richtlinie nicht konfiguriert ist, versucht <ph name="PRODUCT_NAME" /> zu ermitteln, ob sich ein Server im Intranet befindet. Es reagiert nur dann auf IWA-Anfragen. Wenn der Server sich dagegen im Internet befindet, werden dessen IWA-Anfragen von <ph name="PRODUCT_NAME" /> ignoriert. @@ -632,6 +634,7 @@ <translation id="1617235075406854669">Löschen des Browserverlaufs und des Downloadverlaufs aktivieren</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="162162247775156979">Melden des Speicherstatus auf Geräten deaktivieren</translation> +<translation id="1625700732886306811"><ph name="PRODUCT_NAME" /> erlauben, Verbindungen zu Geräten unter allen IP-Adressen herzustellen</translation> <translation id="1626379196197114720">Verwendung des Back-Forward-Cache zulassen</translation> <translation id="1628974048137236820">Die „Neuer Tab“-Seite zeigt keine Karten an</translation> <translation id="1630263002012156148">Wenn die Richtlinie aktiviert ist, wird die „Neuer Tab“-Seite als Startseite des Nutzers verwendet und die Startseiten-URL wird ignoriert. Ist diese Richtlinie deaktiviert, wird die „Neuer Tab“-Seite nie als Startseite verwendet, es sei denn, die Startseiten-URL des Nutzers ist chrome://newtab. @@ -668,6 +671,7 @@ <translation id="1654087023995670109">Gastmodus im Browser erzwingen</translation> <translation id="1655229863189977773">Cache-Größe für Datenträger in Byte festlegen</translation> <translation id="165769015320654523">Websites automatisch die Berechtigung erteilen, eine Verbindung zu HID-Geräten mit den angegebenen Anbieter- und Produkt-IDs herzustellen.</translation> +<translation id="1659406551862245683">Das Standardverhalten der Bildschirmtastatur wird geändert, um die Größe des Layout-Darstellungsbereichs anzupassen</translation> <translation id="166427968280387991">Proxyserver</translation> <translation id="1669584285557771729">Wenn diese Richtlinie konfiguriert ist, wird damit der Lupentyp bestimmt, der aktiviert ist. @@ -1116,6 +1120,7 @@ <translation id="2107601598727098402"> Diese Richtlinie wird in M72 eingestellt. Verwenden sie stattdessen CloudManagementEnrollmentToken. </translation> +<translation id="2112656109118682849">Nutzern erlauben, das Einblenden von Systeminformationen auf dem Anmeldebildschirm ein- oder auszuschalten</translation> <translation id="2113068765175018713">Betriebsdauer der Geräte durch automatische Neustarts begrenzen</translation> <translation id="2116169546538119304">Diese Richtlinie wurde eingestellt. Bitte konfiguriere stattdessen Kerberos-Richtlinien, um das Anmeldepasswort noch einmal zu verwenden.</translation> <translation id="2117990069872855599">URL, über die das Avatarbild heruntergeladen werden kann.</translation> @@ -1444,6 +1449,7 @@ Genaue Informationen zu gültigen URL-Mustern findest du unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Allerdings werden ab M85 Muster mit den Platzhaltern „*“ und „[*.]“ auf dem Host für diese Richtlinie nicht mehr unterstützt.</translation> <translation id="2423255396068675416">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, können Nutzer <ph name="PRODUCT_CROSTINI_NAME" /> ausführen, solange <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> und <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> aktiviert sind. Ist die Richtlinie deaktiviert, ist auch <ph name="PRODUCT_CROSTINI_NAME" /> für Nutzer deaktiviert. Wenn sie deaktiviert wird, wird die Richtlinie beim Starten neuer <ph name="PRODUCT_CROSTINI_NAME" />-Container angewandt. Die bereits ausgeführten sind nicht betroffen.</translation> +<translation id="242521047682347997">Nutzern nicht erlauben, SMS zwischen Smartphone und Chromebook zu synchronisieren</translation> <translation id="2426782419955104525">Hiermit wird die Instant-Funktion von <ph name="PRODUCT_NAME" /> aktiviert und verhindert, dass Nutzer diese Einstellung ändern können. Wenn du diese Einstellung aktivierst, ist <ph name="PRODUCT_NAME" /> Instant aktiviert. @@ -1980,6 +1986,13 @@ Wenn sie auf „Deaktiviert“ gesetzt ist, werden die Komponenten nicht aktualisiert. Für einige Komponenten gelten jedoch Ausnahmen: Updates von Komponenten, die keinen ausführbaren Code enthalten und wesentlich für die Sicherheit des Browsers sind, werden nicht deaktiviert. Beispiele für solche Komponenten sind Zertifikatssperrlisten und Unterressourcenfilter.</translation> +<translation id="2932796739547676677">Wenn du die Richtlinie auf „True“ setzt, wird die Größe des Layout-Darstellungsbereichs standardmäßig durch die Bildschirmtastatur angepasst. + Andere Zustände („False“/„Nicht festgelegt“) haben keine Auswirkungen. + + Dies wirkt sich nur auf die standardmäßige Größenanpassung aus: Wenn eine Seite über ein <meta>-Tag oder die Virtual Keyboard API ein bestimmtes Verhalten anfordert, gilt dieses angeforderte Verhalten weiterhin. + + Außerdem ist diese Richtlinie nur als vorübergehende Notlösung gedacht. + </translation> <translation id="2939335382784544151">Import des Browserverlaufs bei der ersten Ausführung aktivieren</translation> <translation id="2940127076681735544">Ist für die Richtlinie eine gültige URL angegeben, lädt <ph name="PRODUCT_NAME" /> die Websiteliste von dieser URL herunter und wendet die Regeln so an, als wären sie mit der Richtlinie "<ph name="SITELIST_POLICY_NAME" />" konfiguriert worden. @@ -2215,6 +2228,7 @@ <translation id="3142410959002029864">Durch die Richtlinie wird der standardmäßige Duplexmodus überschrieben. Wenn der Modus nicht verfügbar ist, wird die Richtlinie ignoriert.</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="3150351525324499342"><ph name="PRODUCT_NAME" />-Symbol nicht standardmäßig in der Symbolleiste anzeigen, sondern Nutzer auswählen lassen</translation> <translation id="3152425128389603870">Unified Desktop verfügbar machen und standardmäßig aktivieren</translation> <translation id="3157857846231611820">Liste der Einstellungen für Chrome Enterprise Connectors-Dienste für den Enterprise Connector „<ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" />“. Dieser wird ausgelöst, wenn eine Datei an eine Seite in Chrome angehängt wird. @@ -2445,6 +2459,7 @@ Die Richtlinie kann für bestimmte URL-Muster überschrieben werden. Hierfür stehen die Richtlinien "InsecureContentAllowedForUrls" und "InsecureContentBlockedForUrls" zur Verfügung. Ist diese Richtlinie nicht konfiguriert, dürfen Nutzer Ausnahmen hinzufügen, um blockierbare gemischte Inhalte zuzulassen und das automatische Upgrade auf HTTPS von optional blockierbaren gemischten Inhalten zu deaktivieren.</translation> +<translation id="3307744348419745296">Nicht zulassen, dass WLAN-Konfigurationen zwischen <ph name="PRODUCT_OS_NAME" />-Geräten und einem verbundenen Android-Smartphone synchronisiert werden</translation> <translation id="3308724602356134956">Wenn du die Richtlinie konfigurierst, wird <ph name="PRODUCT_OS_NAME" /> das Hintergrundbild, das du für den Desktop und den Anmeldebildschirm des Nutzers festlegst, herunterladen und verwenden. Nutzer können das Hintergrundbild nicht ändern. Gib die URL an (diese muss ohne Authentifizierung zugänglich sein), von der <ph name="PRODUCT_OS_NAME" /> @@ -2515,6 +2530,7 @@ <translation id="3398051852031115795">Standardmäßiges Systemverhalten (abhängig von der Bildschirmgröße)</translation> <translation id="3399859571630358395">Deaktivierung von schnellem Pairing (schnellem Bluetooth-Koppeln) erzwingen.</translation> <translation id="3404681701763345449">Dadurch wird die <ph name="GOOGLE_CALENDAR_NAME" />-Integration aktiviert.</translation> +<translation id="3405997282295704902">Nutzern nicht erlauben, <ph name="PRODUCT_NAME" /> zu verwenden</translation> <translation id="3406122462682235653">Nutzer nicht fragen (Downloads werden sofort gestartet)</translation> <translation id="3408078762098350617">Diese Richtlinie steuert die Nutzereinstellungen für die in <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" /> aufgelisteten deaktivierten Funktionen. @@ -2633,6 +2649,7 @@ <translation id="3526752951628474302">Nur Schwarz-Weiß-Druck</translation> <translation id="3528000905991875314">Alternative Fehlerseiten aktivieren</translation> <translation id="3531084733660068324">Einstellungen für die Elternaufsicht</translation> +<translation id="353611922042274900">Systeminformationen immer auf dem Anmeldebildschirm anzeigen</translation> <translation id="3536263244905016305">Web Proxy Auto-Discovery (WPAD)-Optimierung deaktivieren</translation> <translation id="3538869107794555625">Bildschirmtastatur im Tabletmodus aktivieren</translation> <translation id="3539103206548425861">Wenn diese Richtlinie konfiguriert ist, können in <ph name="PRODUCT_NAME" /> ohne Zustimmung des Nutzers automatisch Videos mit Ton abgespielt werden. Wenn die Richtlinie <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> auf "True" gesetzt ist, hat diese Richtlinie keine Auswirkungen. Ist die Richtlinie <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> auf "False" gesetzt, können alle in dieser Richtlinie festgelegten URL-Muster weiterhin wiedergegeben werden. Wird die Richtlinie während der Ausführung von <ph name="PRODUCT_NAME" /> geändert, wird sie nur auf neu geöffnete Tabs angewendet. @@ -2977,6 +2994,7 @@ Ist die Richtlinie nicht konfiguriert, steht SPDY zur Verfügung.</translation> <translation id="3887529334667818189">Onlinerecherchen sind standardmäßig unter chrome://history/journeys sichtbar und Nutzer können die Sichtbarkeit von Onlinerecherchen ändern.</translation> +<translation id="388999630001435491"><ph name="PRODUCT_NAME" /> nur erlauben, Verbindungen zu Geräten unter privaten IP-Adressen herzustellen</translation> <translation id="3891175633496805812">Wilco Diagnostics and Telemetry Controller (DTC) deaktivieren</translation> <translation id="3891357445869647828">JavaScript aktivieren</translation> <translation id="3891769546914233112">„PDF als Bild drucken“ verfügbar</translation> @@ -3017,6 +3035,7 @@ Diese Funktion ist deaktiviert, wenn sie leer oder nicht konfiguriert ist. Hinweis: Diese Richtlinie muss mit <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" /> verwendet werden.</translation> +<translation id="3918339829588313389">Nutzer dürfen schwache PIN festlegen</translation> <translation id="3924506460382372403">Melden des Grafikstatus auf Geräten deaktivieren</translation> <translation id="3925377537407648234">Bildschirmauflösung und Skalierungsfaktor festlegen</translation> <translation id="3927137827189017535">Hiermit wird die Bedienungshilfe für die Einfingerbedienung auf dem Anmeldebildschirm aktiviert. @@ -3345,6 +3364,7 @@ <translation id="4274691295133617461">Wenn die Richtlinie auf "3" gesetzt ist, dürfen Websites um Lesezugriff auf Dateien und Verzeichnisse im Dateisystem des Host-Betriebssystems über die File System API bitten. Ist sie auf "2" gesetzt, wird der Zugriff verweigert. Wenn sie nicht konfiguriert ist, können Websites den Zugriff erfragen, aber Nutzer können diese Einstellung ändern.</translation> +<translation id="4282243913059705499"><ph name="PRODUCT_NAME" />-Symbol immer in der Symbolleiste anzeigen</translation> <translation id="4285674129118156176">Nicht verknüpften Nutzern die Verwendung von ARC gestatten</translation> <translation id="428948795004445932">Häufigkeit, mit der Netzwerkdaten analysiert und erhoben werden. Die geringste zulässige Häufigkeit beträgt 1 Minute. @@ -3800,6 +3820,7 @@ Wird die Richtlinie auf "false" gesetzt oder nicht konfiguriert, werden die Informationen zum Betriebssystem-Update nicht gemeldet. Wird die Richtlinie auf "true" gesetzt, werden die Informationen zum Betriebssystem-Update gemeldet.</translation> <translation id="4857223512478723171">Vollbildmodus nicht zulassen</translation> <translation id="4858735034935305895">Vollbildmodus zulassen</translation> +<translation id="4860900625632464759">Nutzern erlauben, SMS zwischen Smartphone und Chromebook zu synchronisieren</translation> <translation id="486146220825734683">Nicht zulassen, dass Nutzer Kerberos-Passwörter speichern</translation> <translation id="4861767323695239729">In einer Nutzersitzung zulässige Eingabemethoden konfigurieren</translation> <translation id="4873380469296842901">Durch Aktivieren dieser Einstellung können Nutzer, die der Verwendung von Phone Hub zugestimmt haben, Benachrichtigungen ihres Smartphones unter Chrome OS senden und erhalten. @@ -3869,6 +3890,7 @@ <translation id="4927214690104703256">Wenn die Richtlinie konfiguriert ist, wird festgelegt, welche Erweiterungen die <ph name="ENTERPRISE_PLATFORM_KEYS_API" />-Funktionen für die Remote-Attestierung nutzen können. Damit eine Erweiterung die API verwenden darf, muss sie in dieser Liste enthalten sein. Wenn eine Erweiterung nicht in der Liste enthalten ist oder keine Liste festgelegt wurde, schlägt der API-Aufruf fehl und ein Fehlercode wird angezeigt.</translation> +<translation id="4927563541997547">Die Bildschirmtastatur passt die Größe des Layout-Darstellungsbereichs standardmäßig an</translation> <translation id="4927797103413916381">Wenn die Richtlinie "<ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" />" nicht deaktiviert ist und "<ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" />" aktiviert oder nicht konfiguriert wird, werden Websites mit irreführenden Inhalten daran gehindert, neue Fenster oder Tabs zu öffnen. Ist "<ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" />" oder "<ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" />" deaktiviert, können Websites mit irreführenden Inhalten neue Fenster oder Tabs öffnen.</translation> @@ -4024,6 +4046,7 @@ <translation id="5105313908130842249">Verzögerung für die Bildschirmsperre im Akkubetrieb</translation> <translation id="5108031557082757679">Deaktivierte, an Geräte gebundene Unternehmensdrucker</translation> <translation id="5109383437323376357">Die Verfügbarkeit von Variationen bestimmen</translation> +<translation id="5118635822783657217">Updates für nicht kritische Komponenten deaktivieren</translation> <translation id="5120168808610189805">Import der Startseite bei der ersten Ausführung aktivieren</translation> <translation id="5124368997194894978">Starten bei anliegender Netzspannung aktivieren</translation> <translation id="5130213897914754028">Websites die Nutzung von „SharedArrayBuffers“ nicht erlauben</translation> @@ -4816,6 +4839,7 @@ Wenn die Richtlinie deaktiviert ist, ist die Nutzung des QUIC-Protokolls nicht möglich.</translation> <translation id="5916855682471300200">Cloud-Richtlinien auf Maschinenebene haben Vorrang vor Plattformrichtlinien auf Maschinenebene</translation> +<translation id="5917425424971710623">Ereignisse vom Typ „Extended Detection and Response“ (XDR) nicht melden</translation> <translation id="5921713479449475707">Downloads automatischer Updates über HTTP zulassen</translation> <translation id="5927903236543424081">Erzwingen, dass Nutzer sich anmelden müssen, um den Browser zu verwenden</translation> <translation id="5928633129285224981">Legt fest, ob die Option „Als Bild drucken“ beim Drucken von PDFs in <ph name="PRODUCT_NAME" /> die Standardeinstellung sein soll. @@ -4867,6 +4891,7 @@ <translation id="5997543603646547632">Standardmäßig 24-Stunden-Uhr verwenden</translation> <translation id="5997846976342452720">Angeben, ob Plug-in-Suchfunktion deaktiviert werden soll (eingestellt)</translation> <translation id="5998198091336830580">Diese Richtlinie ist Teil der folgenden atomischen Gruppe (nur Richtlinien aus der Quelle mit der höchsten Priorität in der Gruppe werden angewendet):</translation> +<translation id="600402562436559989">Zulassen, dass WLAN-Konfigurationen zwischen <ph name="PRODUCT_OS_NAME" />-Geräten und einem verbundenen Android-Smartphone synchronisiert werden</translation> <translation id="6004575267180297869"> Legt fest, ob WebAssembly-Module ursprungsübergreifend an ein anderes Fenster oder einen anderen Worker gesendet werden können. Das ursprungsübergreifende Teilen von WebAssembly-Modulen wird im Zuge der Einstellung von „document.domain“ ebenfalls eingestellt. Weitere Informationen findest du unter https://github.com/mikewest/deprecating-document-domain. Diese Richtlinie ermöglicht es, das ursprungsübergreifende Teilen von WebAssembly-Modulen wieder zu aktivieren, um den Übergangszeitraum zu verlängern. @@ -5021,6 +5046,7 @@ Beachte bitte, dass diese Richtlinie den Schutz lokaler IPs schwächt, sofern Administratoren diese benötigen.</translation> <translation id="614662973812186053">Diese Richtlinie steuert zudem die Erfassung von Nutzungsdaten & Fehlerberichte in Android.</translation> <translation id="614665605501218241">In der Liste aufgeführten Websites erlauben, unsichere Anfragen an eher private Netzwerk-Endpunkte zu senden.</translation> +<translation id="614753473456574270">Nutzer dürfen keine schwache PIN festlegen</translation> <translation id="6150320133676152520">Automatische PIN-Eingabe auf dem Sperr- und Anmeldebildschirm deaktivieren</translation> <translation id="6155350825868160236">Zulassen, dass Nutzer festlegen, ob Rechtschreibfehler mithilfe von Google-Webdiensten korrigiert werden</translation> <translation id="6155936611791017817">Standardstatus für den großen Cursor auf der Anmeldeseite festlegen</translation> @@ -5594,6 +5620,7 @@ <translation id="6672630473862787247">Aktiviert die passive Authentifizierung für reguläre, Inkognito- und Gastsitzungen.</translation> <translation id="6677291257287862684">„Einfingerbedienung“ auf dem Anmeldebildschirm aktivieren</translation> <translation id="6685903773201985073">Aktiviert die passive Authentifizierung für Gast- und reguläre Sitzungen.</translation> +<translation id="6687291630099400188">Keine Systeminformationen auf dem Anmeldebildschirm anzeigen</translation> <translation id="6689343802305995925">Keine Aktion passiert.</translation> <translation id="6689792153960219308">Hardwarestatus senden</translation> <translation id="6690425645391461516">DNS-Abfangprüfungen deaktivieren; „Meintest du: http://intranetsite/“-Infoleisten erlauben.</translation> @@ -7117,6 +7144,7 @@ <translation id="8266778278542911985">Wenn die Richtlinie auf "3" gesetzt ist, dürfen Websites um Zugriff auf serielle Ports bitten. Ist die Richtlinie auf "2" gesetzt, wird der Zugriff auf serielle Ports blockiert. Wenn sie nicht konfiguriert ist, können Websites den Zugriff erfragen, aber Nutzer können diese Einstellung ändern.</translation> +<translation id="8267520984570984190">Das Standardverhalten der Bildschirmtastatur wird nicht geändert</translation> <translation id="8267887696930711948">Eingestellt in M69. Verwende stattdessen OverrideSecurityRestrictionsOnInsecureOrigin. @@ -8034,6 +8062,7 @@ Wenn die Richtlinie auf "false" gesetzt oder nicht konfiguriert ist, werden keine Informationen ausgegeben. Ist sie auf "true" gesetzt, werden Systeminformationen zum Gerät ausgegeben.</translation> +<translation id="9131419675479917141">Nutzer dürfen schwache PIN festlegen, aber Warnung anzeigen</translation> <translation id="913195841488580904">Zugriff auf aufgelistete URLs blockieren</translation> <translation id="9135033364005346124"><ph name="CLOUD_PRINT_NAME" />-Proxy aktivieren</translation> <translation id="9136212796239682721">Benutzeroberfläche für Download-Infofeld deaktivieren</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 1707ad7..602393f 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -227,6 +227,7 @@ El valor predeterminado es RollbackDisabled.</translation> <translation id="1221359380862872747">Cargar URL especificadas en el inicio de sesión de demostración</translation> +<translation id="1221955019309484560">Habilitar actualizaciones de todos los componentes</translation> <translation id="1223789468190631420">Estado habilitado de Navegación segura con fuentes de confianza</translation> <translation id="123018742985150697">Requerir que el usuario local y el propietario del host de acceso remoto coincidan</translation> <translation id="123081309365616809">Habilita el envío de contenido al dispositivo</translation> @@ -493,6 +494,7 @@ Si se establece esta política, su valor se aplicará como la configuración sugerida y se mostrará en la sección Configuración avanzada del cuadro de diálogo de autenticación. Si no se establece esta política, se aplicará la configuración recomendada de <ph name="PRODUCT_OS_NAME" />. Ten en cuenta que también se mostrará en la sección Configuración avanzada del cuadro de diálogo de autenticación.</translation> +<translation id="1487722536912664411">Permitir que los usuarios usen <ph name="PRODUCT_NAME" /></translation> <translation id="1487916040416013623">Si se define esta política, especificará qué servidores deberían tener permiso para la autenticación integrada. La autenticación integrada solo se activará cuando <ph name="PRODUCT_NAME" /> reciba una solicitud de autenticación de un proxy o un servidor que esté incluido en la lista de permitidos. Si no se define esta política, <ph name="PRODUCT_NAME" /> intentará detectar si un servidor está en la intranet y solo en ese caso responderá a las solicitudes de IWA. Si se detecta que un servidor está en Internet, <ph name="PRODUCT_NAME" /> ignorará las solicitudes de IWA que procedan de dicho servidor. @@ -634,6 +636,7 @@ <translation id="1617235075406854669">Habilitar eliminación de historial de navegación y de descargas</translation> <translation id="1620510694547887537">Cámara</translation> <translation id="162162247775156979">Inhabilitar los informes sobre el estado del almacenamiento del dispositivo</translation> +<translation id="1625700732886306811">Permitir que <ph name="PRODUCT_NAME" /> se conecte a dispositivos a través de cualquier dirección IP</translation> <translation id="1626379196197114720">Permitir usar la caché de páginas completas</translation> <translation id="1628974048137236820">La página Nueva pestaña no mostrará tarjetas</translation> <translation id="1630263002012156148">Si se habilita esta política, se establecerá la página Nueva pestaña como la página principal del usuario, independientemente de la ubicación de la URL de la página principal. Si se inhabilita esta política, la página principal del usuario nunca será la página Nueva pestaña, a menos que se defina chrome://newtab como la URL de su página principal. @@ -669,6 +672,7 @@ <translation id="1654087023995670109">Forzar el modo Invitado en el navegador</translation> <translation id="1655229863189977773">Establecer tamaño de caché de disco en bytes</translation> <translation id="165769015320654523">Concede permiso automáticamente a estos sitios para que se conecten a dispositivos HID con los IDs de proveedor y producto facilitados.</translation> +<translation id="1659406551862245683">El comportamiento predeterminado de cambio de tamaño del teclado virtual se modifica para cambiar el tamaño del viewport de diseño</translation> <translation id="166427968280387991">Servidor proxy</translation> <translation id="1669584285557771729">Si se asigna un valor a esta política, permite controlar el tipo de lupa que se habilita. @@ -1125,6 +1129,7 @@ <translation id="2107601598727098402"> Esta política está obsoleta en M72. Sustitúyela por la política CloudManagementEnrollmentToken. </translation> +<translation id="2112656109118682849">Permitir que los usuarios muestren u oculten la información del sistema en la pantalla de inicio de sesión</translation> <translation id="2113068765175018713">Limitar tiempo de funcionamiento de dispositivo mediante reinicio automático</translation> <translation id="2116169546538119304"> Esta política está obsoleta. Configura las políticas de Kerberos para reutilizar la contraseña de inicio de sesión.</translation> <translation id="2117990069872855599">La URL desde la que se puede descargar la imagen del avatar.</translation> @@ -1454,6 +1459,7 @@ Para obtener información detallada sobre los patrones de URL válidos, visita el sitio https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Sin embargo, a partir de la versión M85 no se admiten en esta política los patrones con los comodines "*" y "[*.]" en el host.</translation> <translation id="2423255396068675416">Si se habilita la política o no se establece, los usuarios podrán ejecutar <ph name="PRODUCT_CROSTINI_NAME" />, siempre y cuando las políticas <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> y <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> estén habilitadas. Si se inhabilita la política, se desactivará <ph name="PRODUCT_CROSTINI_NAME" /> para el usuario. En caso de inhabilitar la política, esto se aplicará a los nuevos contenedores de <ph name="PRODUCT_CROSTINI_NAME" /> que se empiecen a usar, pero no a los que ya estén ejecutándose.</translation> +<translation id="242521047682347997">No permitir que los usuarios sincronicen mensajes SMS entre su teléfono y el Chromebook</translation> <translation id="2426782419955104525">Habilita la función Instant de <ph name="PRODUCT_NAME" /> y evita que los usuarios modifiquen esta opción. Si habilitas esta opción, se habilitará <ph name="PRODUCT_NAME" /> Instant. @@ -1992,6 +1998,13 @@ Si se inhabilita, se desactivarán las actualizaciones de los componentes. Sin embargo, algunos componentes quedan exentos de esta política: las actualizaciones de los componentes que no contengan código ejecutable o que sean esenciales para proteger la seguridad del navegador no se inhabilitarán. Entre los ejemplos de estos componentes se incluyen las listas de revocación de certificados y los filtros de subrecursos.</translation> +<translation id="2932796739547676677">Si se asigna el valor True a esta política, el teclado virtual cambiará el tamaño del viewport de diseño de forma predeterminada. + Si se le asigna el valor False o no se le asigna ninguno, esta política no tendrá ningún efecto. + + Ten en cuenta que esto solo afecta al comportamiento de cambio de tamaño predeterminado: si una página solicita un comportamiento específico mediante una etiqueta <meta> o la API Virtual Keyboard, seguirá aplicándose ese comportamiento solicitado. + + Además, ten en cuenta que esta política es una solución de emergencia pensada para estar disponible durante poco tiempo. + </translation> <translation id="2939335382784544151">Habilitar la importación del historial de navegación en la primera ejecución</translation> <translation id="2940127076681735544">Si se define esta política como una URL válida, <ph name="PRODUCT_NAME" /> descargará la lista de sitios web de esa URL y aplicará las reglas como si se hubieran configurado con la política <ph name="SITELIST_POLICY_NAME" />. @@ -2227,6 +2240,7 @@ <translation id="3142410959002029864">Si se establece esta política, se anula el modo predeterminado de impresión por las dos caras. Si el modo no está disponible, se ignorará esta política.</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="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="3152425128389603870">Habilitar el escritorio unificado y activarlo de forma predeterminada</translation> <translation id="3157857846231611820">Lista con los ajustes de los servicios de Chrome Enterprise Connectors que van a aplicarse al conector <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> de Enterprise, que se activa cuando se adjunta un archivo a Chrome. @@ -2458,6 +2472,7 @@ Es posible anular la aplicación de esta política en patrones de URL concretos usando las políticas "InsecureContentAllowedForUrls" e "InsecureContentBlockedForUrls". Si no se establece esta política, los usuarios podrán añadir excepciones para permitir contenido mixto bloqueable y para inhabilitar actualizaciones automáticas de contenido mixto bloqueable opcionalmente.</translation> +<translation id="3307744348419745296">No permitir que las configuraciones de la red Wi‑Fi se sincronicen en los dispositivos <ph name="PRODUCT_OS_NAME" /> y en un teléfono Android conectado</translation> <translation id="3308724602356134956">Si se le asigna un valor a esta política, <ph name="PRODUCT_OS_NAME" /> descargará y usará la imagen de fondo de pantalla que elijas para el escritorio y la página de inicio de sesión del usuario, y este no podrá cambiarla. Especifica la URL (accesible sin autenticación) desde donde <ph name="PRODUCT_OS_NAME" /> @@ -2528,6 +2543,7 @@ <translation id="3398051852031115795">Comportamiento predeterminado del sistema (depende del tamaño de la pantalla)</translation> <translation id="3399859571630358395">Forzar que se inhabilite Emparejamiento rápido (función que permite emparejar rápidamente mediante Bluetooth).</translation> <translation id="3404681701763345449">Habilita la integración con <ph name="GOOGLE_CALENDAR_NAME" />.</translation> +<translation id="3405997282295704902">No permitir que los usuarios usen <ph name="PRODUCT_NAME" /></translation> <translation id="3406122462682235653">No preguntar al usuario (las descargas se inician inmediatamente)</translation> <translation id="3408078762098350617">Controla la experiencia de usuario de las funciones inhabilitadas que aparecen en <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />. @@ -2647,6 +2663,7 @@ <translation id="3526752951628474302">Solo impresión en monocromo</translation> <translation id="3528000905991875314">Habilitar páginas de error alternativas</translation> <translation id="3531084733660068324">Ajustes de supervisión parental</translation> +<translation id="353611922042274900">Mostrar siempre información del sistema en la pantalla de inicio de sesión</translation> <translation id="3536263244905016305">Inhabilitar la optimización de detección automática de proxy web (WPAD)</translation> <translation id="3538869107794555625">Habilitar el teclado en pantalla en el modo Tablet</translation> <translation id="3539103206548425861">Si se establece esta política, los vídeos podrán reproducirse automáticamente (sin el consentimiento del usuario) con contenido de audio en <ph name="PRODUCT_NAME" />. Si se asigna el valor "True" a <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" />, esta política no tendrá efecto. Si se asigna el valor "False" a <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" />, todos los patrones de URL establecidos en esta política podrán reproducir contenido. Si se realizan cambios en esta política mientras <ph name="PRODUCT_NAME" /> está abierto, solo se aplicarán al abrir pestañas nuevas. @@ -2993,6 +3010,7 @@ Si esta política no se configura, el protocolo SPDY estará disponible.</translation> <translation id="3887529334667818189">Los recorridos serán visibles en chrome://history/journeys de forma predeterminada y los usuarios podrán cambiar la visibilidad de los recorridos.</translation> +<translation id="388999630001435491">Permitir que <ph name="PRODUCT_NAME" /> solo se conecte a dispositivos a través de direcciones IP privadas</translation> <translation id="3891175633496805812">Inhabilitar el controlador de diagnóstico y telemetría wilco</translation> <translation id="3891357445869647828">Habilitar JavaScript</translation> <translation id="3891769546914233112">Imprimir PDF como imagen disponible</translation> @@ -3033,6 +3051,7 @@ Esta función está inhabilitada si está vacía o no se le asigna ningún valor. Nota: Esta política debe usarse junto a <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />.</translation> +<translation id="3918339829588313389">Permitir que los usuarios definan un PIN poco seguro</translation> <translation id="3924506460382372403">Inhabilitar los informes sobre el estado de los gráficos del dispositivo</translation> <translation id="3925377537407648234">Definir la resolución de pantalla y el factor de escala</translation> <translation id="3927137827189017535">Habilitar la función de accesibilidad de teclas persistentes en la pantalla de inicio de sesión. @@ -3373,6 +3392,7 @@ <translation id="4274691295133617461">Si se asigna el valor "3" a esta política, los sitios web podrán solicitar acceso de lectura a los archivos y directorios del sistema de archivos del sistema operativo del host a través de la API File System. Si se le asigna el valor "2", se denegará el acceso. Si no se le asigna ningún valor, los sitios web podrán solicitar acceso, pero los usuarios podrán cambiar esta opción.</translation> +<translation id="4282243913059705499">Mostrar siempre el icono de <ph name="PRODUCT_NAME" /> en la barra de herramientas</translation> <translation id="4285674129118156176">Permitir que los usuarios no afiliados utilicen ARC</translation> <translation id="428948795004445932">Intervalo en el que se muestrean y recogen los datos de red. El valor mínimo permitido es 1 minuto. @@ -3838,6 +3858,7 @@ Si se asigna el valor False a esta política o no se le asigna ninguno, no se enviará información de las actualizaciones del sistema operativo. Si se le asigna el valor True, se enviará información de las actualizaciones del sistema operativo.</translation> <translation id="4857223512478723171">No permitir el modo de pantalla completa</translation> <translation id="4858735034935305895">Permitir modo de pantalla completa</translation> +<translation id="4860900625632464759">Permitir que los usuarios sincronicen mensajes SMS entre su teléfono y el Chromebook</translation> <translation id="486146220825734683">No permitir que los usuarios activen la opción de recordar contraseñas de Kerberos</translation> <translation id="4861767323695239729">Configurar los métodos de introducción admitidos en una sesión de usuario</translation> <translation id="4873380469296842901">Si se habilita esta opción, los usuarios que ya usen la función Mi teléfono podrán enviar o recibir las notificaciones de su teléfono en ChromeOS. @@ -3907,6 +3928,7 @@ <translation id="4927214690104703256">Si se establece esta política, se especificarán las extensiones que pueden usar las funciones de la <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> para la atestación remota. Para usar la API, las extensiones deben estar incluidas en esta lista. Si una extensión no está en la lista o no se ha configurado la lista, la llamada a la API devolverá un código de error.</translation> +<translation id="4927563541997547">El teclado virtual cambia el tamaño del viewport de diseño de forma predeterminada</translation> <translation id="4927797103413916381">Si no se inhabilita <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" />, habilitar <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> o dejarla sin definir evita que sitios web con experiencias engañosas abran ventanas o pestañas nuevas. Si se inhabilitan <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> o <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" />, se permitirá que los sitios web con experiencias engañosas abran nuevas ventanas o pestañas.</translation> @@ -4064,6 +4086,7 @@ <translation id="5105313908130842249">Retraso de bloqueo de pantalla cuando el dispositivo funciona con la batería</translation> <translation id="5108031557082757679">Impresoras de dispositivos de empresa inhabilitadas</translation> <translation id="5109383437323376357">Determinar la disponibilidad de variaciones</translation> +<translation id="5118635822783657217">Inhabilitar las actualizaciones de componentes no esenciales</translation> <translation id="5120168808610189805">Habilitar la importación de la página principal en la primera ejecución</translation> <translation id="5124368997194894978">Habilitar el inicio con CA (corriente alterna)</translation> <translation id="5130213897914754028">Impedir que los sitios usen SharedArrayBuffers</translation> @@ -4921,6 +4944,7 @@ <translation id="5997543603646547632">Utilizar reloj de formato de 24 horas de forma predeterminada</translation> <translation id="5997846976342452720">Especificar si se debe inhabilitar el buscador de complementos (obsoleta)</translation> <translation id="5998198091336830580">Esta política forma parte del siguiente grupo atómico (solo se aplicarán las políticas de la fuente que tenga mayor prioridad del grupo):</translation> +<translation id="600402562436559989">Permitir que las configuraciones de la red Wi‑Fi se sincronicen en los dispositivos <ph name="PRODUCT_OS_NAME" /> y en un teléfono Android conectado</translation> <translation id="6004575267180297869"> Especifica si los módulos de WebAssembly se pueden enviar a otra ventana o trabajador de varios orígenes. La opción de compartir módulos de WebAssembly de varios orígenes dejará de estar disponible como parte de las medidas que se van a tomar para desactivar document.domain. Consulta https://github.com/mikewest/deprecating-document-domain. Esta política permite volver a habilitar la opción de compartir módulos de WebAssembly de varios orígenes para prolongar el periodo de transición del proceso de desactivación. @@ -5075,6 +5099,7 @@ Ten en cuenta que esta política debilita la protección de las IP locales si así lo necesitan los administradores.</translation> <translation id="614662973812186053">Esta política también controla la recopilación de los datos de uso y diagnóstico de Android.</translation> <translation id="614665605501218241">Permite que los sitios de la lista envíen solicitudes a puntos finales de red más privados de una manera no segura.</translation> +<translation id="614753473456574270">No permitir que los usuarios definan un PIN poco seguro</translation> <translation id="6150320133676152520">Inhabilitar el envío automático de PIN en la pantalla de bloqueo y de inicio de sesión</translation> <translation id="6155350825868160236">Permitir que el usuario elija si se utilizan servicios web de Google para corregir errores ortográficos</translation> <translation id="6155936611791017817">Establecer el estado predeterminado del cursor grande en la pantalla de inicio de sesión</translation> @@ -5663,6 +5688,7 @@ <translation id="6672630473862787247">Habilita la autenticación pasiva en sesiones normales, de incógnito y de invitado.</translation> <translation id="6677291257287862684">Habilitar las teclas persistentes en la pantalla de inicio de sesión</translation> <translation id="6685903773201985073">Habilita la autenticación pasiva en sesiones normales y de invitado.</translation> +<translation id="6687291630099400188">No mostrar información del sistema en la pantalla de inicio de sesión</translation> <translation id="6689343802305995925">No se realiza ninguna acción.</translation> <translation id="6689792153960219308">Informar sobre el estado del hardware</translation> <translation id="6690425645391461516">Inhabilitar las comprobaciones de interceptación de DNS y permitir las barras de información aclaratorias "http://intranetsite/".</translation> @@ -7199,6 +7225,7 @@ <translation id="8266778278542911985">Si se asigna el valor 3 a esta política, los sitios web podrán solicitar acceso a los puertos serie. Si se le asigna el valor 2, se denegará el acceso a los puertos serie. Si no se le asigna ningún valor, los sitios web podrán solicitar acceso, pero los usuarios podrán cambiar esta opción.</translation> +<translation id="8267520984570984190">No se modifica el comportamiento predeterminado de cambio de tamaño del teclado virtual</translation> <translation id="8267887696930711948">Obsoleta en M69. Utiliza en su lugar OverrideSecurityRestrictionsOnInsecureOrigin. @@ -8107,6 +8134,7 @@ Si se asigna el valor "Falso" a esta política o no se establece, no se enviará ninguna información. Si se le asigna el valor "Verdadero", se enviará información sobre el sistema del dispositivo.</translation> +<translation id="9131419675479917141">Permitir que los usuarios definan un PIN poco seguro, pero mostrarles una advertencia</translation> <translation id="913195841488580904">Bloquear el acceso a una lista de URLs</translation> <translation id="9135033364005346124">Habilitar el proxy de <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Inhabilitar la interfaz del cuadro de descargas</translation>
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 599bd2f..d0e01e56 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -227,6 +227,7 @@ Default adalah RollbackDisabled.</translation> <translation id="1221359380862872747">Muat url yang ditentukan di proses masuk demo</translation> +<translation id="1221955019309484560">Aktifkan update untuk semua komponen</translation> <translation id="1223789468190631420">Safe Browsing mengaktifkan status untuk sumber tepercaya</translation> <translation id="123018742985150697">Wajibkan kecocokan antara pengguna lokal dan pemilik host akses jarak jauh</translation> <translation id="123081309365616809">Mengaktifkan casting konten ke perangkat</translation> @@ -492,6 +493,7 @@ Jika kebijakan ini disetel, nilainya akan diterapkan sebagai konfigurasi yang disarankan dan akan ditampilkan di bagian "Lanjutan" pada dialog autentikasi. Jika kebijakan ini tidak disetel, konfigurasi <ph name="PRODUCT_OS_NAME" /> yang direkomendasikan akan diterapkan. Perlu diketahui bahwa nilai tersebut juga ditampilkan di bagian "Lanjutan" pada dialog autentikasi.</translation> +<translation id="1487722536912664411">Izinkan pengguna menggunakan <ph name="PRODUCT_NAME" /></translation> <translation id="1487916040416013623">Menyetel kebijakan akan menentukan server mana yang diizinkan untuk autentikasi terintegrasi. Autentikasi terintegrasi hanya aktif jika <ph name="PRODUCT_NAME" /> mendapat pernyataan autentikasi dari proxy atau dari server yang ada di daftar yang diizinkan. Jika kebijakan tidak disetel, <ph name="PRODUCT_NAME" /> akan mencoba mendeteksi apakah server ada di intranet. Setelah itu, barulah permintaan IWA akan direspons. Jika server dideteksi sebagai intranet, <ph name="PRODUCT_NAME" /> akan mengabaikan permintaan IWA darinya. @@ -633,6 +635,7 @@ <translation id="1617235075406854669">Aktifkan penghapusan histori download atau browser</translation> <translation id="1620510694547887537">Kamera</translation> <translation id="162162247775156979">Nonaktifkan pelaporan status penyimpanan perangkat</translation> +<translation id="1625700732886306811">Izinkan <ph name="PRODUCT_NAME" /> terhubung ke perangkat di semua alamat IP</translation> <translation id="1626379196197114720">Izinkan penggunaan back-forward cache</translation> <translation id="1628974048137236820">Halaman Tab Baru tidak akan menampilkan kartu</translation> <translation id="1630263002012156148">Jika kebijakan disetel ke Aktif, halaman beranda pengguna akan menjadi halaman Tab Baru dan lokasi URL halaman beranda lain akan diabaikan. Jika kebijakan disetel ke Nonaktif, halaman beranda pengguna tidak akan pernah menjadi halaman Tab Baru, kecuali jika URL halaman beranda pengguna disetel ke chrome://newtab. @@ -669,6 +672,7 @@ <translation id="1654087023995670109">Terapkan mode tamu browser</translation> <translation id="1655229863189977773">Setel ukuran cache disk dalam bita</translation> <translation id="165769015320654523">Otomatis memberikan izin ke situs ini untuk terhubung ke perangkat HID dengan ID produk dan vendor tertentu.</translation> +<translation id="1659406551862245683">Perilaku pengubahan ukuran keyboard virtual default diubah untuk mengubah ukuran area pandang tata letak</translation> <translation id="166427968280387991">Server proxy</translation> <translation id="1669584285557771729">Jika ditetapkan, kebijakan ini akan mengontrol jenis kaca pembesar layar yang diaktifkan. @@ -1125,6 +1129,7 @@ <translation id="2107601598727098402"> Kebijakan ini tidak digunakan lagi di M72. Gunakan CloudManagementEnrollmentToken sebagai gantinya. </translation> +<translation id="2112656109118682849">Izinkan pengguna mengubah tampilan informasi sistem di layar login</translation> <translation id="2113068765175018713">Membatasi waktu operasi perangkat dengan melakukan booting ulang secara otomatis</translation> <translation id="2116169546538119304"> Kebijakan ini tidak digunakan lagi. Sebagai gantinya, konfigurasikan kebijakan Kerberos untuk menggunakan sandi login kembali.</translation> <translation id="2117990069872855599">URL tempat gambar avatar dapat didownload.</translation> @@ -1453,6 +1458,7 @@ Untuk informasi mendetail tentang pola URL yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Namun, mulai M85, pola dengan karakter pengganti '*' dan '[*.]' di host tidak lagi didukung untuk kebijakan ini.</translation> <translation id="2423255396068675416">Jika kebijakan disetel ke Aktif atau tidak disetel, pengguna dapat menjalankan <ph name="PRODUCT_CROSTINI_NAME" />, selama <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> dan <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> disetel ke Aktif. Jika kebijakan disetel ke Nonaktif, <ph name="PRODUCT_CROSTINI_NAME" /> akan dinonaktifkan bagi pengguna. Jika setelan diubah ke Nonaktif, kebijakan mulai diterapkan ke penampung <ph name="PRODUCT_CROSTINI_NAME" /> baru yang akan dijalankan, bukan yang sudah berjalan.</translation> +<translation id="242521047682347997">Jangan izinkan pengguna menyinkronkan pesan SMS antara ponsel dan Chromebook mereka</translation> <translation id="2426782419955104525">Mengaktifkan fitur Instan <ph name="PRODUCT_NAME" /> dan mencegah pengguna mengubah setelan ini. Jika Anda mengaktifkan setelan ini, <ph name="PRODUCT_NAME" /> Instan akan diaktifkan. @@ -1991,6 +1997,13 @@ Jika disetel ke nonaktif, update komponen akan dinonaktifkan. Namun, beberapa komponen akan dikecualikan dari kebijakan ini: update komponen apa pun yang tidak berisi kode yang dapat dieksekusi dan yang penting bagi keamanan browser, tidak akan dinonaktifkan. Contoh komponen tersebut meliputi daftar pencabutan sertifikat dan filter subresource.</translation> +<translation id="2932796739547676677">Jika kebijakan disetel ke Benar (True), keyboard virtual akan mengubah ukuran area pandang tata letak secara default. + Status lainnya (disetel ke Salah (False)/tidak disetel) tidak akan berpengaruh. + + Perhatikan bahwa kebijakan ini hanya memengaruhi perilaku pengubahan ukuran default: jika halaman meminta perilaku tertentu menggunakan tag <meta> atau Virtual Keyboard API, maka perilaku yang diminta tersebut akan tetap berlaku. + + Perhatikan juga bahwa ini adalah kebijakan "jalan keluar" yang dimaksudkan sebagai solusi sementara. + </translation> <translation id="2939335382784544151">Aktifkan impor histori penjelajahan saat browser pertama kali dijalankan</translation> <translation id="2940127076681735544">Jika kebijakan disetel ke URL yang valid, <ph name="PRODUCT_NAME" /> akan mendownload daftar situs dari URL tersebut dan menerapkan aturan seolah-olah aturan tersebut disiapkan dengan kebijakan <ph name="SITELIST_POLICY_NAME" />. @@ -2225,6 +2238,7 @@ <translation id="3142410959002029864">Jika kebijakan disetel, mode dupleks persentase cetakan default akan ditimpa. Jika mode ini tidak tersedia, kebijakan ini akan diabaikan.</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="3150351525324499342">Jangan tampilkan ikon <ph name="PRODUCT_NAME" /> di toolbar secara default, tetapi izinkan pengguna memilih</translation> <translation id="3152425128389603870">Membuat Desktop Terpadu tersedia dan aktif secara default</translation> <translation id="3157857846231611820">Daftar setelan layanan Chrome Enterprise Connectors yang akan diterapkan ke <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise Connector, yang aktif saat file dilampirkan ke Chrome. @@ -2456,6 +2470,7 @@ Kebijakan ini dapat diganti dengan pola URL tertentu menggunakan kebijakan 'InsecureContentAllowedForUrls' dan 'InsecureContentBlockedForUrls'. Jika kebijakan ini tidak ditetapkan, pengguna akan diizinkan untuk menambahkan pengecualian guna mengizinkan konten campuran yang dapat diblokir dan menonaktifkan upgrade otomatis untuk konten campuran yang dapat diblokir secara opsional.</translation> +<translation id="3307744348419745296">Jangan izinkan konfigurasi jaringan Wi-Fi disinkronkan di seluruh perangkat <ph name="PRODUCT_OS_NAME" /> dan ponsel Android yang terhubung</translation> <translation id="3308724602356134956">Jika Anda menetapkan kebijakan, <ph name="PRODUCT_OS_NAME" /> akan mendownload dan menggunakan gambar wallpaper yang Anda tetapkan untuk latar belakang desktop dan layar login pengguna, dan pengguna tidak dapat mengubahnya. Tentukan URL (yang dapat diakses tanpa autentikasi) tempat <ph name="PRODUCT_OS_NAME" /> @@ -2526,6 +2541,7 @@ <translation id="3398051852031115795">Perilaku sistem default (bergantung pada ukuran layar)</translation> <translation id="3399859571630358395">Paksa penonaktifan Sambungan Cepat (penyambungan Bluetooth cepat).</translation> <translation id="3404681701763345449">Aktifkan Integrasi <ph name="GOOGLE_CALENDAR_NAME" />.</translation> +<translation id="3405997282295704902">Jangan izinkan pengguna menggunakan <ph name="PRODUCT_NAME" /></translation> <translation id="3406122462682235653">Jangan tanya pengguna (download langsung dimulai)</translation> <translation id="3408078762098350617">Mengontrol pengalaman pengguna fitur yang dinonaktifkan yang tercantum di <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />. @@ -2644,6 +2660,7 @@ <translation id="3526752951628474302">Khusus pencetakan monokrom</translation> <translation id="3528000905991875314">Mengaktifkan halaman kesalahan alternatif</translation> <translation id="3531084733660068324">Setelan pengawasan orang tua</translation> +<translation id="353611922042274900">Selalu tampilkan informasi sistem di layar login</translation> <translation id="3536263244905016305">Nonaktifkan pengoptimalan Web Proxy Auto-Discovery (WPAD)</translation> <translation id="3538869107794555625">Aktifkan keyboard virtual dalam mode tablet</translation> <translation id="3539103206548425861">Jika kebijakan disetel, video dapat diputar secara otomatis (tanpa persetujuan pengguna) dengan konten audio di <ph name="PRODUCT_NAME" />. Jika kebijakan <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> disetel ke Benar (True), kebijakan ini tidak akan berpengaruh. Jika kebijakan <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> disetel ke Salah (False), pola URL yang disetel di kebijakan ini tetap dapat diputar. Jika kebijakan ini berubah saat <ph name="PRODUCT_NAME" /> sedang berjalan, kebijakan hanya akan berlaku untuk tab yang baru dibuka. @@ -2990,6 +3007,7 @@ Jika kebijakan ini tidak disetel, SPDY akan tersedia.</translation> <translation id="3887529334667818189">Perjalanan akan dapat dilihat di chrome://history/journeys secara default dan pengguna dapat mengubah visibilitas Perjalanan.</translation> +<translation id="388999630001435491">Izinkan <ph name="PRODUCT_NAME" /> untuk hanya terhubung ke perangkat di alamat IP pribadi</translation> <translation id="3891175633496805812">Nonaktifkan diagnostik dan pengontrol telemetri wilco</translation> <translation id="3891357445869647828">Mengaktifkan JavaScript</translation> <translation id="3891769546914233112">Mencetak PDF sebagai Gambar Tersedia</translation> @@ -3030,6 +3048,7 @@ Jika kebijakan tidak disetel atau disetel ke kosong, fitur ini akan dinonaktifkan. Catatan: Kebijakan ini harus digunakan dengan <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />.</translation> +<translation id="3918339829588313389">Izinkan pengguna menyetel PIN lemah</translation> <translation id="3924506460382372403">Nonaktifkan pelaporan status grafis perangkat</translation> <translation id="3925377537407648234">Setel faktor skala dan resolusi tampilan</translation> <translation id="3927137827189017535">Mengaktifkan fitur aksesibilitas tombol lekat di layar login. @@ -3379,6 +3398,7 @@ <translation id="4274691295133617461">Jika kebijakan disetel ke 3, situs web akan diizinkan meminta akses baca ke file, dan direktori, di sistem file pada sistem operasi host melalui File System API. Jika kebijakan disetel ke 2, akses akan ditolak. Jika tidak disetel, situs dapat meminta akses tetapi pengguna dapat mengubah setelan ini.</translation> +<translation id="4282243913059705499">Selalu tampilkan ikon <ph name="PRODUCT_NAME" /> di toolbar</translation> <translation id="4285674129118156176">Mengizinkan pengguna yang tak terafiliasi menggunakan ARC</translation> <translation id="428948795004445932">Interval pada saat data jaringan diambil sampelnya dan dikumpulkan. Batas minimum yang diizinkan adalah 1 menit. @@ -3846,6 +3866,7 @@ dilaporkan. Jika ditetapkan ke true, informasi update OS akan dilaporkan.</translation> <translation id="4857223512478723171">Jangan izinkan mode layar penuh</translation> <translation id="4858735034935305895">Izinkan mode layar penuh</translation> +<translation id="4860900625632464759">Izinkan pengguna menyinkronkan pesan SMS antara ponsel dan Chromebook mereka</translation> <translation id="486146220825734683">Jangan izinkan pengguna mengingat sandi Kerberos</translation> <translation id="4861767323695239729">Mengonfigurasi metode masukan yang diizinkan dalam sesi pengguna</translation> <translation id="4873380469296842901">Jika setelan ini diaktifkan, pengguna yang telah memilih untuk menggunakan Phone Hub akan dapat mengirim/menerima notifikasi ponselnya di ChromeOS. @@ -3915,6 +3936,7 @@ <translation id="4927214690104703256">Menyetel kebijakan akan menentukan ekstensi yang diizinkan untuk menggunakan fungsi <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> untuk pengesahan jarak jauh. Ekstensi harus ada dalam daftar ini agar dapat menggunakan API. Jika ekstensi tidak ada dalam daftar, atau daftar tidak disetel, panggilan ke API akan gagal dan disertai kode error.</translation> +<translation id="4927563541997547">Keyboard virtual mengubah ukuran area pandang tata letak secara default</translation> <translation id="4927797103413916381">Jika <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> tidak Dinonaktifkan, menyetel <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> ke Aktif atau tidak menyetelnya akan mencegah situs dengan pengalaman yang menyesatkan pengguna terbuka di jendela atau tab baru. Jika <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> atau <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> disetel ke Nonaktif, situs dengan pengalaman yang menyesatkan pengguna akan terbuka di jendela dan tab baru.</translation> @@ -4073,6 +4095,7 @@ <translation id="5105313908130842249">Penundaan penguncian layar saat menggunakan daya baterai</translation> <translation id="5108031557082757679">Menonaktifkan printer yang merupakan perangkat perusahaan</translation> <translation id="5109383437323376357">Menentukan ketersediaan variasi</translation> +<translation id="5118635822783657217">Nonaktifkan update untuk komponen yang tidak penting</translation> <translation id="5120168808610189805">Aktifkan impor halaman beranda saat browser pertama kali dijalankan</translation> <translation id="5124368997194894978">Aktifkan booting pada tegangan AC (arus bolak-balik)</translation> <translation id="5130213897914754028">Cegah situs menggunakan SharedArrayBuffer</translation> @@ -4877,6 +4900,7 @@ Jika kebijakan disetel ke Nonaktif, penggunaan protokol QUIC tidak akan diizinkan.</translation> <translation id="5916855682471300200">Kebijakan perangkat cloud lebih diutamakan daripada kebijakan perangkat platform</translation> +<translation id="5917425424971710623">Jangan laporkan informasi tentang peristiwa deteksi dan respons yang diperluas (XDR)</translation> <translation id="5921713479449475707">Izinkan download pembaruan otomatis melalui HTTP</translation> <translation id="5927903236543424081">Paksa pengguna untuk login sebelum menggunakan browser</translation> <translation id="5928633129285224981">Mengontrol apakah <ph name="PRODUCT_NAME" /> menjadikan opsi Cetak sebagai gambar sebagai setelan default saat mencetak PDF. @@ -4928,6 +4952,7 @@ <translation id="5997543603646547632">Menggunakan 24 jam sebagai default</translation> <translation id="5997846976342452720">Menentukan apakah pencari plugin harus dinonaktifkan (tidak digunakan lagi)</translation> <translation id="5998198091336830580">Kebijakan ini merupakan bagian dari grup atom berikut (hanya kebijakan dari sumber tertinggi yang ada di grup yang akan diterapkan) :</translation> +<translation id="600402562436559989">Izinkan konfigurasi jaringan Wi-Fi disinkronkan di seluruh perangkat <ph name="PRODUCT_OS_NAME" /> dan ponsel Android yang terhubung</translation> <translation id="6004575267180297869"> Menentukan apakah modul WebAssembly dapat dikirim ke jendela atau pekerja lain lintas asal. Berbagi modul WebAssembly lintas asal tidak akan digunakan lagi sebagai bagian dari upaya penghentian penggunaan document.domain; lihat https://github.com/mikewest/deprecating-document-domain. Kebijakan ini memungkinkan pengaktifan kembali berbagi modul WebAssembly lintas asal untuk menawarkan periode transisi yang lebih lama dalam proses penghentian penggunaan. @@ -5082,6 +5107,7 @@ Perlu diingat bahwa kebijakan ini akan melemahkan perlindungan IP lokal jika dibutuhkan oleh administrator.</translation> <translation id="614662973812186053">Kebijakan ini juga mengontrol pengumpulan data diagnostik dan penggunaan Android.</translation> <translation id="614665605501218241">Mengizinkan situs yang terdaftar untuk membuat permintaan ke endpoint jaringan yang lebih pribadi dengan cara yang tidak aman.</translation> +<translation id="614753473456574270">Jangan izinkan pengguna menyetel PIN lemah</translation> <translation id="6150320133676152520">Nonaktifkan pengiriman otomatis PIN di layar kunci dan layar login</translation> <translation id="6155350825868160236">Izinkan pengguna memilih apakah akan menggunakan layanan web Google untuk mengatasi kesalahan ejaan</translation> <translation id="6155936611791017817">Setel status default kursor besar di layar masuk</translation> @@ -5670,6 +5696,7 @@ <translation id="6672630473862787247">Mengaktifkan autentikasi pasif di sesi reguler, samaran, dan tamu.</translation> <translation id="6677291257287862684">Aktifkan tombol lekat di layar login</translation> <translation id="6685903773201985073">Mengaktifkan autentikasi pasif di sesi tamu dan reguler.</translation> +<translation id="6687291630099400188">Jangan tampilkan informasi sistem di layar login</translation> <translation id="6689343802305995925">Tidak ada tindakan yang dilakukan.</translation> <translation id="6689792153960219308">Melaporkan status hardware</translation> <translation id="6690425645391461516">Nonaktifkan pemeriksaan intersepsi DNS; izinkan infobar "Mungkin maksud Anda http://intranetsite/".</translation> @@ -7197,6 +7224,7 @@ <translation id="8266778278542911985">Jika kebijakan disetel ke 3, situs akan dapat meminta akses ke port serial. Jika kebijakan disetel ke 2, akses ke port serial akan ditolak. Jika tidak disetel, situs akan dapat meminta akses tetapi pengguna dapat mengubah setelan ini.</translation> +<translation id="8267520984570984190">Perilaku pengubahan ukuran keyboard virtual default tidak diubah</translation> <translation id="8267887696930711948">Tidak digunakan lagi di M69. Sebagai gantinya, gunakan OverrideSecurityRestrictionsOnInsecureOrigin. @@ -8100,6 +8128,7 @@ Jika kebijakan disetel ke salah (false) atau tidak disetel, informasi tidak akan dilaporkan. Jika disetel ke benar (true), informasi sistem perangkat akan dilaporkan.</translation> +<translation id="9131419675479917141">Izinkan pengguna menyetel PIN lemah, tetapi tampilkan peringatan</translation> <translation id="913195841488580904">Blokir akses ke daftar URL</translation> <translation id="9135033364005346124">Mengaktifkan proxy <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Nonaktifkan UI balon download</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index abbf8be..3ce57950 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -4557,6 +4557,7 @@ このポリシーを無効に設定した場合、QUIC プロトコルの使用は許可されません。</translation> <translation id="5916855682471300200">クラウドのマシンポリシーをプラットフォームのマシンポリシーより優先する</translation> +<translation id="5917425424971710623">広範な検出と対応(XDR)イベントに関する情報を報告しない</translation> <translation id="5921713479449475707">HTTP 経由での自動更新ダウンロードを許可する</translation> <translation id="5927903236543424081">ブラウザを使用する前にユーザーにログインを強制する</translation> <translation id="5928633129285224981"><ph name="PRODUCT_NAME" /> で PDF の印刷時に「画像として印刷する」オプションがデフォルトで設定されるかどうかを管理します。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 1bd063f7..60aaa47e 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -227,6 +227,7 @@ 기본값은 RollbackDisabled입니다.</translation> <translation id="1221359380862872747">데모 로그인 시 지정된 URL 로드</translation> +<translation id="1221955019309484560">모든 구성요소의 업데이트 사용</translation> <translation id="1223789468190631420">신뢰할 수 있는 소스에서 세이프 브라우징을 사용할 수 있는 상태</translation> <translation id="123018742985150697">로컬 사용자와 원격 액세스 호스트 소유자가 일치해야 함</translation> <translation id="123081309365616809">기기에 콘텐츠 전송 허용</translation> @@ -493,6 +494,7 @@ 설정되면 정책의 값이 추천 구성으로 적용되고 인증 대화상자의 '고급' 섹션에 표시됩니다. 정책을 설정하지 않으면 추천된 <ph name="PRODUCT_OS_NAME" /> 구성이 대신 적용됩니다. 인증 대화상자의 '고급' 섹션에도 표시됩니다.</translation> +<translation id="1487722536912664411">사용자가 <ph name="PRODUCT_NAME" />을(를) 사용하도록 허용</translation> <translation id="1487916040416013623">정책을 설정하면 통합 인증에 허용되어야 하는 서버가 지정됩니다. 통합 인증은 <ph name="PRODUCT_NAME" />이 허용 목록에 있는 서버 또는 프록시에서 인증 요청을 받은 경우에만 사용 설정됩니다. 정책을 설정하지 않으면 <ph name="PRODUCT_NAME" />에서 서버가 인트라넷에 있는지 감지합니다. 그런 다음에만 IWA 요청에 응답합니다. 서버가 인터넷으로 감지되면 <ph name="PRODUCT_NAME" />에서 서버의 IWA 요청을 무시합니다. @@ -634,6 +636,7 @@ <translation id="1617235075406854669">브라우저 및 다운로드 기록을 삭제하도록 설정합니다.</translation> <translation id="1620510694547887537">카메라</translation> <translation id="162162247775156979">기기 저장용량 상태 보고 사용 중지</translation> +<translation id="1625700732886306811"><ph name="PRODUCT_NAME" />에서 모든 IP 주소의 기기에 연결하도록 허용</translation> <translation id="1626379196197114720">뒤로-앞으로 캐시 사용 허용</translation> <translation id="1628974048137236820">새 탭 페이지에 카드 표시 안함</translation> <translation id="1630263002012156148">정책을 사용으로 설정하면 새 탭 페이지가 사용자의 홈페이지로 설정되고 기존 홈페이지 URL 위치는 무시됩니다. 정책을 사용 안함으로 설정하면 사용자의 홈페이지 URL을 chrome://newtab으로 설정하지 않는 한 홈페이지가 새 탭 페이지로 지정되지 않습니다. @@ -670,6 +673,7 @@ <translation id="1654087023995670109">브라우저 게스트 모드 시행</translation> <translation id="1655229863189977773">디스크 캐시 크기 설정(바이트)</translation> <translation id="165769015320654523">다음 사이트가 주어진 공급업체 및 제품 ID를 사용해 HID 기기에 연결할 수 있는 권한을 자동으로 부여합니다.</translation> +<translation id="1659406551862245683">가상 키보드의 기본적인 크기 조절 동작이 레이아웃 표시 영역의 크기를 조절하도록 변경됨</translation> <translation id="166427968280387991">프록시 서버</translation> <translation id="1669584285557771729">이 정책이 설정되어 있으면 사용 설정된 화면 돋보기 유형을 제어합니다. @@ -1124,6 +1128,7 @@ <translation id="2107601598727098402"> 이 정책은 M72부터 지원이 중단되었습니다. 대신 CloudManagementEnrollmentToken을 사용하세요. </translation> +<translation id="2112656109118682849">사용자가 로그인 화면의 시스템 정보 표시를 전환하도록 허용</translation> <translation id="2113068765175018713">자동으로 재부팅하여 기기 가동 시간 제한</translation> <translation id="2116169546538119304"> 이 정책은 지원 중단되었으므로 로그인 비밀번호를 다시 사용하려면 Kerberos 정책을 구성해 주세요.</translation> <translation id="2117990069872855599">아바타 이미지를 다운로드할 수 있는 URL입니다.</translation> @@ -1452,6 +1457,7 @@ 유효한 URL 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns 페이지를 참고하세요. 그러나 M85부터 호스트에 '*' 및 '[*.]' 와일드 카드가 있는 패턴은 이 정책에서 지원되지 않습니다.</translation> <translation id="2423255396068675416">정책을 사용으로 설정하거나 설정하지 않으면 <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> 및 <ph name="CROSTINI_ALLOWED_POLICY_NAME" />가 사용으로 설정되어 있는 한 사용자가 <ph name="PRODUCT_CROSTINI_NAME" />를 실행할 수 있습니다. 사용 안함으로 설정하면 사용자의 <ph name="PRODUCT_CROSTINI_NAME" />가 사용 중지됩니다. 사용 안함으로 변경하면 기존에 실행 중이던 컨테이너가 아닌 새로 시작되는 <ph name="PRODUCT_CROSTINI_NAME" /> 컨테이너에 정책 적용이 시작됩니다.</translation> +<translation id="242521047682347997">사용자가 휴대전화와 Chromebook 간에 SMS 메시지를 동기화하도록 허용 안함</translation> <translation id="2426782419955104525"><ph name="PRODUCT_NAME" />의 순간 검색 기능을 사용하도록 설정하고 사용자가 이 설정을 변경하지 못하게 합니다. 이 기능을 사용하도록 설정하면 <ph name="PRODUCT_NAME" /> 순간 검색이 활성화됩니다. @@ -1987,6 +1993,13 @@ 사용 안함으로 설정하면 구성요소 업데이트가 사용 중지됩니다. 하지만 일부 구성요소는 이 정책에서 제외됩니다. 예를 들어 실행 코드가 포함되지 않은 구성요소와 브라우저 보안에 중요한 구성요소 업데이트는 사용 중지되지 않습니다. 이와 같은 구성요소의 예로는 해지 인증서 목록 및 하위 리소스 필터가 있습니다.</translation> +<translation id="2932796739547676677">정책을 True로 설정하면 가상 키보드가 기본적으로 레이아웃 표시 영역의 크기를 조절합니다. + 정책을 설정하지 않거나 False로 설정하면 아무런 영향을 미치지 않습니다. + + 이 정책은 기본 크기 조절 동작에만 영향을 미칩니다. 페이지에서 <meta> 태그 또는 Virtual Keyboard API를 사용하여 특정 동작을 요청하는 경우, 요청된 동작이 계속 적용됩니다. + + 이 정책은 단기적으로 사용되는 '이스케이프 해치' 정책이기도 합니다. + </translation> <translation id="2939335382784544151">처음 실행 시 방문 기록 가져오기 사용 설정</translation> <translation id="2940127076681735544">이 정책을 유효한 URL로 설정하면 <ph name="PRODUCT_NAME" />이 URL로부터 사이트 목록을 다운로드하며 <ph name="SITELIST_POLICY_NAME" /> 정책으로 규칙이 설정된 경우와 동일한 규칙을 적용합니다. @@ -2222,6 +2235,7 @@ <translation id="3142410959002029864">정책을 설정하면 기본 양면 인쇄 모드가 재정의됩니다. 이 모드를 사용할 수 없는 경우 정책은 무시됩니다.</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="3150351525324499342">기본적으로 툴바에 <ph name="PRODUCT_NAME" /> 아이콘이 표시되지 않지만 사용자가 선택하도록 허용</translation> <translation id="3152425128389603870">통합 바탕화면을 기본적으로 허용하고 사용 설정합니다.</translation> <translation id="3157857846231611820"><ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise 커넥터에 적용할 Chrome Enterprise 커넥터 서비스 설정의 목록으로, 파일이 Chrome에 첨부될 때 실행됩니다. @@ -2453,6 +2467,7 @@ 'InsecureContentAllowedForUrls' 정책 및 'InsecureContentBlockedForUrls' 정책을 사용하는 특정 URL 패턴의 경우, 이 정책을 재정의할 수 있습니다. 정책이 설정되어 있지 않으면 사용자는 차단 가능한 혼합 콘텐츠를 허용하는 예외를 추가하고 선택적으로 차단 가능한 혼합 콘텐츠의 자동 업그레이드를 사용 중지할 수 있습니다.</translation> +<translation id="3307744348419745296"><ph name="PRODUCT_OS_NAME" /> 기기 및 연결된 Android 휴대전화 전체에서 Wi-Fi 네트워크 구성의 동기화 허용 안함</translation> <translation id="3308724602356134956">정책을 설정하면 <ph name="PRODUCT_OS_NAME" />에서는 사용자 데스크톱 및 로그인 화면 배경으로 설정한 배경화면 이미지를 다운로드해서 사용하며 사용자가 변경할 수 없습니다. <ph name="PRODUCT_OS_NAME" />에서 배경화면 이미지를 다운로드할 수 있는 URL(인증 없이 액세스 가능)과 무결성을 확인할 암호화 해시(파일 크기가 최대 16MB인 JPEG 형식)를 지정합니다. 설정하지 않으면 사용자가 데스크톱 및 로그인 화면의 배경화면 이미지를 선택합니다.</translation> @@ -2519,6 +2534,7 @@ <translation id="3398051852031115795">기본 시스템 동작(화면 크기에 따라 다름)</translation> <translation id="3399859571630358395">빠른 페어링(빠른 블루투스 페어링)이 사용 중지되도록 강제 적용</translation> <translation id="3404681701763345449"><ph name="GOOGLE_CALENDAR_NAME" /> 통합을 사용 설정합니다.</translation> +<translation id="3405997282295704902">사용자가 <ph name="PRODUCT_NAME" />을(를) 사용하도록 허용 안함</translation> <translation id="3406122462682235653">사용자에게 확인하지 않음(다운로드 즉시 시작)</translation> <translation id="3408078762098350617"><ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" /> 목록에 있는 사용 중지된 기능의 사용자 환경을 제어합니다. @@ -2639,6 +2655,7 @@ <translation id="3526752951628474302">단색 인쇄만</translation> <translation id="3528000905991875314">대체 오류 페이지 사용</translation> <translation id="3531084733660068324">Parental Supervision 설정</translation> +<translation id="353611922042274900">로그인 화면에 시스템 정보를 항상 표시</translation> <translation id="3536263244905016305">WPAD(웹 프록시 자동 검색) 최적화 사용 중지</translation> <translation id="3538869107794555625">태블릿 모드에서 터치 키보드 사용 설정</translation> <translation id="3539103206548425861">정책을 설정하면 <ph name="PRODUCT_NAME" />에서 동영상이 사용자 동의 없이 오디오 콘텐츠와 함께 자동으로 재생될 수 있습니다. <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> 정책을 True로 설정하면 이 정책은 적용되지 않습니다. <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> 정책을 False로 설정하면 이 정책에 설정된 URL 패턴은 계속해서 재생할 수 있습니다. <ph name="PRODUCT_NAME" />을 실행하는 동안 이 정책을 변경하면 새로 열린 탭에만 적용됩니다. @@ -2985,6 +3002,7 @@ 이 정책을 설정하지 않으면 SPDY를 사용할 수 있습니다.</translation> <translation id="3887529334667818189">탐색 여정이 기본적으로 chrome://history/journeys에 표시되며 사용자가 표시 여부를 변경할 수 있습니다.</translation> +<translation id="388999630001435491"><ph name="PRODUCT_NAME" />에서 비공개 IP 주소의 기기에만 연결하도록 허용</translation> <translation id="3891175633496805812">Wilco 진단 및 텔레메트리 컨트롤러 사용 중지</translation> <translation id="3891357445869647828">자바스크립트 사용</translation> <translation id="3891769546914233112">PDF를 이미지로 인쇄 가능</translation> @@ -3025,6 +3043,7 @@ 비어 있거나 설정되어 있지 않으면 이 기능이 사용 중지됩니다. 참고: 이 정책은 <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />과 함께 사용해야 합니다.</translation> +<translation id="3918339829588313389">사용자가 보안에 취약한 PIN을 설정하도록 허용</translation> <translation id="3924506460382372403">기기 그래픽 상태 보고 사용 중지</translation> <translation id="3925377537407648234">디스플레이 해상도 및 배율 설정</translation> <translation id="3927137827189017535">로그인 화면에서 고정키 접근성 기능을 사용 설정합니다. @@ -3373,6 +3392,7 @@ <translation id="4274691295133617461">이 정책을 3으로 설정하면 웹사이트에서 File System API를 통해 호스트 운영체제의 파일 시스템 내 파일 및 디렉터리에 대한 읽기 액세스 권한을 요청할 수 있습니다. 정책을 2로 설정하면 액세스가 거부됩니다. 정책을 설정하지 않으면 웹사이트에서 액세스 권한을 요청할 수 있지만, 사용자가 이 설정을 변경할 수 있습니다.</translation> +<translation id="4282243913059705499">툴바에 <ph name="PRODUCT_NAME" /> 아이콘 항상 표시</translation> <translation id="4285674129118156176">제휴되지 않은 사용자가 ARC를 사용할 수 있게 허용</translation> <translation id="428948795004445932">네트워크 데이터가 샘플링 및 수집되는 속도입니다. 허용되는 최솟값은 1분입니다. @@ -3840,6 +3860,7 @@ 보고되지 않습니다. True로 설정되면 OS 업데이트 정보가 보고됩니다.</translation> <translation id="4857223512478723171">전체 화면 모드 허용 안함</translation> <translation id="4858735034935305895">전체 화면 모드 허용</translation> +<translation id="4860900625632464759">사용자가 휴대전화와 Chromebook 간에 SMS 메시지를 동기화하도록 허용</translation> <translation id="486146220825734683">사용자가 Kerberos 비밀번호를 기억하도록 허용 안함</translation> <translation id="4861767323695239729">사용자 세션에서 허용되는 입력 수단을 구성합니다.</translation> <translation id="4873380469296842901">이 설정을 켜면 이미 휴대전화 허브 사용을 선택한 사용자가 ChromeOS에서 휴대전화 알림을 보내고 받을 수 있게 됩니다. @@ -3909,6 +3930,7 @@ <translation id="4927214690104703256">정책을 설정하면 원격 증명에 <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> 함수를 사용하도록 허용되는 확장 프로그램이 지정됩니다. 이 목록에 확장 프로그램이 포함되어야 API를 사용할 수 있습니다. 확장 프로그램이 목록에 없거나 목록이 설정되지 않으면 API 호출이 실패하고 오류 코드가 표시됩니다.</translation> +<translation id="4927563541997547">가상 키보드가 기본적으로 레이아웃 표시 영역의 크기 조절</translation> <translation id="4927797103413916381"><ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" />가 사용 안함으로 설정된 경우 <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" />를 사용으로 설정하거나 설정하지 않으면 악의적 사용자 환경이 포함된 사이트에서 새 창 또는 탭을 열 수 없습니다. <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> 또는 <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" />를 사용 안함으로 설정하면 악의적 사용자 환경이 포함된 사이트가 새 창 또는 탭을 열 수 있습니다.</translation> @@ -4065,6 +4087,7 @@ <translation id="5105313908130842249">배터리 전원으로 실행할 때 화면 잠금 지연</translation> <translation id="5108031557082757679">사용 중지된 엔터프라이즈 기기 프린터</translation> <translation id="5109383437323376357">변형 사용 가능 여부 결정</translation> +<translation id="5118635822783657217">중요하지 않은 구성요소의 업데이트 사용 안함</translation> <translation id="5120168808610189805">처음 실행 시 홈페이지 가져오기 사용 설정</translation> <translation id="5124368997194894978">AC(교류 전원)로 부팅 사용</translation> <translation id="5130213897914754028">사이트에서 SharedArrayBuffers를 사용하지 못하도록 차단</translation> @@ -4868,6 +4891,7 @@ 사용 중지하면 QUIC 프로토콜을 사용할 수 없습니다.</translation> <translation id="5916855682471300200">클라우드 머신 정책이 플랫폼 머신 정책보다 우선</translation> +<translation id="5917425424971710623">확장 감지 및 반응(XDR) 이벤트와 관련된 정보 보고 안함</translation> <translation id="5921713479449475707">HTTP를 통한 자동 업데이트 다운로드 허용</translation> <translation id="5927903236543424081">브라우저를 사용하기 전에 사용자 강제 로그인</translation> <translation id="5928633129285224981"><ph name="PRODUCT_NAME" />에서 PDF 인쇄 시 이미지로 인쇄 옵션을 기본적으로 설정할지를 제어합니다. @@ -4919,6 +4943,7 @@ <translation id="5997543603646547632">기본적으로 24시간 표기법 사용</translation> <translation id="5997846976342452720">플러그인 Finder 사용 중지 여부 지정(지원 중단됨)</translation> <translation id="5998198091336830580">이 정책은 다음 그룹의 일부입니다. 그룹에서 우선순위가 가장 높은 출처의 정책만 적용됩니다.</translation> +<translation id="600402562436559989"><ph name="PRODUCT_OS_NAME" /> 기기 및 연결된 Android 휴대전화 전체에서 Wi-Fi 네트워크 구성의 동기화 허용</translation> <translation id="6004575267180297869"> WebAssembly 모듈이 출처가 다른 창 또는 작업자로 전송되도록 허용할지 선택합니다. 출처 간 WebAssembly 모듈 공유는 document.domain 지원 중단의 일환으로 지원 중단될 예정입니다. https://github.com/mikewest/deprecating-document-domain 페이지를 참고하세요. 정책을 설정하면 출처 간 WebAssembly 모듈 공유가 다시 활성화되어 지원 중단 과정에서 전환 기간이 더 길어집니다. @@ -5073,6 +5098,7 @@ 관리자가 필요로 하는 경우 이 정책은 로컬 IP의 보안 수준을 낮춥니다.</translation> <translation id="614662973812186053">이 정책은 Android 사용 및 진단 데이터 수집도 제어합니다.</translation> <translation id="614665605501218241">목록에 포함된 사이트가 안전하지 않은 방식으로 더 높은 수준의 비공개 네트워크 엔드포인트에 요청할 수 있도록 허용</translation> +<translation id="614753473456574270">사용자가 보안에 취약한 PIN을 설정하도록 허용 안함</translation> <translation id="6150320133676152520">잠금 및 로그인 화면에서 PIN 자동 제출 사용 안함</translation> <translation id="6155350825868160236">사용자가 맞춤법 오류를 해결하는 Google 웹 서비스의 사용 여부를 선택하도록 허용</translation> <translation id="6155936611791017817">로그인 화면에서 큰 커서의 기본 상태를 설정</translation> @@ -5649,6 +5675,7 @@ <translation id="6672630473862787247">일반, 시크릿 모드, 게스트 세션에서 수동 인증을 사용 설정합니다.</translation> <translation id="6677291257287862684">로그인 화면에서 고정키 사용</translation> <translation id="6685903773201985073">게스트 세션과 일반 세션에서 수동 인증을 사용 설정합니다.</translation> +<translation id="6687291630099400188">로그인 화면에 시스템 정보 표시 안함</translation> <translation id="6689343802305995925">아무 작업도 실행하지 않습니다.</translation> <translation id="6689792153960219308">하드웨어 상태 보고</translation> <translation id="6690425645391461516">DNS 가로채기 검사를 사용 중지하고 'http://intranetsite/'를 찾으셨나요? 정보 표시줄을 허용합니다.</translation> @@ -7184,6 +7211,7 @@ <translation id="8266778278542911985">이 정책을 3으로 설정하면 웹사이트에서 직렬 포트 액세스를 요청할 수 있습니다. 정책을 2로 설정하면 직렬 포트 액세스를 거부합니다. 정책을 설정하지 않으면 웹사이트에서 액세스를 요청할 수 있지만, 사용자가 이 설정을 변경할 수 있습니다.</translation> +<translation id="8267520984570984190">가상 키보드의 기본적인 크기 조절 동작이 수정되지 않음</translation> <translation id="8267887696930711948">M69에서 지원 중단되었습니다. 대신 OverrideSecurityRestrictionsOnInsecureOrigin을 사용하시기 바랍니다. 이 정책에서는 안전하지 않은 출처에 대한 보한 제안을 적용하지 않을 출처(URL) 또는 호스트 이름 패턴('*.example.com' 등)의 목록을 지정합니다. @@ -8088,6 +8116,7 @@ 정책을 False로 설정하거나 설정하지 않으면 정보가 보고되지 않습니다. True로 설정하면 기기의 시스템 정보가 보고됩니다.</translation> +<translation id="9131419675479917141">사용자가 보안에 취약한 PIN을 설정하도록 허용하지만 경고 표시</translation> <translation id="913195841488580904">URL 목록에 대한 액세스 차단</translation> <translation id="9135033364005346124"><ph name="CLOUD_PRINT_NAME" /> 프록시 사용</translation> <translation id="9136212796239682721">다운로드 도움말 풍선 UI 사용 중지</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 8eab3ae..75e3f7a7 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -4852,6 +4852,7 @@ Если правило отключено, использование протокола QUIC запрещено.</translation> <translation id="5916855682471300200">Правила для облачных устройств имеют приоритет над правилами компьютера</translation> +<translation id="5917425424971710623">Не сообщать информацию о связанных с технологией XDR событиях безопасности</translation> <translation id="5921713479449475707">Разрешить автоматическое скачивание обновлений по протоколу HTTP</translation> <translation id="5927903236543424081">Запретить использование браузера без входа в аккаунт</translation> <translation id="5928633129285224981">Определяет, выбирать ли по умолчанию параметр "Печатать как изображение" в предварительном просмотре при печати PDF в <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 22070419..ed0812c 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -4826,6 +4826,7 @@ Politika, Devre Dışı değerine ayarlanırsa QUIC protokolünün kullanımına izin verilmez.</translation> <translation id="5916855682471300200">Bulut makinesi politikaları, platform makinesi politikaları karşısında öncelikli olur</translation> +<translation id="5917425424971710623">Genişletilmiş tespit ve yanıt (XDR) etkinlikleri ile ilgili bilgileri rapor etme</translation> <translation id="5921713479449475707">HTTP aracılığıyla otomatik güncelleme indirmeye izin ver</translation> <translation id="5927903236543424081">Tarayıcıyı kullanmadan önce kullanıcının oturum açmasını zorunlu kıl</translation> <translation id="5928633129285224981"><ph name="PRODUCT_NAME" /> üzerinde PDF yazdırılırken Resim olarak yazdır'ın varsayılan olarak seçilip seçilmeyeceğini kontrol eder.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 37e815a..2d875c3 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -227,6 +227,7 @@ Mặc định là RollbackDisabled.</translation> <translation id="1221359380862872747">Tải các url đã chỉ định khi đăng nhập ở chế độ trình diễn</translation> +<translation id="1221955019309484560">Cho phép cập nhật mọi thành phần</translation> <translation id="1223789468190631420">Trạng thái bật tính năng Duyệt web an toàn cho các nguồn đáng tin cậy</translation> <translation id="123018742985150697">Yêu cầu so khớp người dùng cục bộ và chủ sở hữu máy chủ truy cập từ xa</translation> <translation id="123081309365616809">Bật tính năng truyền nội dung đến thiết bị</translation> @@ -493,6 +494,7 @@ Nếu bạn đặt chính sách này, thì giá trị của chính sách sẽ được áp dụng làm cấu hình đề xuất và hiển thị trong phần "Nâng cao" của hộp thoại xác thực. Nếu bạn chưa đặt chính sách này, thì cấu hình <ph name="PRODUCT_OS_NAME" /> được đề xuất sẽ được áp dụng. Lưu ý rằng cấu hình này cũng hiển thị trong phần "Nâng cao" của hộp thoại xác thực.</translation> +<translation id="1487722536912664411">Cho phép người dùng sử dụng <ph name="PRODUCT_NAME" /></translation> <translation id="1487916040416013623">Nếu bạn đặt chính sách này, hệ thống sẽ chỉ định máy chủ nào sẽ được phép dùng cho quy trình xác thực tích hợp. Tính năng xác thực tích hợp chỉ bật khi <ph name="PRODUCT_NAME" /> nhận được thử thách xác thực từ một proxy hoặc từ một máy chủ có trong danh sách cho phép này. Nếu bạn không đặt chính sách này, <ph name="PRODUCT_NAME" /> sẽ tìm cách phát hiện xem một máy chủ có thuộc mạng nội bộ hay không. Chỉ khi đó, ứng dụng này mới phản hồi yêu cầu IWA. Nếu phát hiện một máy chủ là từ Internet, thì <ph name="PRODUCT_NAME" /> sẽ bỏ qua yêu cầu IWA từ máy chủ đó. @@ -634,6 +636,7 @@ <translation id="1617235075406854669">Bật xóa nhật ký duyệt web và lịch sử tải xuống</translation> <translation id="1620510694547887537">Camera</translation> <translation id="162162247775156979">Tắt tính năng báo cáo trạng thái bộ nhớ của thiết bị</translation> +<translation id="1625700732886306811">Cho phép <ph name="PRODUCT_NAME" /> kết nối với các thiết bị trên mọi địa chỉ IP</translation> <translation id="1626379196197114720">Cho phép sử dụng bộ nhớ đệm cho thao tác tiến/lùi</translation> <translation id="1628974048137236820">Trang thẻ mới sẽ không hiển thị thẻ</translation> <translation id="1630263002012156148">Nếu bạn đặt chính sách này thành Bật, trang chủ của người dùng sẽ là trang Thẻ mới và mọi vị trí URL trang chủ sẽ bị bỏ qua. Nếu bạn đặt chính sách này thành Tắt, trang chủ của người dùng sẽ không bao giờ là trang Thẻ mới, trừ khi URL trang chủ của họ được đặt thành chrome://newtab. @@ -670,6 +673,7 @@ <translation id="1654087023995670109">Thực thi chế độ khách trên trình duyệt</translation> <translation id="1655229863189977773">Đặt kích thước bộ nhớ đệm của đĩa theo byte</translation> <translation id="165769015320654523">Tự động cấp quyền cho những trang web này để kết nối với các thiết bị HID bằng mã nhà cung cấp và mã sản phẩm cụ thể.</translation> +<translation id="1659406551862245683">Thao tác đổi kích thước bàn phím ảo mặc định được thay đổi thành đổi kích thước khung nhìn bố cục</translation> <translation id="166427968280387991">Máy chủ proxy</translation> <translation id="1669584285557771729">Nếu bạn đặt chính sách này, thì chính sách sẽ kiểm soát loại kính lúp được bật. @@ -1126,6 +1130,7 @@ <translation id="2107601598727098402"> Chính sách này không còn dùng trong M72 nữa. Thay vào đó, hãy sử dụng CloudManagementEnrollmentToken. </translation> +<translation id="2112656109118682849">Cho phép người dùng bật/tắt chế độ hiển thị thông tin hệ thống trên màn hình đăng nhập</translation> <translation id="2113068765175018713">Giới hạn thời gian hoạt động của thiết bị bằng cách tự động khởi động lại</translation> <translation id="2116169546538119304"> Chính sách này không còn dùng nữa, vui lòng định cấu hình các chính sách của Kerberos để sử dụng lại mật khẩu đăng nhập.</translation> <translation id="2117990069872855599">URL mà từ đó có thể tải hình đại diện xuống.</translation> @@ -1454,6 +1459,7 @@ Để biết thông tin chi tiết về mẫu URL hợp lệ, vui lòng truy cập vào https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Tuy nhiên, kể từ phiên bản M85, các mẫu có ký tự đại diện "*" và "[*.]" trong máy chủ sẽ không được hỗ trợ trong chính sách này nữa.</translation> <translation id="2423255396068675416">Nếu bạn không đặt hoặc đặt chính sách này thành Bật, thì người dùng có thể chạy <ph name="PRODUCT_CROSTINI_NAME" /> miễn là <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> và <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> đều được đặt thành Bật. Việc đặt chính sách này thành Tắt sẽ tắt <ph name="PRODUCT_CROSTINI_NAME" /> đối với người dùng. Khi bạn đổi chính sách này thành Tắt, chính sách sẽ được áp dụng cho các vùng chứa <ph name="PRODUCT_CROSTINI_NAME" /> mới đang khởi động, chứ không phải các vùng chứa đã chạy.</translation> +<translation id="242521047682347997">Không cho phép người dùng đồng bộ hoá tin nhắn SMS giữa Chromebook và điện thoại</translation> <translation id="2426782419955104525">Bật tính năng Instant của <ph name="PRODUCT_NAME" /> và chặn người dùng thay đổi cài đặt này. Nếu bạn bật cài đặt này, tính năng Instant của <ph name="PRODUCT_NAME" /> được bật. @@ -1991,6 +1997,13 @@ Nếu bạn tắt chính sách này thì các bản cập nhật cho những thành phần đó sẽ bị vô hiệu hoá. Tuy nhiên, chính sách này không áp dụng cho một số thành phần: các bản cập nhật cho thành phần bất kỳ không chứa mã thực thi và quan trọng đối với tính bảo mật của trình duyệt sẽ không bị vô hiệu hoá. Các danh sách thu hồi chứng chỉ và bộ lọc tài nguyên phụ là một số ví dụ cho loại thành phần nêu trên.</translation> +<translation id="2932796739547676677">Nếu bạn đặt chính sách này thành Đúng thì bàn phím ảo sẽ đổi kích thước khung nhìn bố cục theo mặc định. + Các trạng thái khác (Sai/không đặt) không có tác dụng. + + Lưu ý rằng điều này chỉ ảnh hưởng đến thao tác đổi kích thước mặc định: nếu một trang yêu cầu một thao tác cụ thể bằng thẻ <meta> hoặc API Bàn phím ảo thì thao tác mà trang đó yêu cầu sẽ vẫn được áp dụng. + + Ngoài ra, xin lưu ý rằng đây là chính sách "giải pháp khẩn cấp" dự kiến sẽ tồn tại trong thời gian ngắn. + </translation> <translation id="2939335382784544151">Bật chính sách nhập nhật ký duyệt web trong lần chạy đầu tiên</translation> <translation id="2940127076681735544">Nếu bạn đặt chính sách này thành một URL hợp lệ, thì <ph name="PRODUCT_NAME" /> sẽ tải danh sách trang web xuống từ URL đó, rồi áp dụng các quy tắc như thể các quy tắc đó được định cấu hình bằng chính sách <ph name="SITELIST_POLICY_NAME" />. @@ -2225,6 +2238,7 @@ <translation id="3142410959002029864">Việc đặt chính sách này sẽ ghi đè chế độ in hai mặt mặc định. Nếu không có chế độ nêu trên, chính sách này sẽ bị bỏ qua.</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="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="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> <translation id="3157857846231611820">Danh sách các chế độ cài đặt dịch vụ Chrome Enterprise Connectors sẽ áp dụng cho <ph name="ON_FILE_ATTACHED_ENTERPRISE_CONNECTOR" /> Enterprise Connector (kích hoạt khi có tệp được đính kèm vào Chrome). @@ -2456,6 +2470,7 @@ Bạn có thể ghi đè chính sách này cho các mẫu URL cụ thể bằng chính sách 'InsecureContentAllowedForUrls' và 'InsecureContentBlockedForUrls'. Nếu bạn không đặt chính sách này, thì người dùng có thể thêm trường hợp ngoại lệ để cho phép nội dung hỗn hợp có thể chặn và tắt tùy chọn tự động nâng cấp của nội dung hỗn hợp có thể tùy ý chặn.</translation> +<translation id="3307744348419745296">Không cho phép đồng bộ hoá các cấu hình mạng Wi-Fi trên nhiều thiết bị <ph name="PRODUCT_OS_NAME" /> với một điện thoại Android được kết nối</translation> <translation id="3308724602356134956">Nếu bạn đặt chính sách này, <ph name="PRODUCT_OS_NAME" /> sẽ tải xuống và sử dụng hình nền mà bạn đặt cho màn hình đăng nhập và máy tính của người dùng. Người dùng không thể thay đổi hình nền này. Chỉ định URL (có thể truy cập mà không cần xác thực) mà <ph name="PRODUCT_OS_NAME" /> @@ -2526,6 +2541,7 @@ <translation id="3398051852031115795">Hoạt động mặc định của hệ thống (phụ thuộc vào kích thước màn hình)</translation> <translation id="3399859571630358395">Buộc tắt tính năng Ghép nối nhanh (ghép nối Bluetooth nhanh).</translation> <translation id="3404681701763345449">Bật tính năng tích hợp <ph name="GOOGLE_CALENDAR_NAME" />.</translation> +<translation id="3405997282295704902">Không cho phép người dùng sử dụng <ph name="PRODUCT_NAME" /></translation> <translation id="3406122462682235653">Không hỏi người dùng (bắt đầu tải xuống ngay)</translation> <translation id="3408078762098350617">Kiểm soát trải nghiệm người dùng đối với các tính năng bị tắt có trong danh sách <ph name="SYSTEM_FEATURES_DISABLE_LIST_POLICY_NAME" />. @@ -2645,6 +2661,7 @@ <translation id="3526752951628474302">Chỉ in đen trắng</translation> <translation id="3528000905991875314">Bật các trang lỗi thay thế</translation> <translation id="3531084733660068324">Cài đặt tính năng giám sát của cha mẹ</translation> +<translation id="353611922042274900">Luôn hiển thị thông tin hệ thống trên màn hình đăng nhập</translation> <translation id="3536263244905016305">Tắt tính năng tối ưu hóa Web Proxy Auto-Discovery (WPAD) (Tự động phát hiện proxy web)</translation> <translation id="3538869107794555625">Bật bàn phím ảo ở chế độ máy tính bảng</translation> <translation id="3539103206548425861">Nếu bạn đặt chính sách này, thì video sẽ tự động phát (mà không cần người dùng cho phép) nội dung âm thanh trong <ph name="PRODUCT_NAME" />. Nếu bạn đặt chính sách <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> thành True, thì chính sách này sẽ không có hiệu lực. Nếu bạn đặt chính sách <ph name="AUTOPLAY_ALLOWED_POLICY_NAME" /> thành False, thì các mẫu URL bạn thiết lập trong chính sách này vẫn có thể phát. Nếu chính sách này thay đổi trong khi <ph name="PRODUCT_NAME" /> đang chạy, chính sách chỉ áp dụng cho các thẻ mới mở. @@ -2991,6 +3008,7 @@ Nếu chính sách này chưa được đặt, SPDY sẽ khả dụng.</translation> <translation id="3887529334667818189">Hành trình sẽ xuất hiện tại chrome://history/journeys theo mặc định và người dùng có thể thay đổi chế độ hiển thị của Hành trình.</translation> +<translation id="388999630001435491">Chỉ cho phép <ph name="PRODUCT_NAME" /> kết nối với các thiết bị trên địa chỉ IP riêng tư</translation> <translation id="3891175633496805812">Tắt bộ điều khiển đo từ xa và chẩn đoán wilco</translation> <translation id="3891357445869647828">Bật JavaScript</translation> <translation id="3891769546914233112">Lựa chọn In tệp PDF dưới dạng hình ảnh có sẵn</translation> @@ -3031,6 +3049,7 @@ Tính năng này sẽ bị tắt nếu bạn để trống hoặc không đặt chính sách này. Lưu ý: Bạn phải sử dụng chính sách này với <ph name="REMOTE_ACCESS_HOST_TOKEN_VALIDATION_URL_POLICY_NAME" />.</translation> +<translation id="3918339829588313389">Cho phép người dùng đặt mã PIN yếu</translation> <translation id="3924506460382372403">Tắt tính năng báo cáo trạng thái đồ hoạ của thiết bị</translation> <translation id="3925377537407648234">Đặt độ phân giải màn hình và hệ số tỷ lệ</translation> <translation id="3927137827189017535">Bật tính năng hỗ trợ tiếp cận về phím cố định trên màn hình đăng nhập. @@ -3360,6 +3379,7 @@ <translation id="4274691295133617461">Khi bạn đặt chính sách này thành 3, các trang web có thể yêu cầu quyền đọc các tệp và thư mục trong hệ thống tệp của hệ điều hành máy chủ qua API Hệ thống tệp. Khi bạn đặt chính sách này thành 2, quyền truy cập sẽ bị từ chối. Khi bạn không đặt chính sách này, các trang web có thể yêu cầu quyền truy cập, nhưng người dùng có thể thay đổi tùy chọn cài đặt này.</translation> +<translation id="4282243913059705499">Luôn hiển thị biểu tượng <ph name="PRODUCT_NAME" /> trên thanh công cụ</translation> <translation id="4285674129118156176">Cho phép người dùng không được liên kết sử dụng ARC</translation> <translation id="428948795004445932">Chu kỳ hệ thống lấy mẫu và thu thập dữ liệu mạng. Thời gian tối thiểu cho phép là 1 phút. @@ -3827,6 +3847,7 @@ báo cáo. Nếu bạn đặt chính sách này thành true, thì thông tin cập nhật hệ điều hành sẽ được báo cáo.</translation> <translation id="4857223512478723171">Không cho phép sử dụng chế độ toàn màn hình</translation> <translation id="4858735034935305895">Cho phép chế độ toàn màn hình</translation> +<translation id="4860900625632464759">Cho phép người dùng đồng bộ hoá tin nhắn SMS giữa Chromebook và điện thoại</translation> <translation id="486146220825734683">Không cho phép người dùng ghi nhớ mật khẩu Kerberos</translation> <translation id="4861767323695239729">Định cấu hình các phương thức nhập được phép trong phiên người dùng</translation> <translation id="4873380469296842901">Nếu bạn bật chế độ cài đặt này, người dùng đã chọn sử dụng Trung tâm điều khiển điện thoại sẽ thể gửi/nhận được thông báo của điện thoại trên ChromeOS. @@ -3896,6 +3917,7 @@ <translation id="4927214690104703256">Việc đặt chính sách này sẽ chỉ định những tiện ích được phép sử dụng các chức năng của <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> để chứng thực từ xa. Các tiện ích phải có trong danh sách này thì mới có thể sử dụng API. Nếu một tiện ích không có trong danh sách hoặc nếu bạn không đặt danh sách này, thì lệnh gọi đến API sẽ không thực hiện được kèm theo mã lỗi.</translation> +<translation id="4927563541997547">Bàn phím ảo sẽ đổi kích thước khung nhìn bố cục theo mặc định</translation> <translation id="4927797103413916381">Nếu bạn không Tắt <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" />, thì khi đặt <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> thành Bật hoặc không đặt, những trang web có trải nghiệm lừa gạt sẽ không thể mở thẻ hoặc cửa sổ mới. Khi bạn đặt <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> hoặc <ph name="ABUSIVE_EXPERIENCE_INTERVENTION_ENFORCE_POLICY_NAME" /> thành Tắt, những trang web có trải nghiệm lừa gạt có thể mở thẻ hoặc cửa sổ mới.</translation> @@ -4054,6 +4076,7 @@ <translation id="5105313908130842249">Độ trễ khóa màn hình khi chạy trên nguồn pin</translation> <translation id="5108031557082757679">Đã tắt máy in kết nối với thiết bị dành cho doanh nghiệp</translation> <translation id="5109383437323376357">Xác định tình trạng có sẵn của biến</translation> +<translation id="5118635822783657217">Không cho phép cập nhật các thành phần không quan trọng</translation> <translation id="5120168808610189805">Bật chính sách nhập trang chủ trong lần chạy đầu tiên</translation> <translation id="5124368997194894978">Bật tính năng khởi động trên AC (dòng điện xoay chiều)</translation> <translation id="5130213897914754028">Ngăn các trang web sử dụng SharedArrayBuffers</translation> @@ -4910,6 +4933,7 @@ <translation id="5997543603646547632">Sử dụng đồng hồ 24 giờ theo mặc định</translation> <translation id="5997846976342452720">Chỉ định xem có nên tắt trình tìm kiếm plugin hay không (không được dùng nữa)</translation> <translation id="5998198091336830580">Chính sách này thuộc nhóm không thể phân chia sau đây (chỉ áp dụng các chính sách thuộc nguồn có mức ưu tiên cao nhất trong nhóm):</translation> +<translation id="600402562436559989">Cho phép đồng bộ hoá các cấu hình mạng Wi-Fi trên nhiều thiết bị <ph name="PRODUCT_OS_NAME" /> với một điện thoại Android được kết nối</translation> <translation id="6004575267180297869">Chỉ định xem hệ thống có thể gửi các mô-đun WebAssembly đến một cửa sổ khác hay trình chạy dịch vụ trên nhiều nguồn gốc hay không. Tính năng chia sẻ mô-đun WebAssembly trên nhiều nguồn gốc sẽ ngừng hoạt động cùng với document.domain, vui lòng xem tại https://github.com/mikewest/deprecating-document-domain. Chính sách này cho phép bật lại tính năng chia sẻ mô-đun WebAssembly trên nhiều nguồn gốc để cung cấp thời gian chuyển đổi dài hơn trong quá trình ngừng sử dụng. Khi bạn đặt chính sách này thành Đúng, các trang web cũng có thể gửi mô-đun WebAssembly trên nhiều nguồn gốc mà không có hạn chế. @@ -5063,6 +5087,7 @@ Xin lưu ý rằng chính sách này sẽ làm yếu đi chức năng bảo vệ của IP cục bộ nếu quản trị viên cần.</translation> <translation id="614662973812186053">Chính sách này cũng kiểm soát việc thu thập dữ liệu chẩn đoán và sử dụng Android.</translation> <translation id="614665605501218241">Cho phép các trang web trong danh sách gửi yêu cầu theo cách không an toàn tới các điểm cuối trên mạng có mức độ riêng tư cao hơn hay không.</translation> +<translation id="614753473456574270">Không cho phép người dùng đặt mã PIN yếu</translation> <translation id="6150320133676152520">Tắt chế độ tự động gửi mã PIN trên màn hình đăng nhập và màn hình khoá</translation> <translation id="6155350825868160236">Cho phép người dùng chọn xem có sử dụng các dịch vụ web của Google để sửa lỗi chính tả hay không</translation> <translation id="6155936611791017817">Đặt trạng thái của con trỏ lớn mặc định trên màn hình đăng nhập</translation> @@ -5638,6 +5663,7 @@ <translation id="6672630473862787247">Bật quy trình xác thực môi trường xung quanh trong các phiên khách, phiên thông thường và phiên ẩn danh.</translation> <translation id="6677291257287862684">Bật phím cố định trên màn hình đăng nhập</translation> <translation id="6685903773201985073">Bật quy trình xác thực môi trường xung quanh trong các phiên khách và phiên thông thường.</translation> +<translation id="6687291630099400188">Không hiển thị thông tin hệ thống trên màn hình đăng nhập</translation> <translation id="6689343802305995925">Không có hành động nào diễn ra.</translation> <translation id="6689792153960219308">Báo cáo trạng thái phần cứng</translation> <translation id="6690425645391461516">Tắt các tùy chọn kiểm tra chặn hệ thống tên miền (DNS); cho phép thanh thông tin "Ý của bạn là http://intranetsite/".</translation> @@ -7174,6 +7200,7 @@ <translation id="8266778278542911985">Nếu bạn đặt chính sách này thành 3, thì các trang web có thể yêu cầu quyền truy cập vào cổng nối tiếp. Nếu bạn đặt chính sách này thành 2, quyền truy cập vào cổng nối tiếp sẽ bị từ chối. Nếu bạn không đặt chính sách này, thì các trang web có thể yêu cầu quyền truy cập nhưng người dùng được quyền thay đổi tùy chọn cài đặt này.</translation> +<translation id="8267520984570984190">Thao tác đổi kích thước bàn phím ảo mặc định chưa được sửa đổi</translation> <translation id="8267887696930711948">Không còn dùng trong M69. Thay vào đó, hãy sử dụng OverrideSecurityRestrictionsOnInsecureOrigin. @@ -8085,6 +8112,7 @@ Nếu bạn đặt chính sách này thành false hoặc không đặt chính sách này, thì thông tin sẽ không được báo cáo. Nếu bạn đặt chính sách này thành true, thì thông tin về hệ thống của thiết bị sẽ được báo cáo.</translation> +<translation id="9131419675479917141">Cho phép người dùng đặt mã PIN yếu nhưng có hiển thị cảnh báo</translation> <translation id="913195841488580904">Chặn truy cập vào danh sách các URL</translation> <translation id="9135033364005346124">Bật proxy <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Tắt giao diện người dùng bong bóng tải xuống</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 81622c6..34b95a4 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -4723,6 +4723,7 @@ 如果此政策已停用,系统将禁止使用 QUIC 协议。</translation> <translation id="5916855682471300200">云端设备政策的优先级高于平台设备政策</translation> +<translation id="5917425424971710623">不报告扩展检测和响应 (XDR) 事件的相关信息</translation> <translation id="5921713479449475707">允许通过 HTTP 自动更新下载内容</translation> <translation id="5928633129285224981">控制 <ph name="PRODUCT_NAME" /> 是否会在打印 PDF 文档时默认选中“以图片形式打印”选项。
diff --git a/components/printing/browser/print_to_pdf/pdf_print_job.cc b/components/printing/browser/print_to_pdf/pdf_print_job.cc index 941149d..ef9742e 100644 --- a/components/printing/browser/print_to_pdf/pdf_print_job.cc +++ b/components/printing/browser/print_to_pdf/pdf_print_job.cc
@@ -134,7 +134,7 @@ std::string(static_cast<const char*>(mapping.memory()), mapping.size()); std::move(print_to_pdf_callback_) .Run(PdfPrintResult::kPrintSuccess, - base::RefCountedString::TakeString(&data)); + base::MakeRefCounted<base::RefCountedString>(std::move(data))); delete this; }
diff --git a/components/search_provider_logos/fixed_logo_api.cc b/components/search_provider_logos/fixed_logo_api.cc index 8905562..49caa8dc 100644 --- a/components/search_provider_logos/fixed_logo_api.cc +++ b/components/search_provider_logos/fixed_logo_api.cc
@@ -17,7 +17,8 @@ base::Time response_time, bool* parsing_failed) { auto logo = std::make_unique<EncodedLogo>(); - logo->encoded_image = base::RefCountedString::TakeString(response.get()); + logo->encoded_image = + base::MakeRefCounted<base::RefCountedString>(std::move(*response)); // If |can_show_after_expiration| is true, the |expiration_time| has little // effect. Set it as far as possible in the future just as an approximation.
diff --git a/components/search_provider_logos/google_logo_api.cc b/components/search_provider_logos/google_logo_api.cc index 8eec241e..6ade189 100644 --- a/components/search_provider_logos/google_logo_api.cc +++ b/components/search_provider_logos/google_logo_api.cc
@@ -134,7 +134,8 @@ return result; result.first = mime_type; - result.second = base::RefCountedString::TakeString(&decoded_data); + result.second = + base::MakeRefCounted<base::RefCountedString>(std::move(decoded_data)); return result; }
diff --git a/components/signin/internal/identity_manager/account_tracker_service.cc b/components/signin/internal/identity_manager/account_tracker_service.cc index dd511b9..723cf2a 100644 --- a/components/signin/internal/identity_manager/account_tracker_service.cc +++ b/components/signin/internal/identity_manager/account_tracker_service.cc
@@ -89,7 +89,7 @@ return gfx::Image(); } return gfx::Image::CreateFrom1xPNGBytes( - base::RefCountedString::TakeString(&image_data)); + base::MakeRefCounted<base::RefCountedString>(std::move(image_data))); } // Saves |png_data| to disk at |image_path|.
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index 4e04eb7..a35bf21 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">የእንቅስቃሴ ዳሳሾች</translation> <translation id="1717494416764505390">የመልዕክት ሳጥን 3</translation> <translation id="1718029547804390981">ሰነድ ለመብራራት ከልክ በላይ ትልቅ ነው</translation> +<translation id="1719434663396780149">የዋጋ ቅነሳ ማንቂያዎች በርተዋል። ይህን <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> ውስጥ መለወጥ ይችላሉ።</translation> <translation id="1720941539803966190">አጋዥ ስልጠናውን ዝጋ</translation> <translation id="1721424275792716183">* መስክ ያስፈልጋል</translation> <translation id="1725591448053514783">ዩ 6 ፖስታ</translation> @@ -978,6 +979,7 @@ <translation id="3550112004925580947">የመስተንግዶ ኢንዱስትሪ</translation> <translation id="3552297013052089404">Sans-Serif ቅርጸ ቁምፊ</translation> <translation id="3558573058928565255">የቀን ሰዓት</translation> +<translation id="3560824484345057728">ተዛማጅ ጣቢያዎችን ይመልከቱ</translation> <translation id="3566021033012934673">ግንኙነትዎ የግል አይደለም</translation> <translation id="3567778190852720481">በድርጅት መለያ መመዝገብ አይቻልም (የድርጅት መለያ ብቁ አይደለም)።</translation> <translation id="3574305903863751447"><ph name="CITY" />፣ <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1363,6 +1365,7 @@ <translation id="4542971377163063093">መሳቢያ 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">ቅጥያዎችዎን አሰናክለው ይሞክሩ።</translation> +<translation id="4559134504959026834">ይህ ጣቢያ እንቅስቃሴዎን ማየት በሚችል በ<ph name="SET_OWNER" /> በተገለጸ አንድ ቡድን ውስጥ ነው</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">ከቤት ውጭ</translation> <translation id="4567686777917670400">የእርስዎ አስተዳዳሪ በርቀት የአሳሽዎን ውቅረት መቀየር ይችላል። በዚህ መሣሪያ ላይ ያለ እንቅስቃሴ እንዲሁም ከChromium ውጭ ሊተዳደር ይችላል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> @@ -2669,6 +2672,7 @@ <translation id="7995512525968007366">አልተጠቀሰም</translation> <translation id="7998269595945679889">ማንነት የማያሳውቅ ትር አዝራርን ይክፈቱ፣ በግል እንዲያስሱ አዲስ ማንነት የማያሳውቅ ትርን ለመክፈት አስገባን ይጫኑ</translation> <translation id="800218591365569300">የማህደረ ትውስታ ቦታን ለማስለቀቅ ሌሎች ትሮችን ወይም ፕሮግራሞችን ዘግተው ይሞክሩ።</translation> +<translation id="8002230960325005199">ተዛማጅ ጣቢያዎችን በአዲስ ትር ውስጥ ይመልከቱ</translation> <translation id="8003046808285812021">«<ph name="SEARCH_TERMS" />»</translation> <translation id="8004582292198964060">አሳሽ</translation> <translation id="8009225694047762179">የይለፍ ቃላትን ያቀናብሩ</translation> @@ -2772,6 +2776,7 @@ <translation id="8270242299912238708">የፒዲኤፍ ሰነዶች</translation> <translation id="8275952078857499577">ይህንን ጣቢያ ለመተርጎም አያቅርቡ</translation> <translation id="8277900682056760511">የክፍያ ቁጥጥር ሉህ ተከፍቷል</translation> +<translation id="8279611986089885641">የChrome ማሳወቂያዎች መብራት አለባቸው። በ<ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> ውስጥ እነሱን ማብራት ይችላሉ።</translation> <translation id="8280630997017109758">መሳቢያ 11</translation> <translation id="8281084378435768645">ትልቅ-ፎቶ</translation> <translation id="8281886186245836920">ዝለል</translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index 212eee6..f415d46 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">ম'শ্বন ছেন্সৰসমূহ</translation> <translation id="1717494416764505390">মেইলবক্স ৩</translation> <translation id="1718029547804390981">নথিটো ইমানেই ডাঙৰ যে সেইটো এন’টেট কৰিব নোৱাৰি</translation> +<translation id="1719434663396780149">মূল্য কমাৰ সতৰ্কবাৰ্তাৰ সুবিধাটো অন আছে। আপুনি <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />ত এইটো সলনি কৰিব পাৰে।</translation> <translation id="1720941539803966190">টিউট’ৰিয়েল বন্ধ কৰক</translation> <translation id="1721424275792716183">* ক্ষেত্ৰটো আৱশ্যকীয়</translation> <translation id="1725591448053514783">এনভেল’প আপুনি ৬</translation> @@ -974,6 +975,7 @@ <translation id="3550112004925580947">আতিথ্য সেৱাৰ উদ্যােগ</translation> <translation id="3552297013052089404">Sans-serif ফ’ণ্ট</translation> <translation id="3558573058928565255">দিনত</translation> +<translation id="3560824484345057728">জড়িত হৈ থকা ছাইটসমূহ চাওক</translation> <translation id="3566021033012934673">আপোনাৰ ইণ্টাৰনেট সংযোগ ব্যক্তিগত নহয়</translation> <translation id="3567778190852720481">এণ্টাৰপ্ৰাইজ একাউণ্টৰ জৰিয়তে পঞ্জীয়ন কৰিব নোৱাৰি (এণ্টাৰপ্ৰাইজ একাউণ্ট যোগ্য নহয়)।</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1356,6 +1358,7 @@ <translation id="4542971377163063093">ট্ৰে’ ৬</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">আপোনাৰ এক্সটেনশ্বনসমূহ অক্ষম কৰিবলৈ চেষ্টা কৰক।</translation> +<translation id="4559134504959026834">এই ছাইটটো এটা গোটত আছে, যাক <ph name="SET_OWNER" />এ সংজ্ঞায়িত কৰে আৰু সেইটোৱে আপোনাৰ কাৰ্যকলাপ চাব পাৰে</translation> <translation id="4559332380232738994">১০x১১</translation> <translation id="4566017918361049074">মুকলি ঠাইত হোৱা কাৰ্যকলাপ</translation> <translation id="4567686777917670400">আপোনাৰ প্ৰশাসকে দূৰৰ পৰাই আপোনাৰ ব্ৰাউজাৰৰ ছেটআপ সলনি কৰিব পাৰে। এই ডিভাইচটোত কৰা কাৰ্যকলাপ Chromiumৰ বাহিৰৰ পৰাও পৰিচালনা কৰা হ’ব পাৰে। <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> @@ -2658,6 +2661,7 @@ <translation id="7995512525968007366">নির্দিষ্ট কৰা হোৱা নাই</translation> <translation id="7998269595945679889">ব্যক্তিগতভাৱে ব্ৰাউজ কৰিবলৈ ইনক’গনিট’ টেবৰ বুটামটো খোলক আৰু এটা নতুন ইনক’গনিট’ টেব খুলিবলৈ এণ্টাৰ টিপক</translation> <translation id="800218591365569300">মেম’ৰী খালী কৰিবলৈ অন্য টেব বা প্র’গ্ৰেম বন্ধ কৰি চাওক।</translation> +<translation id="8002230960325005199">জড়িত হৈ থকা ছাইটসমূহ এটা নতুন টেবত চাওক</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">ব্ৰাউজাৰ</translation> <translation id="8009225694047762179">পাছৱৰ্ড পৰিচালনা কৰক</translation> @@ -2761,6 +2765,7 @@ <translation id="8270242299912238708">PDF নথিপত্ৰসমূহ</translation> <translation id="8275952078857499577">এই ছাইটটো অনুবাদ কৰাৰ সুবিধা প্ৰদান নকৰিব</translation> <translation id="8277900682056760511">পৰিশোধ নিয়ন্ত্ৰক শ্বীটখন খোলা আছে</translation> +<translation id="8279611986089885641">Chromeৰ জাননী লাভ কৰাৰ সুবিধাটো অন হৈ থাকিবই লাগিব। আপুনি <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />ত সেয়া অন কৰিব পাৰে।</translation> <translation id="8280630997017109758">ট্ৰে’ ১১</translation> <translation id="8281084378435768645">ডাঙৰ-ফট'</translation> <translation id="8281886186245836920">এৰি যাওক</translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index b59b0bb..d2bb2d1 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Hərəkət sensorları</translation> <translation id="1717494416764505390">Poçt qutusu 3</translation> <translation id="1718029547804390981">Sənəd annotasiya üçün çox böyükdür</translation> +<translation id="1719434663396780149">Qiymət endirimi xəbərdarlıqları aktivdir. Bunu <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> bölməsində dəyişə bilərsiniz.</translation> <translation id="1720941539803966190">Dərsliyi bağlayın</translation> <translation id="1721424275792716183">* Sahə tələb olunur</translation> <translation id="1725591448053514783">Zərf You 6</translation> @@ -976,6 +977,7 @@ <translation id="3550112004925580947">Qonaqlama sənayesi</translation> <translation id="3552297013052089404">Sans-serif şrifti</translation> <translation id="3558573058928565255">Gündüz vaxtı</translation> +<translation id="3560824484345057728">Əlaqədar saytlara baxın</translation> <translation id="3566021033012934673">Bağlantınız məxfi deyil</translation> <translation id="3567778190852720481">Müəssisə hesabı ilə qeydiyyatdan keçmək olmur (müəssisə hesabı uyğun deyil).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1360,6 +1362,7 @@ <translation id="4542971377163063093">Qab 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Artırmalarınız deaktiv edilir</translation> +<translation id="4559134504959026834">Bu sayt fəaliyyətinizi görən <ph name="SET_OWNER" /> tərəfindən təyin edilən qrupdadır</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Açıq hava</translation> <translation id="4567686777917670400">Administrator brauzer quraşdırmasını uzaqdan dəyişə bilər. Bu cihazdakı fəaliyyət Chromium'dan kənarda da idarə edilə bilər. <ph name="BEGIN_LINK" />Ətraflı məlumat<ph name="END_LINK" /></translation> @@ -2666,6 +2669,7 @@ <translation id="7995512525968007366">Göstərilməəyib</translation> <translation id="7998269595945679889">"Anonim tab açın" düyməsi, gizli baxış üçün yeni Anonim tab açmaq üçün Enter düyməsinə basın</translation> <translation id="800218591365569300">Yaddaşı boşaltmaq üçün digər tab və proqramları bağlayın.</translation> +<translation id="8002230960325005199">Əlaqədar saytlara yeni tabda baxın</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">Brauzer</translation> <translation id="8009225694047762179">Parolları İdarə edin</translation> @@ -2769,6 +2773,7 @@ <translation id="8270242299912238708">PDF sənədləri</translation> <translation id="8275952078857499577">Bu saytın tərcümə edilməsini təklif etməyin</translation> <translation id="8277900682056760511">Ödəniş səhifəsi açıqdır</translation> +<translation id="8279611986089885641">Chrome bildirişləri aktiv olmalıdır. Onları <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> bölməsində aktiv edə bilərsiniz.</translation> <translation id="8280630997017109758">Qab 11</translation> <translation id="8281084378435768645">Böyük Ölçülü Foto</translation> <translation id="8281886186245836920">Keçin</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 726a6533..4c5f945 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Bevægelsessensorer</translation> <translation id="1717494416764505390">Postkasse 3</translation> <translation id="1718029547804390981">Dokumenterne er for store til at blive annoteret</translation> +<translation id="1719434663396780149">Underretninger om prisfald er aktiveret. Du kan ændre dette i <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Luk selvstudiet</translation> <translation id="1721424275792716183">* Feltet skal udfyldes</translation> <translation id="1725591448053514783">Konvolut Dig 6</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">Restaurations- og hotelbranchen</translation> <translation id="3552297013052089404">Sans Serif-skrifttype</translation> <translation id="3558573058928565255">Dagtimer</translation> +<translation id="3560824484345057728">Se relaterede websites</translation> <translation id="3566021033012934673">Din forbindelse er ikke privat</translation> <translation id="3567778190852720481">Virksomhedskontoen kan ikke bruges til tilmelding, da den ikke er kvalificeret.</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">Bakke 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Prøv at deaktivere dine udvidelser.</translation> +<translation id="4559134504959026834">Dette website er i en gruppe, der er defineret af <ph name="SET_OWNER" />, og som kan se din aktivitet</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Udendørsaktiviteter</translation> <translation id="4567686777917670400">Din administrator kan ændre konfigurationen af din browser via fjernadgang. Aktivitet på denne enhed administreres muligvis også uden for Chromium. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation> @@ -2670,6 +2673,7 @@ <translation id="7995512525968007366">Ikke angivet</translation> <translation id="7998269595945679889">Knappen Åbn inkognitofane – tryk på Enter for at åbne en ny inkognitofane, så du kan browse privat</translation> <translation id="800218591365569300">Prøv at lukke andre faner eller programmer for at frigøre hukommelse.</translation> +<translation id="8002230960325005199">Se relaterede websites på en ny fane</translation> <translation id="8003046808285812021">"<ph name="SEARCH_TERMS" />"</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8009225694047762179">Administrer adgangskoder</translation> @@ -2773,6 +2777,7 @@ <translation id="8270242299912238708">PDF-dokumenter</translation> <translation id="8275952078857499577">Tilbyd ikke at oversætte dette website</translation> <translation id="8277900682056760511">Regnearket for betalinghandler er åbnet</translation> +<translation id="8279611986089885641">Chrome-notifikationer skal være aktiveret. Du kan aktivere dem i <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">Bakke 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Spring over</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 28f2e76..ea182ad 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Bewegungssensoren</translation> <translation id="1717494416764505390">Ablage 3</translation> <translation id="1718029547804390981">Das Dokument kann aufgrund seiner Größe nicht mit Anmerkungen versehen werden</translation> +<translation id="1719434663396780149">Du wirst über Preisnachlässe informiert. Das lässt sich in den <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> ändern.</translation> <translation id="1720941539803966190">Anleitung schließen</translation> <translation id="1721424275792716183">* Pflichtfeld</translation> <translation id="1725591448053514783">Umschlag You 6</translation> @@ -978,6 +979,7 @@ <translation id="3550112004925580947">Gastgewerbe</translation> <translation id="3552297013052089404">Schriftart Sans-Serif</translation> <translation id="3558573058928565255">Tageszeit</translation> +<translation id="3560824484345057728">Ähnliche Websites ansehen</translation> <translation id="3566021033012934673">Dies ist keine sichere Verbindung</translation> <translation id="3567778190852720481">Registrierung mit Unternehmenskonto nicht möglich (Unternehmenskonto ist nicht berechtigt).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1362,6 +1364,7 @@ <translation id="4542971377163063093">Fach 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Deaktiviere deine Erweiterungen.</translation> +<translation id="4559134504959026834">Diese Website ist einer durch <ph name="SET_OWNER" /> definierten Gruppe zugeordnet, die deine Aktivitäten sehen kann</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Outdoor</translation> <translation id="4567686777917670400">Dein Administrator kann die Browsereinstellungen per Remotezugriff ändern. Aktivitäten auf diesem Gerät können auch außerhalb von Chromium verwaltet werden. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation> @@ -2668,6 +2671,7 @@ <translation id="7995512525968007366">Nicht angegeben</translation> <translation id="7998269595945679889">Schaltfläche „Inkognitotab öffnen“ – drücke die Eingabetaste, um einen neuen Inkognitotab zu öffnen und privat zu surfen</translation> <translation id="800218591365569300">Versuche, andere Tabs oder Programme zu schließen, um Speicher freizugeben.</translation> +<translation id="8002230960325005199">Ähnliche Websites in einem neuen Tab ansehen</translation> <translation id="8003046808285812021">„<ph name="SEARCH_TERMS" />“</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8009225694047762179">Passwort verwalten</translation> @@ -2771,6 +2775,7 @@ <translation id="8270242299912238708">PDF-Dokumente</translation> <translation id="8275952078857499577">Übersetzen dieser Website nicht anbieten</translation> <translation id="8277900682056760511">Das Dokument zur Zahlungsabwicklung ist geöffnet</translation> +<translation id="8279611986089885641">Du musst Chrome-Benachrichtigungen aktivieren. Rufe dazu einfach die <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> auf.</translation> <translation id="8280630997017109758">Fach 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Überspringen</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index e87de99..430b1c0 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Αισθητήρες κίνησης</translation> <translation id="1717494416764505390">Γραμματοκιβώτιο 3</translation> <translation id="1718029547804390981">Το έγγραφο είναι πάρα πολύ μεγάλο για σχολιασμό.</translation> +<translation id="1719434663396780149">Οι ειδοποιήσεις για τις πτώσεις τιμών είναι ενεργοποιημένες. Μπορείτε να αλλάξετε αυτήν την επιλογή στην ενότητα <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Κλείσιμο οδηγού</translation> <translation id="1721424275792716183">* Το πεδίο είναι υποχρεωτικό</translation> <translation id="1725591448053514783">Φάκελος You 6</translation> @@ -980,6 +981,7 @@ <translation id="3550112004925580947">Κλάδος φιλοξενίας</translation> <translation id="3552297013052089404">Γραμματοσειρά Sans-serif</translation> <translation id="3558573058928565255">Ημέρα</translation> +<translation id="3560824484345057728">Εμφάνιση σχετικών ιστοτόπων</translation> <translation id="3566021033012934673">Η σύνδεσή σας δεν είναι ιδιωτική</translation> <translation id="3567778190852720481">Δεν είναι δυνατή η εγγραφή με εταιρικό λογαριασμό (ο εταιρικός λογαριασμός δεν είναι κατάλληλος).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1366,6 +1368,7 @@ <translation id="4542971377163063093">Δίσκος 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Δοκιμάστε να απενεργοποιήσετε τις επεκτάσεις σας.</translation> +<translation id="4559134504959026834">Αυτός ο ιστότοπος ανήκει σε μια ομάδα που καθορίζεται από τον τομέα <ph name="SET_OWNER" />, ο οποίος μπορεί να βλέπει τη δραστηριότητά σας</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Δραστηριότητες σε εξωτερικούς χώρους</translation> <translation id="4567686777917670400">Ο διαχειριστής σας μπορεί να αλλάξει τη ρύθμιση του προγράμματος περιήγησής σας απομακρυσμένα. Η διαχείριση της δραστηριότητας σε αυτήν τη συσκευή μπορεί επίσης να πραγματοποιηθεί εκτός Chromium. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation> @@ -2674,6 +2677,7 @@ <translation id="7995512525968007366">Δεν καθορίστηκε</translation> <translation id="7998269595945679889">Κουμπί για άνοιγμα καρτέλας ανώνυμης περιήγησης, πατήστε Enter για να ανοίξετε μια νέα καρτέλα ανώνυμης περιήγησης για ιδιωτική περιήγηση</translation> <translation id="800218591365569300">Δοκιμάστε να κλείσετε τις άλλες καρτέλες ή τα άλλα προγράμματα για να απελευθερώσετε μνήμη.</translation> +<translation id="8002230960325005199">Δείτε σχετικούς ιστοτόπους σε νέα καρτέλα</translation> <translation id="8003046808285812021">"<ph name="SEARCH_TERMS" />"</translation> <translation id="8004582292198964060">Πρόγραμμα περιήγησης</translation> <translation id="8009225694047762179">Διαχείριση Κωδικός πρόσβασης</translation> @@ -2777,6 +2781,7 @@ <translation id="8270242299912238708">Έγγραφα PDF</translation> <translation id="8275952078857499577">Να μην παρέχεται δυνατότητα μετάφρασης αυτού του ιστοτόπου</translation> <translation id="8277900682056760511">Το φύλλο δείκτη διαχειριστή πληρωμών είναι ανοικτό.</translation> +<translation id="8279611986089885641">Οι ειδοποιήσεις του Chrome πρέπει να είναι ενεργοποιημένες. Μπορείτε να τις ενεργοποιήσετε στην ενότητα <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /></translation> <translation id="8280630997017109758">Τροφοδότης χαρτιού 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Παράβλεψη</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index 2e87590..1d1be4c 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Sensores de movimiento</translation> <translation id="1717494416764505390">Buzón de correo 3</translation> <translation id="1718029547804390981">El documento es demasiado grande para poder añadir anotaciones</translation> +<translation id="1719434663396780149">Las alertas de bajadas de precio están activadas. Puedes cambiar esta opción en <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Cerrar tutorial</translation> <translation id="1721424275792716183">* El campo es obligatorio</translation> <translation id="1725591448053514783">Sobre You 6</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">Hostelería</translation> <translation id="3552297013052089404">Fuente Sans Serif</translation> <translation id="3558573058928565255">Día y hora</translation> +<translation id="3560824484345057728">Ver sitios relacionados</translation> <translation id="3566021033012934673">La conexión no es privada</translation> <translation id="3567778190852720481">No te puedes registrar con la cuenta de empresa (la cuenta de empresa no reúne los requisitos).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">Bandeja 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Inhabilita las extensiones.</translation> +<translation id="4559134504959026834">Este sitio está en un grupo, definido por <ph name="SET_OWNER" />, que puede ver tu actividad</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Exterior</translation> <translation id="4567686777917670400">El administrador puede cambiar la configuración del navegador de forma remota. Es posible que la actividad de este dispositivo también se gestione fuera de Chromium. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> @@ -2670,6 +2673,7 @@ <translation id="7995512525968007366">Sin especificar</translation> <translation id="7998269595945679889">Botón Abrir pestaña de Incógnito, pulsa Intro para abrir una pestaña de Incógnito nueva para navegar de forma privada</translation> <translation id="800218591365569300">Prueba a cerrar otros programas o pestañas para liberar memoria.</translation> +<translation id="8002230960325005199">Ver sitios relacionados en una nueva pestaña</translation> <translation id="8003046808285812021">"<ph name="SEARCH_TERMS" />"</translation> <translation id="8004582292198964060">Navegador</translation> <translation id="8009225694047762179">Gestionar contraseñas</translation> @@ -2773,6 +2777,7 @@ <translation id="8270242299912238708">Documentos PDF</translation> <translation id="8275952078857499577">No ofrecer que se traduzca este sitio web</translation> <translation id="8277900682056760511">La hoja del controlador de pagos está abierta</translation> +<translation id="8279611986089885641">Las notificaciones de Chrome deben estar activadas. Puedes activarlas en <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">Bandeja 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Saltar</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 85076dc..eb3feda 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Liikumisandurid</translation> <translation id="1717494416764505390">Postkast 3</translation> <translation id="1718029547804390981">Dokument on märkuste lisamiseks liiga suur</translation> +<translation id="1719434663396780149">Hinnaalanduse märguanded on sisse lülitatud. Saate seda muuta menüüs <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Sule õpetus</translation> <translation id="1721424275792716183">* Kohustuslik väli</translation> <translation id="1725591448053514783">Ümbrik You 6</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">Võõrustamistööstus</translation> <translation id="3552297013052089404">Seriifideta font</translation> <translation id="3558573058928565255">Päev</translation> +<translation id="3560824484345057728">Kuva seotud vahelehed</translation> <translation id="3566021033012934673">Teie ühendus ei ole privaatne</translation> <translation id="3567778190852720481">Ettevõttekontoga ei saa registreeruda (ettevõttekonto pole sobilik).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">Salv 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Keelake laiendused.</translation> +<translation id="4559134504959026834">See sait on omaniku <ph name="SET_OWNER" /> määratletud grupis, mis näeb teie tegevusi</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Vabaõhutegevused</translation> <translation id="4567686777917670400">Teie administraator saab brauseri seadistust kaugühenduse kaudu muuta. Selle seadme tegevusi võidakse hallata ka väljaspool Chromiumi. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation> @@ -2670,6 +2673,7 @@ <translation id="7995512525968007366">Ei ole määratud</translation> <translation id="7998269595945679889">Inkognito vahelehe avamise nupp, vajutage sisestusklahvi uue inkognito vahelehe avamiseks, et privaatselt sirvida</translation> <translation id="800218591365569300">Sulgege muud vahelehed või programmid, et mälu vabastada.</translation> +<translation id="8002230960325005199">Seotud saitide nägemine uuel vahelehel</translation> <translation id="8003046808285812021">„<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">Brauser</translation> <translation id="8009225694047762179">Halda paroole</translation> @@ -2773,6 +2777,7 @@ <translation id="8270242299912238708">PDF-dokumendid</translation> <translation id="8275952078857499577">Ära paku selle saidi tõlkimist</translation> <translation id="8277900682056760511">Maksetöötleja leht on avatud</translation> +<translation id="8279611986089885641">Chrome'i märguanded peavad olema sisse lülitatud. Saate need sisse lülitada menüüs <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">Salv 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Jäta vahele</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index 9f68800..4878bf4c 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">حسگرهای حرکتی</translation> <translation id="1717494416764505390">صندوق پست ۳</translation> <translation id="1718029547804390981">این سند بسیار بزرگ است و نمیتواند حاشیهنویسی شود</translation> +<translation id="1719434663396780149">هشدارهای کاهش قیمت روشن هستند. میتوانید این گزینه را در <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> تغییر دهید.</translation> <translation id="1720941539803966190">بستن آموزش گامبهگام</translation> <translation id="1721424275792716183">* این فیلد اجباری است</translation> <translation id="1725591448053514783">پاکت یو ۶</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">صنعت مهماننوازی</translation> <translation id="3552297013052089404">قلم سنسریف</translation> <translation id="3558573058928565255">ساعت از روز</translation> +<translation id="3560824484345057728">دیدن سایتهای مرتبط</translation> <translation id="3566021033012934673">اتصال شما خصوصی نیست</translation> <translation id="3567778190852720481">نمیتوان با حساب سازمانی ثبتنام کرد (حساب سازمانی واجد شرایط نیست).</translation> <translation id="3574305903863751447"><ph name="CITY" />، <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">سینی ۶</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">افزونهها را غیرفعال کنید.</translation> +<translation id="4559134504959026834">این سایت در گروهی است که <ph name="SET_OWNER" /> تعریف کرده است و میتواند فعالیت شما را ببیند</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">فعالیتهای فضای باز</translation> <translation id="4567686777917670400">سرپرستتان میتواند تنظیمات مرورگرتان را ازراهدور تغییر دهد. ممکن است فعالیتهای انجامشده در این دستگاه خارج از Chromium هم مدیریت شود. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> @@ -2670,6 +2673,7 @@ <translation id="7995512525968007366">تعیین نشده</translation> <translation id="7998269595945679889">دکمه «باز کردن برگه ناشناس»؛ برای باز کردن «برگه ناشناس» جدید و مرور کردن بهصورت خصوصی، کلید Enter را فشار دهید</translation> <translation id="800218591365569300">سعی کنید برگهها یا برنامههای دیگر را ببندید تا حافظه آزاد شود.</translation> +<translation id="8002230960325005199">دیدن سایتهای مرتبط در برگه جدید</translation> <translation id="8003046808285812021">«<ph name="SEARCH_TERMS" />»</translation> <translation id="8004582292198964060">مرورگر</translation> <translation id="8009225694047762179">مدیریت گذرواژه</translation> @@ -2773,6 +2777,7 @@ <translation id="8270242299912238708">سندهای PDF</translation> <translation id="8275952078857499577">ترجمه این سایت پیشنهاد نشود</translation> <translation id="8277900682056760511">برگ کنترلکننده پرداخت باز است</translation> +<translation id="8279611986089885641">اعلانهای Chrome باید روشن باشد. میتوانید آنها را در <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> روشن کنید.</translation> <translation id="8280630997017109758">سینی ۱۱</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">رد شدن</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index aec7bff..94554ac2 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Mga sensor ng paggalaw</translation> <translation id="1717494416764505390">Mailbox 3</translation> <translation id="1718029547804390981">Masyadong malaki para i-annotate ang dokumento</translation> +<translation id="1719434663396780149">Naka-on ang mga alerto sa pagbaba ng presyo. Puwede mo itong baguhin sa <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Isara ang tutorial</translation> <translation id="1721424275792716183">Kinakailangan ang field na may *</translation> <translation id="1725591448053514783">Envelope You 6</translation> @@ -980,6 +981,7 @@ <translation id="3550112004925580947">Industriya ng hospitality</translation> <translation id="3552297013052089404">Sans-serif Font</translation> <translation id="3558573058928565255">Oras sa umaga</translation> +<translation id="3560824484345057728">Tingnan ang mga kaugnay na site</translation> <translation id="3566021033012934673">Hindi pribado ang iyong koneksyon</translation> <translation id="3567778190852720481">Hindi makapag-enroll gamit ang enterprise account (hindi kwalipikado ang enterprise account).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1365,6 +1367,7 @@ <translation id="4542971377163063093">Tray 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Subukang i-disable ang iyong mga extension.</translation> +<translation id="4559134504959026834">Ang site na ito ay nasa isang grupo, na tinukoy ng <ph name="SET_OWNER" />, na makakakita ng iyong aktibidad</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Sa labas</translation> <translation id="4567686777917670400">Puwedeng baguhin ng iyong administrator ang setup ng browser mo sa remote na paraan. Puwede ring pamahalaan sa labas ng Chromium ang aktibidad sa device na ito. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation> @@ -2671,6 +2674,7 @@ <translation id="7995512525968007366">Hindi Tinukoy</translation> <translation id="7998269595945679889">Button na Magbukas ng tab na Incognito, pindutin ang Enter para magbukas ng bagong tab na Incognito para mag-browse nang pribado</translation> <translation id="800218591365569300">Subukang isara ang iba pang tab o program upang magbakante ng memory.</translation> +<translation id="8002230960325005199">Tingnan ang mga kaugnay na site sa bagong tab</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8009225694047762179">Pamahalaan ang Mga Password</translation> @@ -2774,6 +2778,7 @@ <translation id="8270242299912238708">Mga dokumentong PDF</translation> <translation id="8275952078857499577">Huwag mag-alok na isalin ang site na ito</translation> <translation id="8277900682056760511">Nakabukas ang sheet ng tagapangasiwa ng pagbabayad</translation> +<translation id="8279611986089885641">Dapat naka-on ang mga notification sa Chrome. Puwede mong i-on ang mga ito sa <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">Tray 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Laktawan</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index d77afe2..18091d9 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Sensor gerakan</translation> <translation id="1717494416764505390">Kotak surat 3</translation> <translation id="1718029547804390981">Dokumen terlalu besar untuk dianotasi</translation> +<translation id="1719434663396780149">Notifikasi diskon aktif. Anda dapat mengubahnya di <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Tutup tutorial</translation> <translation id="1721424275792716183">* Kolom wajib diisi</translation> <translation id="1725591448053514783">Envelope You 6</translation> @@ -978,6 +979,7 @@ <translation id="3550112004925580947">Industri pelayanan</translation> <translation id="3552297013052089404">Font Sans Serif</translation> <translation id="3558573058928565255">Siang hari</translation> +<translation id="3560824484345057728">Lihat situs terkait</translation> <translation id="3566021033012934673">Koneksi Anda tidak pribadi</translation> <translation id="3567778190852720481">Tidak dapat mendaftar dengan akun perusahaan (akun perusahaan tidak memenuhi syarat).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1363,6 +1365,7 @@ <translation id="4542971377163063093">Baki 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Coba nonaktifkan ekstensi.</translation> +<translation id="4559134504959026834">Situs ini berada dalam grup, yang ditentukan oleh <ph name="SET_OWNER" />, yang dapat melihat aktivitas Anda</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Luar ruangan</translation> <translation id="4567686777917670400">Administrator dapat mengubah penyiapan browser Anda dari jarak jauh. Aktivitas di perangkat ini mungkin juga dikelola di luar Chromium. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation> @@ -2667,6 +2670,7 @@ <translation id="7995512525968007366">Tidak Ditentukan</translation> <translation id="7998269595945679889">Tombol Buka tab Samaran, tekan Enter untuk membuka tab Samaran baru dan menjelajah secara pribadi</translation> <translation id="800218591365569300">Coba tutup tab atau program lain untuk mengosongkan memori.</translation> +<translation id="8002230960325005199">Lihat situs terkait di tab baru</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8009225694047762179">Kelola Kata sandi</translation> @@ -2770,6 +2774,7 @@ <translation id="8270242299912238708">Dokumen PDF</translation> <translation id="8275952078857499577">Jangan tawarkan penerjemahan situs ini</translation> <translation id="8277900682056760511">Lembar handler pembayaran terbuka</translation> +<translation id="8279611986089885641">Notifikasi Chrome harus aktif. Anda dapat mengaktifkannya di <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">Baki 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Lewati</translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index b4ef4453..9b9fe34d1 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">მოძრაობის სენსორები</translation> <translation id="1717494416764505390">საფოსტო ყუთი 3</translation> <translation id="1718029547804390981">დოკუმენტი ანოტირებისთვის მეტისმეტად დიდია</translation> +<translation id="1719434663396780149">ფასების კლების შესახებ გაფრთხილებები ჩართულია. ამის შეცვლა შეგიძლიათ სექციიდან „<ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />“.</translation> <translation id="1720941539803966190">სახელმძღვანელოს დახურვა</translation> <translation id="1721424275792716183">* ველი აუცილებელია</translation> <translation id="1725591448053514783">კონვერტი You 6</translation> @@ -358,6 +359,7 @@ <translation id="1803351196216024260">შეუძლია თქვენი მიკროფონის გამოყენების თხოვნა</translation> <translation id="1807246157184219062">ნათელი</translation> <translation id="1807528111851433570">საწყისი ფურცელი</translation> +<translation id="181000283860817563">მიადევნეთ თვალი ფასებს რამდენიმე საიტზე</translation> <translation id="1812527064848182527">პეიზაჟი</translation> <translation id="1813414402673211292">დათვალიერების მონაცემების გასუფთავება</translation> <translation id="182139138257690338">ავტომატური ჩამოტვირთვები</translation> @@ -979,6 +981,7 @@ <translation id="3550112004925580947">სტუმართმოყვარეობის ინდუსტრია</translation> <translation id="3552297013052089404">Sans-serif შრიფტი</translation> <translation id="3558573058928565255">დღე</translation> +<translation id="3560824484345057728">დაკავშირებული საიტების ნახვა</translation> <translation id="3566021033012934673">თქვენი კავშირი არ არის პირადი</translation> <translation id="3567778190852720481">კორპორაციული ანგარიშით რეგისტრაცია ვერ ხერხდება (კორპორაციული ანგარიში პირობებთან შეუსაბამოა).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1367,7 @@ <translation id="4542971377163063093">ლანგარი 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">ცადეთ გაფართოებების გათიშვა.</translation> +<translation id="4559134504959026834">ეს საიტი არის <ph name="SET_OWNER" />-ის მიერ განსაზღვრულ ჯგუფში, რომელსაც შეუძლია თქვენი აქტივობის ნახვა</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">ღია ცის ქვეშ</translation> <translation id="4567686777917670400">თქვენს ადმინისტრატორს დისტანციურად შეუძლია ბრაუზერში დაყენებული პარამეტრების შეცვლა. ამ მოწყობილობაზე აქტივობა შეიძლება იმართებოდეს Chromium-ს მიღმაც. <ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /></translation> @@ -2670,6 +2674,7 @@ <translation id="7995512525968007366">არ არის მითითებული</translation> <translation id="7998269595945679889">ახალი ინკოგნიტო ჩანართის გახსნის ღილაკი, ვების კონფიდენციალურად დათვალიერებისთვის ახალი ინკოგნიტო ჩანართის გასახსნელად დააჭირეთ შეყვანის ღილაკს</translation> <translation id="800218591365569300">მეხსიერების გამოსათავისუფლებლად ცადეთ სხვა ჩანართების ან პროგრამების დახურვა.</translation> +<translation id="8002230960325005199">დაკავშირებული საიტების ნახვა ახალ ჩანართში</translation> <translation id="8003046808285812021">„<ph name="SEARCH_TERMS" />“</translation> <translation id="8004582292198964060">ბრაუზერი</translation> <translation id="8009225694047762179">პაროლების მართვა</translation> @@ -2773,6 +2778,7 @@ <translation id="8270242299912238708">PDF დოკუმენტები</translation> <translation id="8275952078857499577">ამ საიტის თარგმნის შემოთავაზების აკრძალვა</translation> <translation id="8277900682056760511">გადახდების დამმუშავებლის გვერდი გახსნილია</translation> +<translation id="8279611986089885641">Chrome-ში შეტყობინებების მიღება ჩართული უნდა იყოს. მათი ჩართვა შეგიძლიათ სექციიდან „<ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />“.</translation> <translation id="8280630997017109758">ლანგარი 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">გამოტოვება</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 9551b65..b329c44 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">움직임 감지 센서</translation> <translation id="1717494416764505390">메일박스 3</translation> <translation id="1718029547804390981">문서가 너무 커서 주석을 달 수 없습니다.</translation> +<translation id="1719434663396780149">가격 인하 알림이 사용 설정되었습니다. <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />에서 설정을 변경할 수 있습니다.</translation> <translation id="1720941539803966190">튜토리얼 닫기</translation> <translation id="1721424275792716183">* 필수 입력란</translation> <translation id="1725591448053514783">봉투 You 6</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">환대 산업</translation> <translation id="3552297013052089404">산세리프 글꼴</translation> <translation id="3558573058928565255">낮</translation> +<translation id="3560824484345057728">관련 사이트 보기</translation> <translation id="3566021033012934673">연결이 비공개로 설정되어 있지 않습니다.</translation> <translation id="3567778190852720481">회사 계정으로는 등록할 수 없습니다(회사 계정을 사용할 수 없음).</translation> <translation id="3574305903863751447"><ph name="COUNTRY" /> <ph name="STATE" />, <ph name="CITY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">트레이 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">확장 프로그램 사용 중지해 보기</translation> +<translation id="4559134504959026834"><ph name="SET_OWNER" />에서 정의한 그룹(내 활동을 볼 수 있음)에 속하는 사이트입니다</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">야외 활동</translation> <translation id="4567686777917670400">관리자가 원격으로 브라우저 설정을 변경할 수 있습니다. 이 기기의 활동은 Chromium 외부에서도 관리할 수 있습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> @@ -2669,6 +2672,7 @@ <translation id="7995512525968007366">지정되지 않음</translation> <translation id="7998269595945679889">시크릿 탭 열기 버튼, 새 시크릿 탭을 열어 비공개로 탐색하려면 Enter 누르기</translation> <translation id="800218591365569300">다른 탭이나 프로그램을 종료하여 메모리를 확보하세요.</translation> +<translation id="8002230960325005199">새 탭에서 관련 사이트 보기</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">브라우저</translation> <translation id="8009225694047762179">비밀번호 관리</translation> @@ -2772,6 +2776,7 @@ <translation id="8270242299912238708">PDF 문서</translation> <translation id="8275952078857499577">이 사이트 번역 옵션을 제공하지 않음</translation> <translation id="8277900682056760511">결제 핸들러 시트가 열림</translation> +<translation id="8279611986089885641">Chrome 알림이 사용 설정되어 있어야 합니다. <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />에서 사용 설정할 수 있습니다.</translation> <translation id="8280630997017109758">트레이 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">건너뛰기</translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index f401c01..b48186c 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -359,6 +359,7 @@ <translation id="1803351196216024260">Може да прашува за да го користи микрофонот</translation> <translation id="1807246157184219062">Светла</translation> <translation id="1807528111851433570">Почетен лист</translation> +<translation id="181000283860817563">Следете ги цените на повеќе сајтови</translation> <translation id="1812527064848182527">пејзаж</translation> <translation id="1813414402673211292">Исчисти податоци од прелистување</translation> <translation id="182139138257690338">автоматски преземања</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index 56f4c5d4..d224543 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Хөдөлгөөн мэдрэгч</translation> <translation id="1717494416764505390">Шуудангийн хайрцаг 3</translation> <translation id="1718029547804390981">Документ дээр тэмдэглэгээ хийхэд хэт том байна</translation> +<translation id="1719434663396780149">Үнэ хямдарсан талаарх сэрэмжлүүлэг асаалттай байна. Та үүнийг <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />-д өөрчлөх боломжтой.</translation> <translation id="1720941539803966190">Практик хичээлийг хаах</translation> <translation id="1721424275792716183">* Талбарыг бөглөх шаардлагатай</translation> <translation id="1725591448053514783">Юү дугтуй 6</translation> @@ -980,6 +981,7 @@ <translation id="3550112004925580947">Зочлох үйлчилгээний салбар</translation> <translation id="3552297013052089404">Санс-сериф фонт</translation> <translation id="3558573058928565255">Өдөр цаг</translation> +<translation id="3560824484345057728">Холбоотой сайтуудыг харах</translation> <translation id="3566021033012934673">Таны холболт хаалттай бус байна</translation> <translation id="3567778190852720481">Аж ахуйн нэгжийн бүртгэлээр бүртгүүлэх боломжгүй (аж ахуйн нэгжийн бүртгэл эрхгүй байна).</translation> <translation id="3574305903863751447"><ph name="CITY" /> , <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1365,6 +1367,7 @@ <translation id="4542971377163063093">Гарах цаасны тавиур 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Өргөтгөлүүдээ идэвхгүй болгоно уу.</translation> +<translation id="4559134504959026834">Энэ сайт <ph name="SET_OWNER" />-с тодорхойлсон бүлэгт байгаа бөгөөд таны үйл ажиллагааг харах боломжтой</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Гадаа</translation> <translation id="4567686777917670400">Таны администратор хөтчийн тань тохируулгыг алсаас өөрчилж болно. Энэ төхөөрөмж дээрх үйл ажиллагааг мөн Chromium-с гадуур удирддаг байж болно. <ph name="BEGIN_LINK" />Нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation> @@ -2670,6 +2673,7 @@ <translation id="7995512525968007366">Зааж өгөөгүй</translation> <translation id="7998269595945679889">Нууцлалтай табыг нээх товчлуур, нууцлалтайгаар үзэхийн тулд шинэ Нууцлалтай табыг Enter дээр дарж нээнэ үү</translation> <translation id="800218591365569300">Санах ойн багтаамжийг нэмэгдүүлэхийн тулд бусад таб, эсвэл программыг хаана уу.</translation> +<translation id="8002230960325005199">Холбоотой сайтуудыг шинэ табд харна уу</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">Хөтөч</translation> <translation id="8009225694047762179">Нууц үгийг удирдах</translation> @@ -2773,6 +2777,7 @@ <translation id="8270242299912238708">PDF документ</translation> <translation id="8275952078857499577">Энэ сайтыг орчуулахыг бүү санал болго</translation> <translation id="8277900682056760511">Төлбөр хариуцагчийн хүснэгт нээлттэй байна</translation> +<translation id="8279611986089885641">Chrome-н мэдэгдэл асаалттай байх ёстой. Та тэдгээрийг <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />-д асаах боломжтой.</translation> <translation id="8280630997017109758">Тавиур 11</translation> <translation id="8281084378435768645">Том-Зураг</translation> <translation id="8281886186245836920">Алгасах</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 56536a3..9a1a1e4 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">मोशन सेन्सर</translation> <translation id="1717494416764505390">मेलबॉक्स ३</translation> <translation id="1718029547804390981">भाष्य करण्यासाठी दस्तऐवज खूपच मोठे आहे</translation> +<translation id="1719434663396780149">किमतीतील घट याच्याशी संबंधित सूचना सुरू आहेत. तुम्ही या <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> मध्ये हे बदलू शकता.</translation> <translation id="1720941539803966190">ट्यूटोरियल बंद करा</translation> <translation id="1721424275792716183">* फील्ड आवश्यक आहे</translation> <translation id="1725591448053514783">एन्व्हलप यू ६</translation> @@ -978,6 +979,7 @@ <translation id="3550112004925580947">आदरातिथ्याशी संबंधित उद्योग</translation> <translation id="3552297013052089404">Sans-Serif फॉंट</translation> <translation id="3558573058928565255">दिवसापर्यंत</translation> +<translation id="3560824484345057728">संबंधित साइट पहा</translation> <translation id="3566021033012934673">तुमचे कनेक्शन खाजगी नाही</translation> <translation id="3567778190852720481">एंटरप्राइझ खात्यासोबत नोंदणी करू शकत नाही (एंटरप्राइझ खाते पात्र नाही).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1363,6 +1365,7 @@ <translation id="4542971377163063093">ट्रे ६</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">तुमचे विस्तार अक्षम करून पहा.</translation> +<translation id="4559134504959026834">ही साइट <ph name="SET_OWNER" /> द्वारे परिभाषित केलेल्या गटामध्ये आहे, जी तुमच्या अॅक्टिव्हिटी पाहू शकते</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">आउटडोअर फिटनेस ॲक्टिव्हिटी</translation> <translation id="4567686777917670400">तुमचा अॅडमिनिस्ट्रेटर तुमच्या ब्राउझरचा सेटअप रिमोट पद्धतीने बदलू शकतो. या डिव्हाइसवरील अॅक्टिव्हिटी Chromium च्या बाहेरदेखील व्यवस्थापित केली जाऊ शकते. <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> @@ -2670,6 +2673,7 @@ <translation id="7995512525968007366">नमूद केलेले नाही</translation> <translation id="7998269595945679889">गुप्त टॅब उघडा बटण, खाजगीरीत्या ब्राउझ करण्यासाठी नवीन गुप्त टॅब उघडण्याकरिता एंटर दाबा</translation> <translation id="800218591365569300">मेमरी मोकळी करण्यासाठी अन्य टॅब किंवा प्रोग्राम बंद करून पहा.</translation> +<translation id="8002230960325005199">नवीन टॅबमध्ये संबंधित साइट पहा</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">ब्राउझर</translation> <translation id="8009225694047762179">पासवर्ड व्यवस्थापित करा</translation> @@ -2773,6 +2777,7 @@ <translation id="8270242299912238708">पीडीएफ दस्तऐवज</translation> <translation id="8275952078857499577">या साइटचे भाषांतर करणे ऑफर करू नका</translation> <translation id="8277900682056760511">पेमेंट हँडलर शीट उघडलेले आहे</translation> +<translation id="8279611986089885641">Chrome सूचना सुरू असणे आवश्यक आहे. तुम्ही त्या <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> मध्ये सुरू करू शकता.</translation> <translation id="8280630997017109758">ट्रे ११</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">वगळा</translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index ad5ee54..3e8c83a9 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">လှုပ်ရှားမှု အာရုံခံစနစ်များ</translation> <translation id="1717494416764505390">စာတိုက်ပုံး ၃</translation> <translation id="1718029547804390981">မှတ်တမ်းဖိုင်သည် မှတ်ချက်ပေးရန်အတွက် အလွန်ကြီးနေပါသည်</translation> +<translation id="1719434663396780149">ကျစျေး သတိပေးချက် ဖွင့်ထားသည်။ ၎င်းကို <ph name="BEGIN_LINK" /> <ph name="NOTIFICATION_SETTINGS" /> <ph name="END_LINK" />တွင် ပြောင်းနိုင်သည်။</translation> <translation id="1720941539803966190">ရှင်းလင်းပို့ချချက်ကို ပိတ်ရန်</translation> <translation id="1721424275792716183">* ပြထားသော အကွက်ကို ဖြည့်ရန်လိုသည်</translation> <translation id="1725591448053514783">You 6 စာအိတ်</translation> @@ -980,6 +981,7 @@ <translation id="3550112004925580947">ဧည့်ဝတ်ပြုခြင်းဆိုင်ရာ လုပ်ငန်း</translation> <translation id="3552297013052089404">Sans-serif ဖောင့်</translation> <translation id="3558573058928565255">နေ့အချိန်</translation> +<translation id="3560824484345057728">ဆက်စပ်ဝဘ်ဆိုက်များ ကြည့်ရန်</translation> <translation id="3566021033012934673">သင်၏ ချိတ်ဆက်မှုမှာ ကိုယ်ပိုင် မဟုတ်ပါ</translation> <translation id="3567778190852720481">လုပ်ငန်းသုံး အကောင့်ဖြင့် စာရင်းသွင်း၍ မရပါ (လုပ်ငန်းသုံး အကောင့်က အကျုံးမဝင်ပါ)။</translation> <translation id="3574305903863751447"><ph name="CITY" />၊ <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1365,6 +1367,7 @@ <translation id="4542971377163063093">ဗန်း ၆</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">သင့် နောက်ဆက်တွဲများကို ဖြုတ်ကြည့်ပါ။</translation> +<translation id="4559134504959026834">သင့်လှုပ်ရှားမှုကို မြင်နေနိုင်သော <ph name="SET_OWNER" /> က သတ်မှတ်သည့် အုပ်စုတွင် ဤဝဘ်ဆိုက် ပါဝင်သည်</translation> <translation id="4559332380232738994">၁၀x၁၁</translation> <translation id="4566017918361049074">ပြင်ပလှုပ်ရှားမှုများ</translation> <translation id="4567686777917670400">သင့်စီမံခန့်ခွဲသူက သင်၏ဘရောင်ဇာ စနစ်ထည့်သွင်းမှုကို အဝေးမှ ပြောင်းလဲနိုင်ပါသည်။ ဤစက်ပေါ်ရှိ လုပ်ဆောင်ချက်ကိုလည်း Chromium ပြင်ပမှ စီမံခန့်ခွဲထားနိုင်သည်။ <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> @@ -2672,6 +2675,7 @@ <translation id="7995512525968007366">သတ်မှတ်မထားပါ</translation> <translation id="7998269595945679889">ရုပ်ဖျက်တဘ်ခလုတ်ကို ဖွင့်ပါ။ ရုပ်ဖျက်တဘ်အသစ်တစ်ခုဖြင့် သီးသန့်ကြည့်ရှုနိုင်ရန် Enter ခလုတ်နှိပ်ပါ</translation> <translation id="800218591365569300">မှတ်ဉာဏ်နေရာလွတ်ရရှိစေရန် တဘ် သို့မဟုတ် ပရိုဂရမ်များကို ပိတ်ကြည့်ပါ။</translation> +<translation id="8002230960325005199">ဆက်စပ်ဝဘ်ဆိုက်များကို တဘ်အသစ်တွင် ကြည့်ရန်</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">ဘရောင်ဇာ</translation> <translation id="8009225694047762179">စကားဝှက်များကို စီမံခြင်း</translation> @@ -2775,6 +2779,7 @@ <translation id="8270242299912238708">PDF ဖိုင်များ</translation> <translation id="8275952078857499577">ဤဝဘ်ဆိုက်ကို ပြန်ဆိုရန် မကမ်းလှမ်းပါနှင့်</translation> <translation id="8277900682056760511">ငွေပေးချေမှု ကိုင်တွယ်သည့်စနစ်စာမျက်နှာကို ဖွင့်ထားသည်</translation> +<translation id="8279611986089885641">Chrome အကြောင်းကြားချက်ကို ဖွင့်ထားရမည်။ ၎င်းတို့ကို <ph name="BEGIN_LINK" /> <ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> တွင် ဖွင့်နိုင်သည်။</translation> <translation id="8280630997017109758">ဗန်း ၁၁</translation> <translation id="8281084378435768645">ဓာတ်ပုံ အကြီး</translation> <translation id="8281886186245836920">ကျော်ရန်</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index 4e600f1..ac173ebcd 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -2400,7 +2400,7 @@ <translation id="7346048084945669753">सम्बद्ध प्रयोगकर्ता हो कि होइन:</translation> <translation id="7349430561505560861">A4-Extra</translation> <translation id="7349921148288539306">तपाईंले यो ट्याब बन्द नगरुन्जेल अनुमति दिइन्छ</translation> -<translation id="7352651011704765696">केही गल्ती भयो</translation> +<translation id="7352651011704765696">कुनै त्रुटि भयो</translation> <translation id="7353601530677266744">आदेश रेखा</translation> <translation id="7354880545102894991">सस्ता र अन्तिम समयमा उपलब्ध यात्रासम्बन्धी अफरहरू</translation> <translation id="7359588939039777303">विज्ञापनहरूमाथि रोक लगाइयो।</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index c909173..87d7b6e 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Bevegelsessensorer</translation> <translation id="1717494416764505390">Postkasse 3</translation> <translation id="1718029547804390981">Dokumentet er for stort til å annoteres</translation> +<translation id="1719434663396780149">Varsler om avslag er på. Du kan endre dette i <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Lukk veiledningen</translation> <translation id="1721424275792716183">* Feltet er obligatorisk</translation> <translation id="1725591448053514783">You 6-konvolutt</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">Gjestfrihetsbransjen</translation> <translation id="3552297013052089404">Sans-serif-skrifttype</translation> <translation id="3558573058928565255">Dagtid</translation> +<translation id="3560824484345057728">Se relaterte nettsteder</translation> <translation id="3566021033012934673">Tilkoblingen din er ikke privat</translation> <translation id="3567778190852720481">Kan ikke registrere med bedriftskontoen (bedriftskontoen er ikke kvalifisert).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" />, <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">Skuff 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Prøv å slå av utvidelsene dine.</translation> +<translation id="4559134504959026834">Dette nettstedet er med i en gruppe som er definert av <ph name="SET_OWNER" /> og kan se aktiviteten din</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Utendørs</translation> <translation id="4567686777917670400">Administratoren kan endre nettleseroppsettet eksternt. Aktiviteten på denne enheten kan også administreres utenfor Chromium. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation> @@ -2669,6 +2672,7 @@ <translation id="7995512525968007366">Ikke spesifisert</translation> <translation id="7998269595945679889">Knappen «Åpne en inkognitofane» – trykk på Enter for å åpne en ny inkognitofane for privat surfing</translation> <translation id="800218591365569300">Prøv å lukke andre faner eller programmer for å frigjøre minne.</translation> +<translation id="8002230960325005199">Se relaterte nettsteder på en ny fane</translation> <translation id="8003046808285812021">«<ph name="SEARCH_TERMS" />»</translation> <translation id="8004582292198964060">Nettleser</translation> <translation id="8009225694047762179">Administrer passord</translation> @@ -2772,6 +2776,7 @@ <translation id="8270242299912238708">PDF-dokumenter</translation> <translation id="8275952078857499577">Ikke tilby å oversette dette nettstedet</translation> <translation id="8277900682056760511">Arket for betalingsbehandling er åpnet</translation> +<translation id="8279611986089885641">Chrome-varsler må være på. Du kan slå dem på i <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">Skuff 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Hopp over</translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index ec6e2999..ccad370 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -2396,7 +2396,7 @@ <translation id="7346048084945669753">ਸੰਬੰਧਿਤ ਹੈ:</translation> <translation id="7349430561505560861">A4-ਵਾਧੂ</translation> <translation id="7349921148288539306">ਉਦੋਂ ਤੱਕ ਇਜਾਜ਼ਤ ਹੈ ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ ਇਸ ਟੈਬ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕਰਦੇ</translation> -<translation id="7352651011704765696">ਕੁਝ ਗ਼ਲਤ ਹੋਇਆ ਸੀ</translation> +<translation id="7352651011704765696">ਕੋਈ ਗੜਬੜ ਹੋ ਗਈ</translation> <translation id="7353601530677266744">ਕਮਾਂਡ ਲਾਈਨ</translation> <translation id="7354880545102894991">ਘੱਟ ਲਾਗਤ ਵਾਲੀਆਂ ਅਤੇ ਆਖਰੀ ਮਿੰਟ ਦੀਆਂ ਯਾਤਰਾ ਸੰਬੰਧੀ ਡੀਲਾਂ</translation> <translation id="7359588939039777303">ਵਿਗਿਆਪਨ ਬਲੌਕ ਕੀਤੇ ਗਏ।</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index 8dd1e4d..45da6c4 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Senzori de mișcare</translation> <translation id="1717494416764505390">Căsuța de e-mail 3</translation> <translation id="1718029547804390981">Documentul este prea mare pentru a face adnotări</translation> +<translation id="1719434663396780149">Alertele privind scăderea prețurilor sunt activate. Poți modifica opțiunea în <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Închide tutorialul</translation> <translation id="1721424275792716183">* Câmp obligatoriu</translation> <translation id="1725591448053514783">Plic personal 6</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">Industria ospitalității</translation> <translation id="3552297013052089404">Font Sans Serif</translation> <translation id="3558573058928565255">În timpul zilei</translation> +<translation id="3560824484345057728">Vezi site-urile conexe</translation> <translation id="3566021033012934673">Conexiunea nu este privată</translation> <translation id="3567778190852720481">Nu te poți înregistra folosind contul de companie (contul de companie nu este eligibil).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">Tava 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Dezactivează extensiile.</translation> +<translation id="4559134504959026834">Site-ul face parte dintr-un grup, definit de <ph name="SET_OWNER" />, care îți poate vedea activitatea</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">În aer liber</translation> <translation id="4567686777917670400">Administratorul poate schimba configurația browserului de la distanță. Este posibil ca activitatea de pe acest dispozitiv să fie gestionată și din afara Chromium. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation> @@ -2670,6 +2673,7 @@ <translation id="7995512525968007366">Nespecificată</translation> <translation id="7998269595945679889">Butonul Deschide o filă incognito, apasă pe Enter pentru a deschide o filă incognito ca să navighezi în privat</translation> <translation id="800218591365569300">Încearcă să închizi celelalte file sau programe pentru a elibera memoria.</translation> +<translation id="8002230960325005199">Vezi site-urile conexe într-o filă nouă</translation> <translation id="8003046808285812021">„<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">Browser</translation> <translation id="8009225694047762179">Gestionează parolele</translation> @@ -2773,6 +2777,7 @@ <translation id="8270242299912238708">Documente PDF</translation> <translation id="8275952078857499577">Nu oferi traducerea acestui site</translation> <translation id="8277900682056760511">Foaia handlerului pentru plăți este deschisă</translation> +<translation id="8279611986089885641">Notificările Chrome trebuie să fie activate. Le poți activa în <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">Tava 11</translation> <translation id="8281084378435768645">Fotografie-Mare</translation> <translation id="8281886186245836920">Omite</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index c039663..2f6fc87e2 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -358,6 +358,7 @@ <translation id="1803351196216024260">ඔබගේ මයික්රෆෝනය භාවිත කිරීමට ඉල්ලිය හැකිය</translation> <translation id="1807246157184219062">එළිය</translation> <translation id="1807528111851433570">ආරම්භක පත්රය</translation> +<translation id="181000283860817563">විවිධ වෙබ් අඩවිය හරහා මිල ගණන් නිරීක්ෂණ කරන්න</translation> <translation id="1812527064848182527">භූ දර්ශනය</translation> <translation id="1813414402673211292">බ්රවුස් කිරීමේ දත්ත හිස් කරන්නෙ</translation> <translation id="182139138257690338">ස්වයංක්රීය බාගැනීම්</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index e347c45c..16c172e 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Senzori pokreta</translation> <translation id="1717494416764505390">3. poštansko sanduče</translation> <translation id="1718029547804390981">Dokument je isuviše veliki da biste mu dodali napomene</translation> +<translation id="1719434663396780149">Obaveštenja o sniženjima su uključena. Ovo možete da promenite u odeljku <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Zatvorite vodič</translation> <translation id="1721424275792716183">* Polje je obavezno</translation> <translation id="1725591448053514783">Koverta You 6</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">Ugostiteljstvo</translation> <translation id="3552297013052089404">Font Sans Serif</translation> <translation id="3558573058928565255">Vreme dana</translation> +<translation id="3560824484345057728">Prikaži srodne sajtove</translation> <translation id="3566021033012934673">Veza nije privatna</translation> <translation id="3567778190852720481">Ne možete da se registrujete sa nalogom preduzeća (nalog preduzeća ne ispunjava uslove).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">6. fioka</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Pokušajte da onemogućite dodatke.</translation> +<translation id="4559134504959026834">Ovaj sajt je u grupi, koju definiše <ph name="SET_OWNER" />, koji može da vidi vaše aktivnosti</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Rekreacija na otvorenom</translation> <translation id="4567686777917670400">Administrator može daljinski da promeni podešavanje pregledača. Aktivnostima na ovom uređaju može da se upravlja i van Chromium-a. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation> @@ -2669,6 +2672,7 @@ <translation id="7995512525968007366">Nije navedeno</translation> <translation id="7998269595945679889">Pritisnite dugme Otvori karticu bez arhiviranja, pa Enter da biste otvorili novu karticu bez arhiviranja i pregledali privatno</translation> <translation id="800218591365569300">Probajte da zatvorite druge kartice ili programe da biste oslobodili memoriju.</translation> +<translation id="8002230960325005199">Pogledajte srodne sajtove na novoj kartici</translation> <translation id="8003046808285812021">„<ph name="SEARCH_TERMS" />“</translation> <translation id="8004582292198964060">Pregledač</translation> <translation id="8009225694047762179">Upravljaj lozinkama</translation> @@ -2772,6 +2776,7 @@ <translation id="8270242299912238708">PDF dokumenti</translation> <translation id="8275952078857499577">Ne nudi prevod ovog sajta</translation> <translation id="8277900682056760511">Stranica obrađivača plaćanja je otvorena</translation> +<translation id="8279611986089885641">Chrome obaveštenja moraju da budu uključena. Možete da ih uključite u odeljku <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">11. fioka</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Preskoči</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 87bf5ba8..582ed6be 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Сензори покрета</translation> <translation id="1717494416764505390">3. поштанско сандуче</translation> <translation id="1718029547804390981">Документ је исувише велики да бисте му додали напомене</translation> +<translation id="1719434663396780149">Обавештења о снижењима су укључена. Ово можете да промените у одељку <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Затворите водич</translation> <translation id="1721424275792716183">* Поље је обавезно</translation> <translation id="1725591448053514783">Коверта You 6</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">Угоститељство</translation> <translation id="3552297013052089404">Фонт Sans Serif</translation> <translation id="3558573058928565255">Време дана</translation> +<translation id="3560824484345057728">Прикажи сродне сајтове</translation> <translation id="3566021033012934673">Веза није приватна</translation> <translation id="3567778190852720481">Не можете да се региструјете са налогом предузећа (налог предузећа не испуњава услове).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">6. фиока</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Покушајте да онемогућите додатке.</translation> +<translation id="4559134504959026834">Овај сајт је у групи, коју дефинише <ph name="SET_OWNER" />, који може да види ваше активности</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Рекреација на отвореном</translation> <translation id="4567686777917670400">Администратор може даљински да промени подешавање прегледача. Активностима на овом уређају може да се управља и ван Chromium-а. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation> @@ -2669,6 +2672,7 @@ <translation id="7995512525968007366">Није наведено</translation> <translation id="7998269595945679889">Притисните дугме Отвори картицу без архивирања, па Enter да бисте отворили нову картицу без архивирања и прегледали приватно</translation> <translation id="800218591365569300">Пробајте да затворите друге картице или програме да бисте ослободили меморију.</translation> +<translation id="8002230960325005199">Погледајте сродне сајтове на новој картици</translation> <translation id="8003046808285812021">„<ph name="SEARCH_TERMS" />“</translation> <translation id="8004582292198964060">Прегледач</translation> <translation id="8009225694047762179">Управљај лозинкама</translation> @@ -2772,6 +2776,7 @@ <translation id="8270242299912238708">PDF документи</translation> <translation id="8275952078857499577">Не нуди превод овог сајта</translation> <translation id="8277900682056760511">Страница обрађивача плаћања је отворена</translation> +<translation id="8279611986089885641">Chrome обавештења морају да буду укључена. Можете да их укључите у одељку <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">11. фиока</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Прескочи</translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 008e08e..3150c6c1 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -319,6 +319,7 @@ <translation id="1717218214683051432">Harakat sensorlari</translation> <translation id="1717494416764505390">Pochta qutisi 3</translation> <translation id="1718029547804390981">Hujjat juda kattaligi uchun izohlanmaydi</translation> +<translation id="1719434663396780149">Narxi tushishi haqidagi bildirishnomalar yoniq. Bu parametrni <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> orqali oʻzgartira olasiz.</translation> <translation id="1720941539803966190">Qoʻllanmani yopish</translation> <translation id="1721424275792716183">* Bu maydoncha kiritilishi shart</translation> <translation id="1725591448053514783">Envelope You 6</translation> @@ -975,6 +976,7 @@ <translation id="3550112004925580947">Turizm sohasi</translation> <translation id="3552297013052089404">Sans-serif shrifti</translation> <translation id="3558573058928565255">Kunduzi</translation> +<translation id="3560824484345057728">Aloqador saytlarni ochish</translation> <translation id="3566021033012934673">Ulanishingiz himoyalanmagan</translation> <translation id="3567778190852720481">Korporativ hisob orqali yozilish imkonsiz (korporativ hisoblarda ishlamaydi).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1359,6 +1361,7 @@ <translation id="4542971377163063093">Tarnov 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Brauzer kengaytmalarini o‘chirib qo‘yib, keyin tekshirib ko‘ring.</translation> +<translation id="4559134504959026834">Bu sayt <ph name="SET_OWNER" />ning guruhiga kiradi va u guruhdagi faoliyatni koʻra oladi</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Ochiq havoda</translation> <translation id="4567686777917670400">Adminitratoringiz brauzerni masofadan sozlashi mumkin. Bu qurilmadagi amallar Chromium tashqarisidan boshqarilishi mumkin. <ph name="BEGIN_LINK" />Batafsil<ph name="END_LINK" /></translation> @@ -2664,6 +2667,7 @@ <translation id="7995512525968007366">Ko‘rsatilmagan</translation> <translation id="7998269595945679889">Inkognito varaq ochish tugmasi, yangi Inkognito varaqni ochish va Internetdan maxfiy foydalanish uchun Enter tugmasini bosing</translation> <translation id="800218591365569300">Xotirani bo‘shatish uchun boshqa oyna va dasturlarni yopib ko‘ring</translation> +<translation id="8002230960325005199">Aloqador saytlarni yangi varaqda ochish</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">Brauzer</translation> <translation id="8009225694047762179">Parollarni boshqarish</translation> @@ -2767,6 +2771,7 @@ <translation id="8270242299912238708">PDF hujjatlar</translation> <translation id="8275952078857499577">Bu saytni tarjima qilish taklif qilinmasin</translation> <translation id="8277900682056760511">Toʻlovlarni qayta ishlash vositasi ochildi</translation> +<translation id="8279611986089885641">Chrome bildirishnomalari yoniq boʻlishi kerak. Ularni <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" /> orqali yoqishingiz mumkin</translation> <translation id="8280630997017109758">Tarnov 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Tashlab ketish</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index c91bee74..c4a41a3f 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -320,6 +320,7 @@ <translation id="1717218214683051432">Cảm biến chuyển động</translation> <translation id="1717494416764505390">Hộp thư 3</translation> <translation id="1718029547804390981">Tài liệu quá lớn nên không thể chú thích được</translation> +<translation id="1719434663396780149">Thông báo giảm giá đang bật. Bạn có thể thay đổi chế độ này trong <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="1720941539803966190">Đóng hướng dẫn</translation> <translation id="1721424275792716183">Trường * là bắt buộc</translation> <translation id="1725591448053514783">Phong bì You 6</translation> @@ -979,6 +980,7 @@ <translation id="3550112004925580947">Ngành du lịch – khách sạn – nhà hàng</translation> <translation id="3552297013052089404">Phông chữ Sans-serif</translation> <translation id="3558573058928565255">Giờ ban ngày</translation> +<translation id="3560824484345057728">Xem các trang web liên quan</translation> <translation id="3566021033012934673">Kết nối của bạn không phải là kết nối riêng tư</translation> <translation id="3567778190852720481">Không thể đăng ký bằng tài khoản doanh nghiệp (tài khoản doanh nghiệp không đủ điều kiện).</translation> <translation id="3574305903863751447"><ph name="CITY" />, <ph name="STATE" /> <ph name="COUNTRY" /></translation> @@ -1364,6 +1366,7 @@ <translation id="4542971377163063093">Khay 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">Thử tắt tiện ích.</translation> +<translation id="4559134504959026834">Trang web này nằm trong nhóm do <ph name="SET_OWNER" /> xác định và người này có thể xem hoạt động của bạn</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">Ngoài trời</translation> <translation id="4567686777917670400">Quản trị viên có thể thay đổi quy trình thiết lập trình duyệt của bạn từ xa. Hoạt động trên thiết bị này cũng có thể được quản lý bên ngoài Chromium. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation> @@ -2670,6 +2673,7 @@ <translation id="7995512525968007366">Không chỉ định</translation> <translation id="7998269595945679889">Mở nút thẻ ẩn danh rồi nhấn Enter để mở một thẻ ẩn danh mới nhằm duyệt web ở chế độ riêng tư</translation> <translation id="800218591365569300">Thử đóng các thẻ hoặc chương trình khác để giải phóng bộ nhớ.</translation> +<translation id="8002230960325005199">Xem các trang web liên quan trong thẻ mới</translation> <translation id="8003046808285812021">“<ph name="SEARCH_TERMS" />”</translation> <translation id="8004582292198964060">Trình duyệt</translation> <translation id="8009225694047762179">Quản lý mật khẩu</translation> @@ -2773,6 +2777,7 @@ <translation id="8270242299912238708">Tài liệu PDF</translation> <translation id="8275952078857499577">Không đề xuất dịch trang web này</translation> <translation id="8277900682056760511">Trang tính trình xử lý thanh toán đang mở</translation> +<translation id="8279611986089885641">Bạn phải bật thông báo của Chrome. Bạn có thể bật các thông báo này trong <ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />.</translation> <translation id="8280630997017109758">Khay 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">Bỏ qua</translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index 66d89ea..ebbedfc 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -320,7 +320,7 @@ <translation id="1717218214683051432">動作感應器</translation> <translation id="1717494416764505390">出紙槽 3</translation> <translation id="1718029547804390981">文件過大,無法加入註釋</translation> -<translation id="1719434663396780149">降價快訊已開啟。你可以前往<ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />進行變更。</translation> +<translation id="1719434663396780149">減價通知已開啟。您可前往<ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />變更。</translation> <translation id="1720941539803966190">閂教學課程</translation> <translation id="1721424275792716183">* 為必填欄位</translation> <translation id="1725591448053514783">You 6 信封</translation> @@ -1365,7 +1365,7 @@ <translation id="4542971377163063093">紙匣 6</translation> <translation id="455113658016510503">A9</translation> <translation id="4558551763791394412">嘗試停用擴充程式。</translation> -<translation id="4559134504959026834">這個網站屬於由 <ph name="SET_OWNER" /> 定義的群組,因此可以查看你的活動</translation> +<translation id="4559134504959026834">此網站屬於由 <ph name="SET_OWNER" /> 定義的群組,因此可查看您的活動</translation> <translation id="4559332380232738994">10x11</translation> <translation id="4566017918361049074">戶外活動</translation> <translation id="4567686777917670400">您的管理員可遠端變更瀏覽器設定。此裝置上的活動也可透過 Chromium 以外的服務管理。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation> @@ -2776,7 +2776,7 @@ <translation id="8270242299912238708">PDF 文件</translation> <translation id="8275952078857499577">不要詢問是否翻譯此網站</translation> <translation id="8277900682056760511">付款處理常式工作表開咗</translation> -<translation id="8279611986089885641">請務必開啟 Chrome 通知,你可以前往<ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />進行變更。</translation> +<translation id="8279611986089885641">必須開啟 Chrome 通知。您可在<ph name="BEGIN_LINK" /><ph name="NOTIFICATION_SETTINGS" /><ph name="END_LINK" />開啟</translation> <translation id="8280630997017109758">紙匣 11</translation> <translation id="8281084378435768645">Large-Photo</translation> <translation id="8281886186245836920">略過</translation>
diff --git a/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out b/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out index a879f8e..1261b49 100644 --- a/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out +++ b/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out
@@ -27,10 +27,10 @@ UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_action | Gift Card Action | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_issuer_person | Gift Card Issuer (person) | 588 | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_appeasement_amt | Gift Card Appeasement $ Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 -UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_amount_new | Gift Card Amount (new) Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 +NUMERIC_QUANTITY | Incident.CustomFields.c.gift_card_amount_new | Gift Card Amount (new) Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_new_card | Gift Card - New Card # Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_box_number | Gift Card Box # Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 -UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_frozen_amount | Gift Card Amount (frozen) Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 +NUMERIC_QUANTITY | Incident.CustomFields.c.gift_card_frozen_amount | Gift Card Amount (frozen) Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_frozen_card_number | Gift Card Frozen Card # Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_issuing_location | Gift Card Issuing Location Optional Optional | | Incident.CustomFields.c.escalated_gift_card_devalue_1 UNKNOWN_TYPE | Incident.CustomFields.c.chat_type | Chat Topic Please select the Chat topic that best fits the issue | | Incident.CustomFields.c.escalated_gift_card_devalue_1
diff --git a/components/test/data/autofill/heuristics/test_files.gni b/components/test/data/autofill/heuristics/test_files.gni new file mode 100644 index 0000000..8f0b5c6 --- /dev/null +++ b/components/test/data/autofill/heuristics/test_files.gni
@@ -0,0 +1,368 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# List of all test files for inclusion in ios/chrome/browser/autofill/BUILD.gn +# for form_structure_browsertest.mm. +autofill_test_files = [ + "//components/test/data/autofill/heuristics/input/000_i18n_de.html", + "//components/test/data/autofill/heuristics/input/001_i18n_de2.html", + "//components/test/data/autofill/heuristics/input/002_i18n_en.html", + "//components/test/data/autofill/heuristics/input/003_i18n_es.html", + "//components/test/data/autofill/heuristics/input/004_i18n_fr.html", + "//components/test/data/autofill/heuristics/input/005_i18n_it.html", + "//components/test/data/autofill/heuristics/input/006_i18n_ja.html", + "//components/test/data/autofill/heuristics/input/007_i18n_ko.html", + "//components/test/data/autofill/heuristics/input/008_i18n_pt.html", + "//components/test/data/autofill/heuristics/input/009_i18n_ru.html", + "//components/test/data/autofill/heuristics/input/010_i18n_zh_cn.html", + "//components/test/data/autofill/heuristics/input/011_i18n_zh_tw.html", + "//components/test/data/autofill/heuristics/input/012_autocomplete_attribute_advanced.html", + "//components/test/data/autofill/heuristics/input/013_autocomplete_attribute_basic.html", + "//components/test/data/autofill/heuristics/input/014_autocomplete_attribute_invalid.html", + "//components/test/data/autofill/heuristics/input/015_autocomplete_attribute_malicious.html", + "//components/test/data/autofill/heuristics/input/016_misc_phones.html", + "//components/test/data/autofill/heuristics/input/017_checkout_advanceautoparts.com.html", + "//components/test/data/autofill/heuristics/input/018_checkout_ae.com.html", + "//components/test/data/autofill/heuristics/input/019_checkout_bedbathandbeyond.com.html", + "//components/test/data/autofill/heuristics/input/020_checkout_cafepress.com.html", + "//components/test/data/autofill/heuristics/input/021_checkout_cduniverse.com.html", + "//components/test/data/autofill/heuristics/input/022_checkout_crutchfield.com.html", + "//components/test/data/autofill/heuristics/input/023_checkout_gamestop.com.html", + "//components/test/data/autofill/heuristics/input/024_checkout_homedepot.com.html", + "//components/test/data/autofill/heuristics/input/025_checkout_hsn.com.html", + "//components/test/data/autofill/heuristics/input/026_checkout_ikea.com.html", + "//components/test/data/autofill/heuristics/input/027_checkout_jcrew.com.html", + "//components/test/data/autofill/heuristics/input/028_checkout_jr.com.html", + "//components/test/data/autofill/heuristics/input/029_checkout_kohls.com.html", + "//components/test/data/autofill/heuristics/input/030_checkout_lowes.com.html", + "//components/test/data/autofill/heuristics/input/031_checkout_macys.com.html", + "//components/test/data/autofill/heuristics/input/032_checkout_nordstrom.com.html", + "//components/test/data/autofill/heuristics/input/033_checkout_officemax.com.html", + "//components/test/data/autofill/heuristics/input/034_checkout_overstock.com.html", + "//components/test/data/autofill/heuristics/input/035_checkout_petco.com.html", + "//components/test/data/autofill/heuristics/input/036_checkout_petsmart.com.html", + "//components/test/data/autofill/heuristics/input/037_checkout_qvc.com.html", + "//components/test/data/autofill/heuristics/input/038_checkout_sears.com.html", + "//components/test/data/autofill/heuristics/input/039_checkout_target.com.html", + "//components/test/data/autofill/heuristics/input/040_checkout_urbanoutfitters.com.html", + "//components/test/data/autofill/heuristics/input/041_checkout_vitacost.com.html", + "//components/test/data/autofill/heuristics/input/042_checkout_williams-sonoma.com.html", + "//components/test/data/autofill/heuristics/input/043_register_adobe.com.html", + "//components/test/data/autofill/heuristics/input/044_register_amazon.com.html", + "//components/test/data/autofill/heuristics/input/045_register_aol.com.html", + "//components/test/data/autofill/heuristics/input/046_register_bestbuy.com.html", + "//components/test/data/autofill/heuristics/input/047_register_continental.com.html", + "//components/test/data/autofill/heuristics/input/048_register_deviantart.com.html", + "//components/test/data/autofill/heuristics/input/049_register_ebay.com.html", + "//components/test/data/autofill/heuristics/input/050_register_ecomm.dell.com.html", + "//components/test/data/autofill/heuristics/input/051_register_epson.com.html", + "//components/test/data/autofill/heuristics/input/052_register_google.com.html", + "//components/test/data/autofill/heuristics/input/053_register_gymboree.com.html", + "//components/test/data/autofill/heuristics/input/054_register_hotels.com.html", + "//components/test/data/autofill/heuristics/input/055_register_imdb.com.html", + "//components/test/data/autofill/heuristics/input/056_register_jbox.com.html", + "//components/test/data/autofill/heuristics/input/057_register_live.com.html", + "//components/test/data/autofill/heuristics/input/058_register_livejournal.com.html", + "//components/test/data/autofill/heuristics/input/059_register_macys.com.html", + "//components/test/data/autofill/heuristics/input/060_register_mcphee.com.html", + "//components/test/data/autofill/heuristics/input/061_register_myspace.com.html", + "//components/test/data/autofill/heuristics/input/062_register_newegg.com.html", + "//components/test/data/autofill/heuristics/input/063_register_officedepot.com.html", + "//components/test/data/autofill/heuristics/input/064_register_officemax.com.html", + "//components/test/data/autofill/heuristics/input/065_register_pyramidcollection.com.html", + "//components/test/data/autofill/heuristics/input/066_register_rediff.com.html", + "//components/test/data/autofill/heuristics/input/067_register_rei.com.html", + "//components/test/data/autofill/heuristics/input/068_register_rocketlawyer.com.html", + "//components/test/data/autofill/heuristics/input/069_register_signup.clicksor.com.html", + "//components/test/data/autofill/heuristics/input/070_register_signup.live.com.html", + "//components/test/data/autofill/heuristics/input/071_register_sourceforge.net.html", + "//components/test/data/autofill/heuristics/input/072_register_supershuttle.com.html", + "//components/test/data/autofill/heuristics/input/073_register_target.com.html", + "//components/test/data/autofill/heuristics/input/074_register_threadless.com.html", + "//components/test/data/autofill/heuristics/input/075_register_trueblue.jetblue.com.html", + "//components/test/data/autofill/heuristics/input/076_register_uhaul.com.html", + "//components/test/data/autofill/heuristics/input/077_register_yahoo.com.html", + "//components/test/data/autofill/heuristics/input/078_crbug_40687.html", + "//components/test/data/autofill/heuristics/input/079_crbug_52198.html", + "//components/test/data/autofill/heuristics/input/080_crbug_53075.html", + "//components/test/data/autofill/heuristics/input/081_crbug_64569.html", + "//components/test/data/autofill/heuristics/input/082_crbug_74918.html", + "//components/test/data/autofill/heuristics/input/083_crbug_87517.html", + "//components/test/data/autofill/heuristics/input/084_crbug_93595.html", + "//components/test/data/autofill/heuristics/input/085_crbug_98152.html", + "//components/test/data/autofill/heuristics/input/086_crbug_98269.html", + "//components/test/data/autofill/heuristics/input/087_crbug_98286.html", + "//components/test/data/autofill/heuristics/input/088_crbug_98338.html", + "//components/test/data/autofill/heuristics/input/089_crbug_224601.html", + "//components/test/data/autofill/heuristics/input/090_crbug_308839.html", + "//components/test/data/autofill/heuristics/input/091_crbug_433703.html", + "//components/test/data/autofill/heuristics/input/092_checkout_alaskaair.com.html", + "//components/test/data/autofill/heuristics/input/093_checkout_m_walmart.com.html", + "//components/test/data/autofill/heuristics/input/094_checkout_staples.com.html", + "//components/test/data/autofill/heuristics/input/095_landsend.html", + "//components/test/data/autofill/heuristics/input/096_llbean.html", + "//components/test/data/autofill/heuristics/input/097_register_alaskaair.com.html", + "//components/test/data/autofill/heuristics/input/098_register_epson.com.mx.html", + "//components/test/data/autofill/heuristics/input/099_checkout_address2lines.html", + "//components/test/data/autofill/heuristics/input/100_checkout_costco.com.html", + "//components/test/data/autofill/heuristics/input/101_checkout_m_bestbuy.com.html", + "//components/test/data/autofill/heuristics/input/102_checkout_m_macys.com.html", + "//components/test/data/autofill/heuristics/input/103_checkout_peapod.com.html", + "//components/test/data/autofill/heuristics/input/104_checkout_m_kohls.com.html", + "//components/test/data/autofill/heuristics/input/105_checkout_m_lowes.com.html", + "//components/test/data/autofill/heuristics/input/106_checkout_m_amazon.com.html", + "//components/test/data/autofill/heuristics/input/107_checkout_m_apple.com.html", + "//components/test/data/autofill/heuristics/input/108_checkout_m_gap.com.html", + "//components/test/data/autofill/heuristics/input/109_checkout_m_nordstroms.com.html", + "//components/test/data/autofill/heuristics/input/110_checkout_harryanddavid.com.html", + "//components/test/data/autofill/heuristics/input/111_checkout_virgin_america.com.html", + "//components/test/data/autofill/heuristics/input/112_checkout_m_llbean.com.html", + "//components/test/data/autofill/heuristics/input/113_guest_checkout_peapod.com.html", + "//components/test/data/autofill/heuristics/input/114_cc_checkout_wayfair.com.html", + "//components/test/data/autofill/heuristics/input/115_checkout_walgreens.com.html", + "//components/test/data/autofill/heuristics/input/116_cc_checkout_walgreens.com.html", + "//components/test/data/autofill/heuristics/input/117_cc_checkout_macys.com.html", + "//components/test/data/autofill/heuristics/input/118_checkout_cvs.com.html", + "//components/test/data/autofill/heuristics/input/119_bug_465571.html", + "//components/test/data/autofill/heuristics/input/120_bug_447332.html", + "//components/test/data/autofill/heuristics/input/121_bug_454366.html", + "//components/test/data/autofill/heuristics/input/122_bug_454366b.html", + "//components/test/data/autofill/heuristics/input/123_bug_459132.html", + "//components/test/data/autofill/heuristics/input/124_bug_460832.html", + "//components/test/data/autofill/heuristics/input/125_bug_462080.html", + "//components/test/data/autofill/heuristics/input/126_bug_463856.html", + "//components/test/data/autofill/heuristics/input/127_bug_463986.html", + "//components/test/data/autofill/heuristics/input/128_bug_464002.html", + "//components/test/data/autofill/heuristics/input/129_bug_465053.html", + "//components/test/data/autofill/heuristics/input/130_bug_465576.html", + "//components/test/data/autofill/heuristics/input/131_bug_465587.html", + "//components/test/data/autofill/heuristics/input/132_bug_469012.html", + "//components/test/data/autofill/heuristics/input/133_bug_469472.html", + "//components/test/data/autofill/heuristics/input/134_bug_471748.html", + "//components/test/data/autofill/heuristics/input/135_bug_471831.html", + "//components/test/data/autofill/heuristics/input/136_bug_497850.html", + "//components/test/data/autofill/heuristics/input/137_bug_555010.html", + "//components/test/data/autofill/heuristics/input/138_cc_checkout_united.com.html", + "//components/test/data/autofill/heuristics/input/139_bug_594475.html", + "//components/test/data/autofill/heuristics/input/140_checkout_nike.com.html", + "//components/test/data/autofill/heuristics/input/141_checkout_cc_keurig.com.html", + "//components/test/data/autofill/heuristics/input/142_cc_checkout_netaporter.com.html", + "//components/test/data/autofill/heuristics/input/143_cc_checkout_efollet.com.html", + "//components/test/data/autofill/heuristics/input/144_cc_checkout_m_jcp.com.html", + "//components/test/data/autofill/heuristics/input/145_hal-india.com.html", + "//components/test/data/autofill/heuristics/input/146_checkout_store.scholastic.com.html", + "//components/test/data/autofill/heuristics/input/147_panera.custhelp.com_app_ask.html", + "//components/test/data/autofill/heuristics/input/148_payment_dickblick.com.html", + "//components/test/data/autofill/heuristics/input/149_checkout_qvc.com_non_hidden.html", + "//components/test/data/autofill/heuristics/input/150_checkout_venus.com_search_field.html", + "//components/test/data/autofill/heuristics/input/151_ticketmaster.com.html", + "//components/test/data/autofill/heuristics/input/153_fmm-en_inm.gob.mx.html", + "//components/test/data/autofill/heuristics/input/154_fmm-es_inm.gob.mx.html", + "//components/test/data/autofill/heuristics/input/155_fmm-ja_inm.gob.mx.html", + "//components/test/data/autofill/heuristics/input/156_buyAlbum_bandcamp.com_price.html", + "//components/test/data/autofill/heuristics/input/157_bug_971402_opentable_checkout.html", + "//components/test/data/autofill/heuristics/input/158_i18n_ml.html", + "//components/test/data/autofill/heuristics/input/159_bug_966406_transavia.com.html", + "//components/test/data/autofill/heuristics/input/160_credit_card_ignore_birthday_fields.html", + "//components/test/data/autofill/heuristics/input/161_i18n_tr.html", + "//components/test/data/autofill/heuristics/input/162_i18n_tr2.html", + "//components/test/data/autofill/heuristics/input/163_giftcard_hotels.com.html", + "//components/test/data/autofill/heuristics/input/164_i18n_es_two_last_names_1.html", + "//components/test/data/autofill/heuristics/input/165_i18n_es_two_last_names_2.html", + "//components/test/data/autofill/heuristics/input/166_i18n_en_honorific_prefix.html", + "//components/test/data/autofill/heuristics/input/167_helity.es.html", + "//components/test/data/autofill/heuristics/input/168_i18n_hi.html", + "//components/test/data/autofill/heuristics/input/169_dominos_de.html", + "//components/test/data/autofill/heuristics/input/170_i18n_ru_structured_address_1.html", + "//components/test/data/autofill/heuristics/input/171_i18n_ru_structured_address_2.html", + "//components/test/data/autofill/heuristics/input/172_i18n_pt_structured_address_1.html", + "//components/test/data/autofill/heuristics/input/173_i18n_pt_structured_address_2.html", + "//components/test/data/autofill/heuristics/input/174_i18n_id.html", + "//components/test/data/autofill/heuristics/input/175_id_address_alfacart.com.html", + "//components/test/data/autofill/heuristics/input/176_id_payment_shopee.co.id.html", + "//components/test/data/autofill/heuristics/input/177_reichelt.html", + "//components/test/data/autofill/heuristics/input/178_zip_file_extension.html", + "//components/test/data/autofill/heuristics/input/179_twtcgirls.html", + "//components/test/data/autofill/heuristics/input/180_namesurname.html", + "//components/test/data/autofill/heuristics/output/000_i18n_de.out", + "//components/test/data/autofill/heuristics/output/001_i18n_de2.out", + "//components/test/data/autofill/heuristics/output/002_i18n_en.out", + "//components/test/data/autofill/heuristics/output/003_i18n_es.out", + "//components/test/data/autofill/heuristics/output/004_i18n_fr.out", + "//components/test/data/autofill/heuristics/output/005_i18n_it.out", + "//components/test/data/autofill/heuristics/output/006_i18n_ja.out", + "//components/test/data/autofill/heuristics/output/007_i18n_ko.out", + "//components/test/data/autofill/heuristics/output/008_i18n_pt.out", + "//components/test/data/autofill/heuristics/output/009_i18n_ru.out", + "//components/test/data/autofill/heuristics/output/010_i18n_zh_cn.out", + "//components/test/data/autofill/heuristics/output/011_i18n_zh_tw.out", + "//components/test/data/autofill/heuristics/output/012_autocomplete_attribute_advanced.out", + "//components/test/data/autofill/heuristics/output/013_autocomplete_attribute_basic.out", + "//components/test/data/autofill/heuristics/output/014_autocomplete_attribute_invalid.out", + "//components/test/data/autofill/heuristics/output/015_autocomplete_attribute_malicious.out", + "//components/test/data/autofill/heuristics/output/016_misc_phones.out", + "//components/test/data/autofill/heuristics/output/017_checkout_advanceautoparts.com.out", + "//components/test/data/autofill/heuristics/output/018_checkout_ae.com.out", + "//components/test/data/autofill/heuristics/output/019_checkout_bedbathandbeyond.com.out", + "//components/test/data/autofill/heuristics/output/020_checkout_cafepress.com.out", + "//components/test/data/autofill/heuristics/output/021_checkout_cduniverse.com.out", + "//components/test/data/autofill/heuristics/output/022_checkout_crutchfield.com.out", + "//components/test/data/autofill/heuristics/output/023_checkout_gamestop.com.out", + "//components/test/data/autofill/heuristics/output/024_checkout_homedepot.com.out", + "//components/test/data/autofill/heuristics/output/025_checkout_hsn.com.out", + "//components/test/data/autofill/heuristics/output/026_checkout_ikea.com.out", + "//components/test/data/autofill/heuristics/output/027_checkout_jcrew.com.out", + "//components/test/data/autofill/heuristics/output/028_checkout_jr.com.out", + "//components/test/data/autofill/heuristics/output/029_checkout_kohls.com.out", + "//components/test/data/autofill/heuristics/output/030_checkout_lowes.com.out", + "//components/test/data/autofill/heuristics/output/031_checkout_macys.com.out", + "//components/test/data/autofill/heuristics/output/032_checkout_nordstrom.com.out", + "//components/test/data/autofill/heuristics/output/033_checkout_officemax.com.out", + "//components/test/data/autofill/heuristics/output/034_checkout_overstock.com.out", + "//components/test/data/autofill/heuristics/output/035_checkout_petco.com.out", + "//components/test/data/autofill/heuristics/output/036_checkout_petsmart.com.out", + "//components/test/data/autofill/heuristics/output/037_checkout_qvc.com.out", + "//components/test/data/autofill/heuristics/output/038_checkout_sears.com.out", + "//components/test/data/autofill/heuristics/output/039_checkout_target.com.out", + "//components/test/data/autofill/heuristics/output/040_checkout_urbanoutfitters.com.out", + "//components/test/data/autofill/heuristics/output/041_checkout_vitacost.com.out", + "//components/test/data/autofill/heuristics/output/042_checkout_williams-sonoma.com.out", + "//components/test/data/autofill/heuristics/output/043_register_adobe.com.out", + "//components/test/data/autofill/heuristics/output/044_register_amazon.com.out", + "//components/test/data/autofill/heuristics/output/045_register_aol.com.out", + "//components/test/data/autofill/heuristics/output/046_register_bestbuy.com.out", + "//components/test/data/autofill/heuristics/output/047_register_continental.com.out", + "//components/test/data/autofill/heuristics/output/048_register_deviantart.com.out", + "//components/test/data/autofill/heuristics/output/049_register_ebay.com.out", + "//components/test/data/autofill/heuristics/output/050_register_ecomm.dell.com.out", + "//components/test/data/autofill/heuristics/output/051_register_epson.com.out", + "//components/test/data/autofill/heuristics/output/052_register_google.com.out", + "//components/test/data/autofill/heuristics/output/053_register_gymboree.com.out", + "//components/test/data/autofill/heuristics/output/054_register_hotels.com.out", + "//components/test/data/autofill/heuristics/output/055_register_imdb.com.out", + "//components/test/data/autofill/heuristics/output/056_register_jbox.com.out", + "//components/test/data/autofill/heuristics/output/057_register_live.com.out", + "//components/test/data/autofill/heuristics/output/058_register_livejournal.com.out", + "//components/test/data/autofill/heuristics/output/059_register_macys.com.out", + "//components/test/data/autofill/heuristics/output/060_register_mcphee.com.out", + "//components/test/data/autofill/heuristics/output/061_register_myspace.com.out", + "//components/test/data/autofill/heuristics/output/062_register_newegg.com.out", + "//components/test/data/autofill/heuristics/output/063_register_officedepot.com.out", + "//components/test/data/autofill/heuristics/output/064_register_officemax.com.out", + "//components/test/data/autofill/heuristics/output/065_register_pyramidcollection.com.out", + "//components/test/data/autofill/heuristics/output/066_register_rediff.com.out", + "//components/test/data/autofill/heuristics/output/067_register_rei.com.out", + "//components/test/data/autofill/heuristics/output/068_register_rocketlawyer.com.out", + "//components/test/data/autofill/heuristics/output/069_register_signup.clicksor.com.out", + "//components/test/data/autofill/heuristics/output/070_register_signup.live.com.out", + "//components/test/data/autofill/heuristics/output/071_register_sourceforge.net.out", + "//components/test/data/autofill/heuristics/output/072_register_supershuttle.com.out", + "//components/test/data/autofill/heuristics/output/073_register_target.com.out", + "//components/test/data/autofill/heuristics/output/074_register_threadless.com.out", + "//components/test/data/autofill/heuristics/output/075_register_trueblue.jetblue.com.out", + "//components/test/data/autofill/heuristics/output/076_register_uhaul.com.out", + "//components/test/data/autofill/heuristics/output/077_register_yahoo.com.out", + "//components/test/data/autofill/heuristics/output/078_crbug_40687.out", + "//components/test/data/autofill/heuristics/output/079_crbug_52198.out", + "//components/test/data/autofill/heuristics/output/080_crbug_53075.out", + "//components/test/data/autofill/heuristics/output/081_crbug_64569.out", + "//components/test/data/autofill/heuristics/output/082_crbug_74918.out", + "//components/test/data/autofill/heuristics/output/083_crbug_87517.out", + "//components/test/data/autofill/heuristics/output/084_crbug_93595.out", + "//components/test/data/autofill/heuristics/output/085_crbug_98152.out", + "//components/test/data/autofill/heuristics/output/086_crbug_98269.out", + "//components/test/data/autofill/heuristics/output/087_crbug_98286.out", + "//components/test/data/autofill/heuristics/output/088_crbug_98338.out", + "//components/test/data/autofill/heuristics/output/089_crbug_224601.out", + "//components/test/data/autofill/heuristics/output/090_crbug_308839.out", + "//components/test/data/autofill/heuristics/output/091_crbug_433703.out", + "//components/test/data/autofill/heuristics/output/092_checkout_alaskaair.com.out", + "//components/test/data/autofill/heuristics/output/093_checkout_m_walmart.com.out", + "//components/test/data/autofill/heuristics/output/094_checkout_staples.com.out", + "//components/test/data/autofill/heuristics/output/095_landsend.out", + "//components/test/data/autofill/heuristics/output/096_llbean.out", + "//components/test/data/autofill/heuristics/output/097_register_alaskaair.com.out", + "//components/test/data/autofill/heuristics/output/098_register_epson.com.mx.out", + "//components/test/data/autofill/heuristics/output/099_checkout_address2lines.out", + "//components/test/data/autofill/heuristics/output/100_checkout_costco.com.out", + "//components/test/data/autofill/heuristics/output/101_checkout_m_bestbuy.com.out", + "//components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out", + "//components/test/data/autofill/heuristics/output/103_checkout_peapod.com.out", + "//components/test/data/autofill/heuristics/output/104_checkout_m_kohls.com.out", + "//components/test/data/autofill/heuristics/output/105_checkout_m_lowes.com.out", + "//components/test/data/autofill/heuristics/output/106_checkout_m_amazon.com.out", + "//components/test/data/autofill/heuristics/output/107_checkout_m_apple.com.out", + "//components/test/data/autofill/heuristics/output/108_checkout_m_gap.com.out", + "//components/test/data/autofill/heuristics/output/109_checkout_m_nordstroms.com.out", + "//components/test/data/autofill/heuristics/output/110_checkout_harryanddavid.com.out", + "//components/test/data/autofill/heuristics/output/111_checkout_virgin_america.com.out", + "//components/test/data/autofill/heuristics/output/112_checkout_m_llbean.com.out", + "//components/test/data/autofill/heuristics/output/113_guest_checkout_peapod.com.out", + "//components/test/data/autofill/heuristics/output/114_cc_checkout_wayfair.com.out", + "//components/test/data/autofill/heuristics/output/115_checkout_walgreens.com.out", + "//components/test/data/autofill/heuristics/output/116_cc_checkout_walgreens.com.out", + "//components/test/data/autofill/heuristics/output/117_cc_checkout_macys.com.out", + "//components/test/data/autofill/heuristics/output/118_checkout_cvs.com.out", + "//components/test/data/autofill/heuristics/output/119_bug_465571.out", + "//components/test/data/autofill/heuristics/output/120_bug_447332.out", + "//components/test/data/autofill/heuristics/output/121_bug_454366.out", + "//components/test/data/autofill/heuristics/output/122_bug_454366b.out", + "//components/test/data/autofill/heuristics/output/123_bug_459132.out", + "//components/test/data/autofill/heuristics/output/124_bug_460832.out", + "//components/test/data/autofill/heuristics/output/125_bug_462080.out", + "//components/test/data/autofill/heuristics/output/126_bug_463856.out", + "//components/test/data/autofill/heuristics/output/127_bug_463986.out", + "//components/test/data/autofill/heuristics/output/128_bug_464002.out", + "//components/test/data/autofill/heuristics/output/129_bug_465053.out", + "//components/test/data/autofill/heuristics/output/130_bug_465576.out", + "//components/test/data/autofill/heuristics/output/131_bug_465587.out", + "//components/test/data/autofill/heuristics/output/132_bug_469012.out", + "//components/test/data/autofill/heuristics/output/133_bug_469472.out", + "//components/test/data/autofill/heuristics/output/134_bug_471748.out", + "//components/test/data/autofill/heuristics/output/135_bug_471831.out", + "//components/test/data/autofill/heuristics/output/136_bug_497850.out", + "//components/test/data/autofill/heuristics/output/137_bug_555010.out", + "//components/test/data/autofill/heuristics/output/138_cc_checkout_united.com.out", + "//components/test/data/autofill/heuristics/output/139_bug_594475.out", + "//components/test/data/autofill/heuristics/output/140_checkout_nike.com.out", + "//components/test/data/autofill/heuristics/output/141_checkout_cc_keurig.com.out", + "//components/test/data/autofill/heuristics/output/142_cc_checkout_netaporter.com.out", + "//components/test/data/autofill/heuristics/output/143_cc_checkout_efollet.com.out", + "//components/test/data/autofill/heuristics/output/144_cc_checkout_m_jcp.com.out", + "//components/test/data/autofill/heuristics/output/145_hal-india.com.out", + "//components/test/data/autofill/heuristics/output/146_checkout_store.scholastic.com.out", + "//components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out", + "//components/test/data/autofill/heuristics/output/148_payment_dickblick.com.out", + "//components/test/data/autofill/heuristics/output/149_checkout_qvc.com_non_hidden.out", + "//components/test/data/autofill/heuristics/output/150_checkout_venus.com_search_field.out", + "//components/test/data/autofill/heuristics/output/151_ticketmaster.com.out", + "//components/test/data/autofill/heuristics/output/153_fmm-en_inm.gob.mx.out", + "//components/test/data/autofill/heuristics/output/154_fmm-es_inm.gob.mx.out", + "//components/test/data/autofill/heuristics/output/155_fmm-ja_inm.gob.mx.out", + "//components/test/data/autofill/heuristics/output/156_buyAlbum_bandcamp.com_price.out", + "//components/test/data/autofill/heuristics/output/157_bug_971402_opentable_checkout.out", + "//components/test/data/autofill/heuristics/output/158_i18n_ml.out", + "//components/test/data/autofill/heuristics/output/159_bug_966406_transavia.com.out", + "//components/test/data/autofill/heuristics/output/160_credit_card_ignore_birthday_fields.out", + "//components/test/data/autofill/heuristics/output/161_i18n_tr.out", + "//components/test/data/autofill/heuristics/output/162_i18n_tr2.out", + "//components/test/data/autofill/heuristics/output/163_giftcard_hotels.com.out", + "//components/test/data/autofill/heuristics/output/164_i18n_es_two_last_names_1.out", + "//components/test/data/autofill/heuristics/output/165_i18n_es_two_last_names_2.out", + "//components/test/data/autofill/heuristics/output/166_i18n_en_honorific_prefix.out", + "//components/test/data/autofill/heuristics/output/167_helity.es.out", + "//components/test/data/autofill/heuristics/output/168_i18n_hi.out", + "//components/test/data/autofill/heuristics/output/169_dominos_de.out", + "//components/test/data/autofill/heuristics/output/170_i18n_ru_structured_address_1.out", + "//components/test/data/autofill/heuristics/output/171_i18n_ru_structured_address_2.out", + "//components/test/data/autofill/heuristics/output/172_i18n_pt_structured_address_1.out", + "//components/test/data/autofill/heuristics/output/173_i18n_pt_structured_address_2.out", + "//components/test/data/autofill/heuristics/output/174_i18n_id.out", + "//components/test/data/autofill/heuristics/output/175_id_address_alfacart.com.out", + "//components/test/data/autofill/heuristics/output/176_id_payment_shopee.co.id.out", + "//components/test/data/autofill/heuristics/output/177_reichelt.out", + "//components/test/data/autofill/heuristics/output/178_zip_file_extension.out", + "//components/test/data/autofill/heuristics/output/179_twtcgirls.out", + "//components/test/data/autofill/heuristics/output/180_namesurname.out", +]
diff --git a/components/webapk/OWNERS b/components/webapk/OWNERS index 478cf77..e2ef192a 100644 --- a/components/webapk/OWNERS +++ b/components/webapk/OWNERS
@@ -1,3 +1,3 @@ -hanxi@chromium.org +eirage@chromium.org hartmanng@chromium.org yfriedman@chromium.org
diff --git a/components/webapps/OWNERS b/components/webapps/OWNERS index 413ef7a..9094dac 100644 --- a/components/webapps/OWNERS +++ b/components/webapps/OWNERS
@@ -1,2 +1,3 @@ dominickn@chromium.org +eirage@chromium.org hartmanng@chromium.org
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.cc b/content/browser/fenced_frame/fenced_frame_url_mapping.cc index 36e503e..53e2e0d7 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping.cc +++ b/content/browser/fenced_frame/fenced_frame_url_mapping.cc
@@ -235,15 +235,20 @@ AdAuctionData ad_auction_data, std::vector<GURL> ad_component_urls, const ReportingMetadata& reporting_metadata) { - // The placeholder urn::uuid should have been mapped already. - DCHECK(IsMapped(urn_uuid)); + // Move pending mapped urn::uuid to `urn_uuid_to_url_map_`. + auto pending_it = pending_urn_uuid_to_url_map_.find(urn_uuid); + DCHECK(pending_it != pending_urn_uuid_to_url_map_.end()); + pending_urn_uuid_to_url_map_.erase(pending_it); + + bool emplaced = false; + std::tie(std::ignore, emplaced) = urn_uuid_to_url_map_.emplace(urn_uuid, url); + DCHECK(emplaced); auto& map_info = urn_uuid_to_url_map_[urn_uuid]; - // The placeholder urn::uuid should be mapped to an empty URL. - DCHECK(map_info.mapped_url.is_empty()); + // The urn::uuid should be mapped to the given url. + DCHECK(map_info.mapped_url == url); - // Assign mapped URL and interest group info. - map_info.mapped_url = url; + // Assign interest group info. map_info.ad_auction_data = std::move(ad_auction_data); std::vector<MapInfo> ad_component_configs; ad_component_configs.reserve(ad_component_urls.size()); @@ -254,28 +259,15 @@ map_info.reporting_metadata = reporting_metadata; } -absl::optional<GURL> FencedFrameURLMapping::GeneratePlaceholderURN() { - if (IsFull()) { - return absl::nullopt; - } - - GURL urn_uuid = GenerateURN(); - DCHECK(!IsMapped(urn_uuid)); - DCHECK(!IsPendingMapped(urn_uuid)); - - urn_uuid_to_url_map_.emplace(urn_uuid, MapInfo()); - return urn_uuid; -} - absl::optional<GURL> FencedFrameURLMapping::GeneratePendingMappedURN() { - GURL urn_uuid = GenerateURN(); - DCHECK(!IsMapped(urn_uuid)); - DCHECK(!IsPendingMapped(urn_uuid)); - if (IsFull()) { return absl::nullopt; } + GURL urn_uuid = GenerateURN(); + DCHECK(!IsMapped(urn_uuid)); + DCHECK(!IsPendingMapped(urn_uuid)); + pending_urn_uuid_to_url_map_.emplace( urn_uuid, std::set<raw_ptr<MappingResultObserver>>()); return urn_uuid;
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.h b/content/browser/fenced_frame/fenced_frame_url_mapping.h index 4284b127..6f8aeb4 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping.h +++ b/content/browser/fenced_frame/fenced_frame_url_mapping.h
@@ -247,10 +247,11 @@ const GURL& url, const ReportingMetadata& reporting_metadata = ReportingMetadata()); - // Assign ad auction data as well as an ordered list of ad component URLs, - // provided by a bidder running an auction, to the existing entry associated - // with the placeholder |urn_uuid|. These will to be made available to any - // fenced frame navigated to the returned URN, via the InterestGroup API. + // Move pending mapped |urn_uuid| from `pending_urn_uuid_to_url_map_` to + // `urn_uuid_to_url_map_`. Then assign ad auction data as well as an ordered + // list of ad component URLs, provided by a bidder running an auction, to the + // entry associated with the |urn_uuid|. These will to be made available to + // any fenced frame navigated to the returned URN, via the InterestGroup API. // // See https://github.com/WICG/turtledove/blob/main/FLEDGE.md void AssignFencedFrameURLAndInterestGroupInfo( @@ -260,18 +261,17 @@ std::vector<GURL> ad_component_urls, const ReportingMetadata& reporting_metadata = ReportingMetadata()); - // Generate a URN that is mapped to a default constructed `MapInfo` without a - // specified URL. This method will fail and return absl::nullopt if number of - // mappings has reached limit. As the result, ad auction will be terminated up - // front. If success, info provided by auction bidder will later be assigned - // using `AssignFencedFrameURLAndInterestGroupInfo`. - absl::optional<GURL> GeneratePlaceholderURN(); - - // Generate a URN that is not yet mapped to a URL. Used by the Shared Storage - // API to return the URN for `sharedStorage.runURLSelectionOperation` before - // the URL selection decision is made. This method will fail and return - // absl::nullopt if number of mappings has reached limit. As a result, - // `selectURL()` will be terminated up front and an error is reported. + // Generate a URN that is not yet mapped to a URL. + // * For Shared Storage, it will be returned by + // `sharedStorage.runURLSelectionOperation` before the URL selection decision + // is made. + // * For FLEDGE, it will be moved from `pending_urn_uuid_to_url_map_` to + // `urn_uuid_to_url_map_` when ad auction completes. Info provided by auction + // bidder will be assigned using `AssignFencedFrameURLAndInterestGroupInfo`. + // + // This method will fail and return absl::nullopt if number of + // mappings has reached limit. Ad auction and `selectURL()` will be terminated + // up front and an error will be reported. absl::optional<GURL> GeneratePendingMappedURN(); // Register an observer for `urn_uuid`. The observer will be notified with the
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc index 10b26ce..e3931e8 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc +++ b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc
@@ -105,16 +105,6 @@ } } -GURL GenerateAndVerifyPlaceholderURN( - FencedFrameURLMapping* fenced_frame_url_mapping) { - absl::optional<GURL> placeholder_urn = - fenced_frame_url_mapping->GeneratePlaceholderURN(); - EXPECT_TRUE(placeholder_urn.has_value()); - EXPECT_TRUE(placeholder_urn->is_valid()); - - return placeholder_urn.value(); -} - GURL GenerateAndVerifyPendingMappedURN( FencedFrameURLMapping* fenced_frame_url_mapping) { absl::optional<GURL> pending_urn = @@ -264,7 +254,7 @@ std::string interest_group_name = "bars"; std::vector<GURL> ad_component_urls; - auto urn_uuid = GenerateAndVerifyPlaceholderURN(&fenced_frame_url_mapping); + auto urn_uuid = GenerateAndVerifyPendingMappedURN(&fenced_frame_url_mapping); fenced_frame_url_mapping.AssignFencedFrameURLAndInterestGroupInfo( urn_uuid, top_level_url, {interest_group_owner, interest_group_name}, @@ -301,7 +291,7 @@ std::string interest_group_name = "bars"; std::vector<GURL> ad_component_urls{GURL("https://bar.test")}; - auto urn_uuid = GenerateAndVerifyPlaceholderURN(&fenced_frame_url_mapping); + auto urn_uuid = GenerateAndVerifyPendingMappedURN(&fenced_frame_url_mapping); fenced_frame_url_mapping.AssignFencedFrameURLAndInterestGroupInfo( urn_uuid, top_level_url, {interest_group_owner, interest_group_name}, @@ -343,7 +333,7 @@ GURL(base::StringPrintf("https://%zu.test/", i))); } - auto urn_uuid = GenerateAndVerifyPlaceholderURN(&fenced_frame_url_mapping); + auto urn_uuid = GenerateAndVerifyPendingMappedURN(&fenced_frame_url_mapping); fenced_frame_url_mapping.AssignFencedFrameURLAndInterestGroupInfo( urn_uuid, top_level_url, {interest_group_owner, interest_group_name}, @@ -383,7 +373,7 @@ std::vector<GURL> ad_component_urls(blink::kMaxAdAuctionAdComponents, GURL("https://bar.test/")); - auto urn_uuid = GenerateAndVerifyPlaceholderURN(&fenced_frame_url_mapping); + auto urn_uuid = GenerateAndVerifyPendingMappedURN(&fenced_frame_url_mapping); fenced_frame_url_mapping.AssignFencedFrameURLAndInterestGroupInfo( urn_uuid, top_level_url, {interest_group_owner, interest_group_name}, @@ -421,7 +411,7 @@ std::vector<GURL> ad_component_urls{ GURL("https://bar.test/page?${REPLACED}")}; - auto urn_uuid = GenerateAndVerifyPlaceholderURN(&fenced_frame_url_mapping); + auto urn_uuid = GenerateAndVerifyPendingMappedURN(&fenced_frame_url_mapping); fenced_frame_url_mapping.AssignFencedFrameURLAndInterestGroupInfo( urn_uuid, top_level_url, {interest_group_owner, interest_group_name}, @@ -533,7 +523,7 @@ std::string interest_group_name = "bars"; std::vector<GURL> ad_component_urls; - auto urn_uuid = GenerateAndVerifyPlaceholderURN(&fenced_frame_url_mapping); + auto urn_uuid = GenerateAndVerifyPendingMappedURN(&fenced_frame_url_mapping); fenced_frame_url_mapping.AssignFencedFrameURLAndInterestGroupInfo( urn_uuid, top_level_url, {interest_group_owner, interest_group_name}, @@ -552,12 +542,13 @@ ["mouse interaction"]); } -// Test that number of urn mappings limit is enforced for FLEDGE use cases. +// Test that number of urn mappings limit is enforced for pending mapped urn +// generation. TEST(FencedFrameURLMappingTest, ExceedNumOfUrnMappingsLimitFailsAddURL) { FencedFrameURLMapping fenced_frame_url_mapping; - // Able to generate placeholder URN when map is not full. - EXPECT_TRUE(fenced_frame_url_mapping.GeneratePlaceholderURN().has_value()); + // Able to generate pending mapped URN when map is not full. + EXPECT_TRUE(fenced_frame_url_mapping.GeneratePendingMappedURN().has_value()); // Able to add urn mapping when map is not full. const GURL test_url("https://test.test"); @@ -571,8 +562,8 @@ GURL url("https://a.test"); fenced_frame_url_mapping_test_peer.FillMap(url); - // Cannot generate placeholder URN when map is full. - EXPECT_FALSE(fenced_frame_url_mapping.GeneratePlaceholderURN().has_value()); + // Cannot generate pending mapped URN when map is full. + EXPECT_FALSE(fenced_frame_url_mapping.GeneratePendingMappedURN().has_value()); // Subsequent additions of urn mapping should fail when map is full. const GURL extra_url("https://extra.test"); @@ -581,23 +572,4 @@ EXPECT_FALSE(extra_urn_uuid.has_value()); } -// Test that number of urn mappings limit is enforced for shared storage use -// cases. -TEST(FencedFrameURLMappingTest, - ExceedNumOfUrnMappingsLimitFailsGeneratePendingMappedURN) { - FencedFrameURLMapping fenced_frame_url_mapping; - - // Able to insert pending mapped URN when map is not full. - EXPECT_TRUE(fenced_frame_url_mapping.GeneratePendingMappedURN().has_value()); - - // Fill the map until its size reaches the limit. - FencedFrameURLMappingTestPeer fenced_frame_url_mapping_test_peer( - &fenced_frame_url_mapping); - GURL url("https://a.test"); - fenced_frame_url_mapping_test_peer.FillMap(url); - - // Subsequent insertions of pending mapped URN should fail when map is full. - EXPECT_FALSE(fenced_frame_url_mapping.GeneratePendingMappedURN().has_value()); -} - } // namespace content
diff --git a/content/browser/file_system/file_system_manager_impl.cc b/content/browser/file_system/file_system_manager_impl.cc index 8428181..28cafe9 100644 --- a/content/browser/file_system/file_system_manager_impl.cc +++ b/content/browser/file_system/file_system_manager_impl.cc
@@ -853,8 +853,6 @@ return; } - // TODO(https://crbug.com/1221308): function will use StorageKey for the - // receiver frame/worker in future CL OperationID op_id = fs_op_runner->Truncate(url, length, base::BindOnce(&FileSystemManagerImpl::DidFinish, @@ -915,10 +913,9 @@ const GURL& file_path, CreateSnapshotFileCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); - // TODO(https://crbug.com/1221308): function will use StorageKey for the - // receiver frame/worker in future CL - FileSystemURL url(context_->CrackURL( - file_path, blink::StorageKey(url::Origin::Create(file_path)))); + + FileSystemURL url( + context_->CrackURL(file_path, receivers_.current_context())); // Make sure if this file can be read by the renderer as this is // called when the renderer is about to create a new File object
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc index 06c5565..5155b53 100644 --- a/content/browser/interest_group/ad_auction_service_impl.cc +++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -228,9 +228,9 @@ FencedFrameURLMapping& fenced_frame_urls_map = GetFrame()->GetPage().fenced_frame_urls_map(); - auto urn_uuid = fenced_frame_urls_map.GeneratePlaceholderURN(); + auto urn_uuid = fenced_frame_urls_map.GeneratePendingMappedURN(); - // If placeholder URN cannot be generated due to number of mappings has + // If pending mapped URN cannot be generated due to number of mappings has // reached limit, stop the auction. if (!urn_uuid.has_value()) { std::move(callback).Run(/*manually_aborted=*/false, absl::nullopt);
diff --git a/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.cc index da7832a1..5d42da4 100644 --- a/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.cc +++ b/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.cc
@@ -130,6 +130,13 @@ Close(/*should_pause_video=*/true); } +absl::optional<gfx::Rect> +DocumentPictureInPictureWindowControllerImpl::GetWindowBounds() { + if (!child_contents_) + return absl::nullopt; + return child_contents_->GetContainerBounds(); +} + void DocumentPictureInPictureWindowControllerImpl::PrimaryPageChanged(Page&) { Close(/*should_pause_video=*/true); }
diff --git a/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.h b/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.h index ac08725..0a412e01 100644 --- a/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.h +++ b/content/browser/picture_in_picture/document_picture_in_picture_window_controller_impl.h
@@ -53,6 +53,7 @@ void CloseAndFocusInitiator() override; void OnWindowDestroyed(bool should_pause_video) override; WebContents* GetWebContents() override; + absl::optional<gfx::Rect> GetWindowBounds() override; WebContents* GetChildWebContents() override; // DocumentPictureInPictureWindowController:
diff --git a/content/browser/picture_in_picture/video_picture_in_picture_content_browsertest.cc b/content/browser/picture_in_picture/video_picture_in_picture_content_browsertest.cc index 002898b..47ed3df 100644 --- a/content/browser/picture_in_picture/video_picture_in_picture_content_browsertest.cc +++ b/content/browser/picture_in_picture/video_picture_in_picture_content_browsertest.cc
@@ -446,6 +446,31 @@ WaitForPlaybackState(VideoOverlayWindow::PlaybackState::kPaused); } +// Tests that the pip window bounds are accordingly updated when the window size +// is updated. +IN_PROC_BROWSER_TEST_F(VideoPictureInPictureContentBrowserTest, + CheckWindowBounds) { + EXPECT_TRUE(NavigateToURL( + shell(), GetTestUrl("media/picture_in_picture", "two-videos.html"))); + + // Play first video. + ASSERT_TRUE(ExecJs(shell(), "videos[0].play();")); + + WaitForTitle(u"videos[0] playing"); + // Send first video in Picture-in-Picture. + ASSERT_TRUE(ExecJs(shell(), "videos[0].requestPictureInPicture();")); + + WaitForTitle(u"videos[0] entered picture-in-picture"); + EXPECT_TRUE(web_contents_delegate()->is_in_picture_in_picture()); + + ASSERT_TRUE(overlay_window()->IsVisible()); + gfx::Size new_size(50, 50); + overlay_window()->UpdateNaturalSize(new_size); + + EXPECT_EQ(window_controller()->GetWindowBounds().value(), + gfx::Rect(new_size)); +} + class MediaSessionPictureInPictureContentBrowserTest : public VideoPictureInPictureContentBrowserTest { public:
diff --git a/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc index feebc7b..d6e6566 100644 --- a/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc +++ b/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.cc
@@ -446,6 +446,13 @@ return source_bounds_; } +absl::optional<gfx::Rect> +VideoPictureInPictureWindowControllerImpl::GetWindowBounds() { + if (!window_) + return absl::nullopt; + return window_->GetBounds(); +} + void VideoPictureInPictureWindowControllerImpl:: UpdatePlayPauseButtonVisibility() { if (!window_)
diff --git a/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.h b/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.h index 5600327..d83bb7f 100644 --- a/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.h +++ b/content/browser/picture_in_picture/video_picture_in_picture_window_controller_impl.h
@@ -80,6 +80,7 @@ void ToggleCamera() override; void HangUp() override; const gfx::Rect& GetSourceBounds() const override; + absl::optional<gfx::Rect> GetWindowBounds() override; // Called by the MediaSessionImpl when the MediaSessionInfo changes. void MediaSessionInfoChanged(
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 25a9534..371d453 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -1845,14 +1845,14 @@ // For navigations that inherit a base URL, snapshot the parent's base URL at // the start of the navigation. Currently, this is only stored and sent to the - // renderer if kIsolatedSandboxedIframes is enabled, since it is a behavior - // change relevant for isolated sandboxed iframes. See - // https://crbug.com/1356658. + // renderer if kNewBaseUrlInheritanceBehavior or kIsolateSandboxedIframes is + // enabled, since it is a behavior change relevant for isolated sandboxed + // iframes. See https://crbug.com/1356658. // TODO(wjmaclean): about:blank frames may also need to inherit base URLs, // possibly from the initiator rather than the parent. See // https://crbug.com/1356658#c7. if (GetURL().IsAboutSrcdoc() && frame_tree_node_->parent() && - SiteIsolationPolicy::AreIsolatedSandboxedIframesEnabled()) { + blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) { commit_params_->fallback_srcdoc_baseurl = frame_tree_node_->parent()->GetBaseUrl(); }
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 17d58e6..488f3f6 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -7870,7 +7870,7 @@ } void RenderFrameHostImpl::DidChangeBaseURL(const GURL& base_url) { - if (!SiteIsolationPolicy::AreIsolatedSandboxedIframesEnabled()) + if (!blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) return; // TODO(https://crbug.com/1356658,1366593): consider restricting base URL in @@ -7879,10 +7879,10 @@ } const GURL& RenderFrameHostImpl::GetBaseUrl() const { - if (!SiteIsolationPolicy::AreIsolatedSandboxedIframesEnabled()) { + if (!blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()) { NOTREACHED() << __func__ << " should only be invoked when the feature " - "IsolateSandboxedIframes is enabled."; + "NewBaseUrlInheritanceBehavioris enabled."; return GURL::EmptyGURL(); } @@ -11328,7 +11328,7 @@ if (should_commit_error_page) *should_commit_error_page = false; - if (frame_tree_node_->IsErrorPageIsolationEnabled()) { + if (SiteIsolationPolicy::IsErrorPageIsolationEnabled(is_main_frame())) { if (GetSiteInstance()->GetSiteInfo().is_error_page()) { if (should_commit_error_page) *should_commit_error_page = true; @@ -11712,7 +11712,8 @@ sandboxed_rphs.size()); } -void RenderFrameHostImpl::UpdateIsolatableSandboxedIframeTracking() { +void RenderFrameHostImpl::UpdateIsolatableSandboxedIframeTracking( + NavigationRequest* navigation_request) { RoutingIDIsolatableSandboxedIframesSet* oopsifs = g_routing_id_isolatable_sandboxed_iframes_set.Pointer(); GlobalRenderFrameHostId global_id = GetGlobalId(); @@ -11735,8 +11736,9 @@ // frame, to see if the url can be placed in an OOPSIF, i.e. it's not // already isolated because of being cross-site. RenderFrameHost* frame_owner = GetParent(); - if (!frame_owner && frame_tree_node_->opener()) - frame_owner = frame_tree_node_->opener()->current_frame_host(); + FrameTreeNode* opener = navigation_request->frame_tree_node()->opener(); + if (!frame_owner && opener) + frame_owner = opener->current_frame_host(); if (!frame_owner) { frame_is_isolatable = false; @@ -12158,7 +12160,7 @@ accessibility_fatal_error_count_ = 0; - UpdateIsolatableSandboxedIframeTracking(); + UpdateIsolatableSandboxedIframeTracking(navigation_request); } // TODO(arthursonzogni): Below, many NavigationRequest's objects are passed from
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 731baa2a..5449153e 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -3330,7 +3330,8 @@ // frames that have been opened by an OOPSIF are considered isolatable for the // purposes of this function, since they could lead to process overhead under // a per-origin isolation model. Assumes that `policy_container_host_` is set. - void UpdateIsolatableSandboxedIframeTracking(); + void UpdateIsolatableSandboxedIframeTracking( + NavigationRequest* navigation_request); // Called when we receive the confirmation that a navigation committed in the // renderer. Used by both DidCommitSameDocumentNavigation and
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index c1200d6..0a0d1a4c8 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -285,32 +285,6 @@ CloseCallback callback_; }; -// This is a small helper class created while a JavaScript dialog is showing -// and destroyed when it's dismissed. Clients can register callbacks to receive -// a notification when the dialog is dismissed. -class JavaScriptDialogDismissNotifier { - public: - JavaScriptDialogDismissNotifier() = default; - - JavaScriptDialogDismissNotifier(const JavaScriptDialogDismissNotifier&) = - delete; - JavaScriptDialogDismissNotifier& operator=( - const JavaScriptDialogDismissNotifier&) = delete; - - ~JavaScriptDialogDismissNotifier() { - for (auto& callback : callbacks_) { - std::move(callback).Run(); - } - } - - void NotifyOnDismiss(base::OnceClosure callback) { - callbacks_.push_back(std::move(callback)); - } - - private: - std::vector<base::OnceClosure> callbacks_; -}; - bool FrameCompareDepth(RenderFrameHostImpl* a, RenderFrameHostImpl* b) { return a->GetFrameDepth() < b->GetFrameDepth(); } @@ -538,6 +512,32 @@ } // namespace +// This is a small helper class created while a JavaScript dialog is showing +// and destroyed when it's dismissed. Clients can register callbacks to receive +// a notification when the dialog is dismissed. +class JavaScriptDialogDismissNotifier { + public: + JavaScriptDialogDismissNotifier() = default; + + JavaScriptDialogDismissNotifier(const JavaScriptDialogDismissNotifier&) = + delete; + JavaScriptDialogDismissNotifier& operator=( + const JavaScriptDialogDismissNotifier&) = delete; + + ~JavaScriptDialogDismissNotifier() { + for (auto& callback : callbacks_) { + std::move(callback).Run(); + } + } + + void NotifyOnDismiss(base::OnceClosure callback) { + callbacks_.push_back(std::move(callback)); + } + + private: + std::vector<base::OnceClosure> callbacks_; +}; + CreatedWindow::CreatedWindow() = default; CreatedWindow::CreatedWindow(std::unique_ptr<WebContentsImpl> contents, GURL target_url)
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index 185b2f06..c3c371a 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -105,9 +105,7 @@ } // namespace service_manager namespace content { -namespace { class JavaScriptDialogDismissNotifier; -} enum class PictureInPictureResult; class BeforeUnloadBlockingDelegate; // content_browser_test_utils_internal.h class BrowserPluginEmbedder;
diff --git a/content/browser/webrtc/resources/BUILD.gn b/content/browser/webrtc/resources/BUILD.gn index b8ab5cd..a1569e5 100644 --- a/content/browser/webrtc/resources/BUILD.gn +++ b/content/browser/webrtc/resources/BUILD.gn
@@ -19,6 +19,7 @@ "peer_connection_update_table.js", "ssrc_info_manager.js", "stats_graph_helper.js", + "stats_helper.js", "stats_rates_calculator.js", "stats_table.js", "tab_view.js",
diff --git a/content/browser/webrtc/resources/stats_graph_helper.js b/content/browser/webrtc/resources/stats_graph_helper.js index c457116..86615d0 100644 --- a/content/browser/webrtc/resources/stats_graph_helper.js +++ b/content/browser/webrtc/resources/stats_graph_helper.js
@@ -16,6 +16,7 @@ import {TimelineDataSeries} from './data_series.js'; import {peerConnectionDataStore} from './dump_creator.js'; import {GetSsrcFromReport} from './ssrc_info_manager.js'; +import {generateStatsLabel} from './stats_helper.js'; import {TimelineGraphView} from './timeline_graph_view.js'; const STATS_GRAPH_CONTAINER_HEADING_CLASS = 'stats-graph-container-heading'; @@ -103,8 +104,8 @@ }; function isStandardReportBlocklisted(report) { - // Codec stats reflect what has been negotiated. There are LOTS of them and - // they don't change over time on their own. + // Codec stats reflect what has been negotiated. They don't contain + // information that is useful in graphs. if (report.type === 'codec') { return true; } @@ -414,7 +415,7 @@ container.firstChild.firstChild.className = STATS_GRAPH_CONTAINER_HEADING_CLASS; container.firstChild.firstChild.textContent = - 'Stats graphs for ' + report.type + ' (id=' + report.id + ')'; + 'Stats graphs for ' + generateStatsLabel(report); const statsType = getSsrcReportType(report); if (statsType !== '') { container.firstChild.firstChild.textContent += ' (' + statsType + ')';
diff --git a/content/browser/webrtc/resources/stats_helper.js b/content/browser/webrtc/resources/stats_helper.js new file mode 100644 index 0000000..ed88b65 --- /dev/null +++ b/content/browser/webrtc/resources/stats_helper.js
@@ -0,0 +1,56 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @param {!Object} statsValues The object containing stats, an + * array [key1, val1, key2, val2, ...] so searching a certain + * key needs to ensure it does not collide with a value. + */ +function generateLabel(key, statsValues) { + let label = ''; + const statIndex = statsValues.findIndex((value, index) => { + return value === key && index % 2 === 0; + }); + if (statIndex !== -1) { + label += key + '=' + statsValues[statIndex + 1]; + } + return label; +} + +/** + * Formats the display text used for a stats type that is shown + * in the stats table or the stats graph. + * + * @param {!Object} report The object containing stats, which is the object + * containing timestamp and values, which is an array of strings, whose + * even index entry is the name of the stat, and the odd index entry is + * the value. + */ +export function generateStatsLabel(report) { + let label = report.type + ' ('; + let labels = []; + if (['outbound-rtp', 'inbound-rtp'].includes(report.type) + && report.stats.values) { + labels = ['mid', 'rid', 'ssrc', '[codec]'] + .map(stat => generateLabel(stat, report.stats.values)); + } else if (['local-candidate', 'remote-candidate'].includes(report.type)) { + labels = ['candidateType'] + .map(stat => generateLabel(stat, report.stats.values)); + } else if (report.type === 'codec') { + labels = ['mimeType', 'payloadType'] + .map(stat => generateLabel(stat, report.stats.values)); + } else if (report.type === 'media-source') { + labels = ['kind', 'relayProtocol'] + .map(stat => generateLabel(stat, report.stats.values)); + } else if (report.type === 'candidate-pair') { + labels = ['state'] + .map(stat => generateLabel(stat, report.stats.values)); + } + labels = labels.filter(label => !!label); + if (labels.length) { + label += labels.join(', ') + ', '; + } + label += 'id=' + report.id + ')'; + return label; +}
diff --git a/content/browser/webrtc/resources/stats_rates_calculator.js b/content/browser/webrtc/resources/stats_rates_calculator.js index 7c90d243..47c3f158 100644 --- a/content/browser/webrtc/resources/stats_rates_calculator.js +++ b/content/browser/webrtc/resources/stats_rates_calculator.js
@@ -528,8 +528,8 @@ totalProcessingDelay: new RateCalculator( 'totalProcessingDelay', 'framesDecoded', CalculatorModifier.kMillisecondsFromSeconds), - 'totalAssemblyTime*': new RateCalculator( - 'totalAssemblyTime*', 'framesAssembledFromMultiplePackets*', + 'totalAssemblyTime': new RateCalculator( + 'totalAssemblyTime', 'framesAssembledFromMultiplePackets', CalculatorModifier.kMillisecondsFromSeconds), }, },
diff --git a/content/browser/webrtc/resources/stats_table.js b/content/browser/webrtc/resources/stats_table.js index 95a6c45..b1e23c0 100644 --- a/content/browser/webrtc/resources/stats_table.js +++ b/content/browser/webrtc/resources/stats_table.js
@@ -5,6 +5,7 @@ import {$} from 'chrome://resources/js/util.js'; import {GetSsrcFromReport, SsrcInfoManager} from './ssrc_info_manager.js'; +import {generateStatsLabel} from './stats_helper.js'; /** * Maintains the stats table. @@ -32,43 +33,11 @@ * the value. */ addStatsReport(peerConnectionElement, report) { - if (report.type === 'codec') { - return; - } const statsTable = this.ensureStatsTable_(peerConnectionElement, report); - if (['outbound-rtp', 'inbound-rtp'].includes(report.type) - && report.stats.values) { - let summary = report.type + ' ('; - // Show mid, rid and codec for inbound-rtp and outbound-rtp. - // Note: values is an array [key1, val1, key2, val2, ...] so searching - // for a certain key needs to ensure it does not collide with a value. - const midIndex = report.stats.values.findIndex((value, index) => { - return value === 'mid' && index % 2 === 0; - }); - if (midIndex !== -1) { - const midInfo = report.stats.values[midIndex + 1]; - summary += 'mid=' + midInfo + ', '; - } - const ridIndex = report.stats.values.findIndex((value, index) => { - return value === 'rid' && index % 2 === 0; - }); - if (ridIndex !== -1) { - const ridInfo = report.stats.values[ridIndex + 1]; - summary += 'rid=' + ridInfo + ', '; - } - - const codecIndex = report.stats.values.findIndex((value, index) => { - return value === '[codec]' && index % 2 === 0; - }); - if (codecIndex !== -1) { - const codecInfo = report.stats.values[codecIndex + 1].split(' ')[0]; - summary += codecInfo + ', '; - } - // Update the summary. - statsTable.parentElement.firstElementChild.innerText = - summary + 'id=' + report.id + ')'; - } + // Update the label since information may have changed. + statsTable.parentElement.firstElementChild.innerText = + generateStatsLabel(report); if (report.stats) { this.addStatsToTable_( @@ -129,7 +98,7 @@ container.appendChild(details); const summary = document.createElement('summary'); - summary.textContent = report.type + ' (id=' + report.id + ')'; + summary.textContent = generateStatsLabel(report); details.appendChild(summary); table = document.createElement('table');
diff --git a/content/browser/webrtc/resources/webrtc_internals.js b/content/browser/webrtc/resources/webrtc_internals.js index 2dd4429..1b81d895 100644 --- a/content/browser/webrtc/resources/webrtc_internals.js +++ b/content/browser/webrtc/resources/webrtc_internals.js
@@ -489,13 +489,15 @@ document.getElementById(peerConnectionElement.id + '-table-container'); const activeConnectionClass = 'stats-table-active-connection'; statsContainer.childNodes.forEach(node => { - if (node.nodeName !== 'DETAILS') { + if (node.nodeName !== 'DETAILS' || !node.children[1]) { return; } - const innerText = node.firstElementChild.innerText; - if (innerText.startsWith(activeCandidatePair.id) - || innerText.startsWith(localCandidate.id) - || innerText.startsWith(remoteCandidate.id)) { + const ids = [ + peerConnectionElement.id + '-table-' + activeCandidatePair.id, + peerConnectionElement.id + '-table-' + localCandidate.id, + peerConnectionElement.id + '-table-' + remoteCandidate.id, + ]; + if (ids.includes(node.children[1].id)) { node.firstElementChild.classList.add(activeConnectionClass); } else { node.firstElementChild.classList.remove(activeConnectionClass);
diff --git a/content/public/browser/picture_in_picture_window_controller.h b/content/public/browser/picture_in_picture_window_controller.h index 871e23e..cb04316 100644 --- a/content/public/browser/picture_in_picture_window_controller.h +++ b/content/public/browser/picture_in_picture_window_controller.h
@@ -6,6 +6,8 @@ #define CONTENT_PUBLIC_BROWSER_PICTURE_IN_PICTURE_WINDOW_CONTROLLER_H_ #include "content/common/content_export.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/gfx/geometry/rect.h" namespace content { class WebContents; @@ -51,6 +53,9 @@ // Called to get the opener web contents for video or document PiP. virtual WebContents* GetWebContents() = 0; + // Called to get the Picture-in-Picture window bounds. + virtual absl::optional<gfx::Rect> GetWindowBounds() = 0; + // Called to get the child web contents to be PiP for document PiP. This will // be null for video PiP. virtual WebContents* GetChildWebContents() = 0;
diff --git a/gin/gin_features.cc b/gin/gin_features.cc index ff75eb5..89de137 100644 --- a/gin/gin_features.cc +++ b/gin/gin_features.cc
@@ -17,19 +17,11 @@ "V8CompactWithStack", base::FEATURE_ENABLED_BY_DEFAULT); -// Enables compaction of maps in a full GC. -BASE_FEATURE(kV8CompactMaps, - "V8CompactMaps", - base::FEATURE_DISABLED_BY_DEFAULT); - // Crashes on evacuation failures in a full GC instead of aborting evacuation. BASE_FEATURE(kV8CrashOnEvacuationFailure, "V8CrashOnEvacuationFailure", base::FEATURE_DISABLED_BY_DEFAULT); -// Enables a separate heap space for all map objects. -BASE_FEATURE(kV8UseMapSpace, "V8UseMapSpace", base::FEATURE_ENABLED_BY_DEFAULT); - // Enables optimization of JavaScript in V8. BASE_FEATURE(kV8OptimizeJavascript, "V8OptimizeJavascript",
diff --git a/gin/gin_features.h b/gin/gin_features.h index 08dc651..fb98a60 100644 --- a/gin/gin_features.h +++ b/gin/gin_features.h
@@ -13,7 +13,6 @@ namespace features { GIN_EXPORT BASE_DECLARE_FEATURE(kV8CompactCodeSpaceWithStack); -GIN_EXPORT BASE_DECLARE_FEATURE(kV8CompactMaps); GIN_EXPORT BASE_DECLARE_FEATURE(kV8CompactWithStack); GIN_EXPORT BASE_DECLARE_FEATURE(kV8ConcurrentSparkplug); GIN_EXPORT extern const base::FeatureParam<int> @@ -46,7 +45,6 @@ GIN_EXPORT BASE_DECLARE_FEATURE(kV8Sparkplug); GIN_EXPORT BASE_DECLARE_FEATURE(kV8SparkplugNeedsShortBuiltinCalls); GIN_EXPORT BASE_DECLARE_FEATURE(kV8TurboFastApiCalls); -GIN_EXPORT BASE_DECLARE_FEATURE(kV8UseMapSpace); GIN_EXPORT BASE_DECLARE_FEATURE(kV8DelayMemoryReducer); GIN_EXPORT extern const base::FeatureParam<base::TimeDelta> kV8MemoryReducerStartDelay;
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc index ec89b58..3510737 100644 --- a/gin/v8_initializer.cc +++ b/gin/v8_initializer.cc
@@ -245,10 +245,6 @@ "--no-compact-code-space-with-stack"); SetV8FlagsIfOverridden(features::kV8CompactWithStack, "--compact-with-stack", "--no-compact-with-stack"); - SetV8FlagsIfOverridden(features::kV8CompactMaps, "--compact-maps", - "--no-compact-maps"); - SetV8FlagsIfOverridden(features::kV8UseMapSpace, "--use-map-space", - "--no-use-map-space"); SetV8FlagsIfOverridden(features::kV8CrashOnEvacuationFailure, "--crash-on-aborted-evacuation", "--no-crash-on-aborted-evacuation");
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index 23c9265..e7794567 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1992,13 +1992,14 @@ base::UnguessableToken::Deserialize(high, low); blink::WebGPUExecutionContextToken execution_context_token; switch (type) { - case blink::WebGPUExecutionContextToken::IndexOf<blink::DocumentToken>(): { + case blink::WebGPUExecutionContextToken::Base::template TypeIndex< + blink::DocumentToken>::kValue: { execution_context_token = blink::WebGPUExecutionContextToken( blink::DocumentToken(unguessable_token)); break; } - case blink::WebGPUExecutionContextToken::IndexOf< - blink::DedicatedWorkerToken>(): { + case blink::WebGPUExecutionContextToken::Base::template TypeIndex< + blink::DedicatedWorkerToken>::kValue: { execution_context_token = blink::WebGPUExecutionContextToken( blink::DedicatedWorkerToken(unguessable_token)); break;
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn index 1419816..26948d1 100644 --- a/ios/chrome/app/BUILD.gn +++ b/ios/chrome/app/BUILD.gn
@@ -670,14 +670,14 @@ if (ios_enable_search_widget_extension) { extension_bundle_data("search_widget_extension_bundle") { extension_target = - "//ios/chrome/search_widget_extension(${current_toolchain}_13_0)" + "//ios/chrome/search_widget_extension(${current_toolchain}_13_4)" } } if (ios_enable_content_widget_extension) { extension_bundle_data("content_widget_extension_bundle") { extension_target = - "//ios/chrome/content_widget_extension(${current_toolchain}_13_0)" + "//ios/chrome/content_widget_extension(${current_toolchain}_13_4)" } }
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 86edfd4..09d137a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">ሁሉም እንደተነበቡ ምልክት አድርግባቸው</translation> <translation id="1689333818294560261">ቅጽል ስም</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ተመርጧል</translation> +<translation id="1715515772563243997"><ph name="SITE" />ን የሚያምኑት ከሆነ ለመግባት የተቀመጠ የይለፍ ቃልን መጠቀም ይችላሉ።</translation> <translation id="1740468249224277719">ለመጫን ሁለቴ ነካ ያድርጉ።</translation> <translation id="1752547299766512813">የይለፍ ቃላትን አስቀምጥ</translation> <translation id="1753905327828125965">በይበልጥ የተጎበኙ</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">እልባት አርትዕ</translation> <translation id="2155145621546387786">Chromeን አጋራ</translation> <translation id="2175927920773552910">የQR ኮድ</translation> +<translation id="2178545675770638239">የይለፍ ቃል ይምረጡ</translation> <translation id="2218443599109088993">አሳንስ</translation> <translation id="2230173723195178503">ድረ-ገጽ ተጭኗል</translation> <translation id="2239626343334228536">የአሰሳ ውሂብን በማጽዳት ላይ...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">አሁን ይፈትሹ</translation> <translation id="4505980578794259603">መጨረሻ የተፈተሸው <ph name="TIME" /> ላይ።</translation> <translation id="4508750114462689118">የመግቢያ ማስተዋወቂያን ዝጋ</translation> +<translation id="4514889972748124117">ጠንካራ የይለፍ ቃል ጠቁም...</translation> <translation id="4520798012560649652">ስለማንነት የማያሳውቅ ሁነታ የበለጠ ይወቁ</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> ላይ የተቀመጡ የይለፍ ቃሎችን ይመልከቱ እና ያስተዳድሩ</translation> <translation id="452750746583162491">የሰመረ ውሂብዎን ይገምግሙ</translation> @@ -1016,6 +1019,7 @@ <translation id="8917490105272468696">አዎ፣ ገብቼያለሁ</translation> <translation id="8928133177108699615">ዴስክቶፕ</translation> <translation id="8952559610785099500">የይለፍ ቃል ያክሉ</translation> +<translation id="8953046091948372197">የእርስዎን የይለፍ ቃላት እዚህ ያገኛሉ</translation> <translation id="895541991026785598">ችግር ሪፖርት ያድርጉ</translation> <translation id="8974714402877957201">1. የiPad ቅንብሮችን ይክፈቱ</translation> <translation id="8976382372951310360">እገዛ</translation> @@ -1049,6 +1053,7 @@ <translation id="9200875785104711666">ከ<ph name="TIME" /> ቀ በፊት</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">የብልሽት ሪፖርት ተልኳል።</translation> +<translation id="941747855997058526">የይለፍ ቃል ይምረጡ...</translation> <translation id="952704832371081537">ይቅር</translation> <translation id="953008885340860025">Chrome ዘግቶ ወጥቷል</translation> <translation id="959066944189734975"><ph name="CHANNEL_NAME" />ን እየተከተሉ ነው</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index 729a5a9c..150cfd1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -106,6 +106,7 @@ <translation id="1687475363370981210">সকলো পঢ়া হ‘ল বুলি চিহ্নিত কৰক</translation> <translation id="1689333818294560261">উপনাম</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> বাছনি কৰা হ’ল</translation> +<translation id="1715515772563243997">আপুনি যদি <ph name="SITE" />ক বিশ্বাস কৰে, ছাইন ইন কৰিবলৈ আপুনি এটা ছেভ হৈ থকা পাছৱৰ্ড ব্যৱহাৰ কৰিব পাৰে।</translation> <translation id="1740468249224277719">ইনষ্টল কৰিবলৈ দুবাৰ টিপক।</translation> <translation id="1752547299766512813">পাছৱর্ডসমূহ ছেভ কৰক</translation> <translation id="1753905327828125965">সকলোতকৈ বেছিকৈ চোৱা</translation> @@ -147,6 +148,7 @@ <translation id="2149973817440762519">বুকমার্ক সম্পাদনা কৰক</translation> <translation id="2155145621546387786">Chrome শ্বেয়াৰ কৰক</translation> <translation id="2175927920773552910">কিউআৰ ক’ড</translation> +<translation id="2178545675770638239">পাছৱৰ্ড বাছনি কৰক</translation> <translation id="2218443599109088993">জুম আউট কৰক</translation> <translation id="2230173723195178503">ৱেবপৃষ্ঠা ল’ড হ’ল</translation> <translation id="2239626343334228536">ব্ৰাউজিঙৰ ডেটা মচি থকা হৈছে...</translation> @@ -420,6 +422,7 @@ <translation id="4502566650163919158">এতিয়াই পৰীক্ষা কৰক</translation> <translation id="4505980578794259603">অন্তিমবাৰ <ph name="TIME" /> পূৰ্বে পৰীক্ষা কৰা হৈছিল।</translation> <translation id="4508750114462689118">ছাইন প্ৰ’ম’ বন্ধ কৰক</translation> +<translation id="4514889972748124117">বিশ্বস্ত পাছৱৰ্ডৰ পৰামৰ্শ দিয়ক...</translation> <translation id="4526249700380860531">ছেভ কৰি থোৱা পাছৱৰ্ডসমূহ <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />ত চাওক আৰু পৰিচালনা কৰক</translation> <translation id="452750746583162491">আপোনাৰ ছিংক কৰা ডেটা পর্যালোচনা কৰক</translation> <translation id="4536418791685807335">পুনৰ ছাইন ইন কৰি চাওক।</translation> @@ -974,6 +977,7 @@ <translation id="8917490105272468696">হয়, মই সন্মত</translation> <translation id="8928133177108699615">ডেস্কটপ</translation> <translation id="8952559610785099500">পাছৱৰ্ড যোগ দিয়ক</translation> +<translation id="8953046091948372197">ইয়াত আপুনি নিজৰ পাছৱৰ্ডসমূহ বিচাৰি পাব</translation> <translation id="895541991026785598">কোনো সমস্যাৰ অভিযোগ দিয়ক</translation> <translation id="8974714402877957201">১) iPadৰ ছেটিং খোলক</translation> <translation id="8976382372951310360">সহায়</translation> @@ -1007,6 +1011,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> দিন আগতে</translation> <translation id="9203116392574189331">হেণ্ডঅফ</translation> <translation id="9223358826628549784">ক্ৰেশ্ব ৰিপর্ট পঠিওৱা হ’ল।</translation> +<translation id="941747855997058526">পাছৱৰ্ড বাছনি কৰক...</translation> <translation id="952704832371081537">বাতিল কৰক</translation> <translation id="959066944189734975">আপুনি <ph name="CHANNEL_NAME" />ক ফ’ল’ কৰি আছে</translation> <translation id="981498610235328462">আপোনাৰ প্ৰতিষ্ঠানে আপোনাক কেৱল কিছুমান নিৰ্দিষ্ট একাউণ্টৰ জৰিয়তেহে ছাইন ইন কৰিবলৈ দিয়ে। অনুমতি নথকা একাউণ্টসমূহ লুকুৱাই ৰখা হয়।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index bdc647f2..a75555d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Hamısını Oxunmuş Kimi Qeyd Edin</translation> <translation id="1689333818294560261">Ləqəb</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> seçildi</translation> +<translation id="1715515772563243997"><ph name="SITE" /> mənbəyinə etibar edirsinizsə, saxlanmış parolu giriş üçün istifadə edə bilərsiniz.</translation> <translation id="1740468249224277719">Yükləmək üçün iki dəfə tıklayın.</translation> <translation id="1752547299766512813">Parolları Yadda saxlayın</translation> <translation id="1753905327828125965">Ən çox ziyarət olunan</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Əlfəcinə düzəliş edin</translation> <translation id="2155145621546387786">Chrome'u paylaşın</translation> <translation id="2175927920773552910">QR Kod</translation> +<translation id="2178545675770638239">Parol Seçin</translation> <translation id="2218443599109088993">Kiçildin</translation> <translation id="2230173723195178503">Veb səhifə yükləndi</translation> <translation id="2239626343334228536">Brauzinq datası silinir...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">İndi Yoxlayın</translation> <translation id="4505980578794259603">Sonuncu yoxlama: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Giriş reklamını bağlayın</translation> +<translation id="4514889972748124117">Güclü Parol Təklif Edin...</translation> <translation id="4520798012560649652">Anonim rejimi haqqında ətraflı məlumat</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> linkində yadda saxlanılmış parollarınıza baxın və idarə edin</translation> <translation id="452750746583162491">Sinxronlaşdırılmış datanızı nəzərdən keçirin</translation> @@ -1016,6 +1019,7 @@ <translation id="8917490105272468696">Bəli, razıyam</translation> <translation id="8928133177108699615">Masaüstü</translation> <translation id="8952559610785099500">Parol əlavə edin</translation> +<translation id="8953046091948372197">Parolları burada tapa bilərsiniz</translation> <translation id="895541991026785598">Problemi Xəbər verin</translation> <translation id="8974714402877957201">1. iPad Ayarlarını açın</translation> <translation id="8976382372951310360">Yardım</translation> @@ -1049,6 +1053,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> gün əvvəl</translation> <translation id="9203116392574189331">Əldən-ələ</translation> <translation id="9223358826628549784">Xəta hesabatı göndərildi.</translation> +<translation id="941747855997058526">Parol seçin...</translation> <translation id="952704832371081537">Ləğv edin</translation> <translation id="953008885340860025">Chrome'dan çıxılıb</translation> <translation id="959066944189734975"><ph name="CHANNEL_NAME" /> kanalını izləyirsiniz</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 189da8b..2b7147e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -434,6 +434,7 @@ <translation id="4502566650163919158">Comprova ara</translation> <translation id="4505980578794259603">Última comprovació: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Tanca la promoció d'inici de sessió</translation> +<translation id="4520798012560649652">Més informació sobre el mode d'incògnit</translation> <translation id="4526249700380860531">Consulta i gestiona les contrasenyes desades a <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Revisa les teves dades sincronitzades</translation> <translation id="4536418791685807335">Prova d'iniciar la sessió de nou.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index 420e8c92..be8b137 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -437,6 +437,7 @@ <translation id="4505980578794259603">Poslední kontrola: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Zavřít propagační zprávu ohledně přihlášení</translation> <translation id="4514889972748124117">Navrhnout silné heslo…</translation> +<translation id="4520798012560649652">Další informace o anonymním režimu</translation> <translation id="4526249700380860531">Uložená hesla můžete zobrazit a upravit na adrese <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Zkontrolovat synchronizovaná data</translation> <translation id="4536418791685807335">Zkuste se přihlásit znovu.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index 0c3ec6024..a46c332 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -437,6 +437,7 @@ <translation id="4505980578794259603">Gwiriwyd ddiwethaf: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Cau'r anogwr mewngofnodi</translation> <translation id="4514889972748124117">Awgrymu Cyfrinair Cryf...</translation> +<translation id="4520798012560649652">Dysgu rhagor am y modd Anhysbys</translation> <translation id="4526249700380860531">Gallwch weld a rheoli cyfrineiriau sydd wedi'u cadw yn <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Adolygwch eich data a gysonwyd</translation> <translation id="4536418791685807335">Rhowch gynnig arall ar fewngofnodi.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index b05bc20..7ef6982 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Markér alle som læste</translation> <translation id="1689333818294560261">Kaldenavn</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> valgt</translation> +<translation id="1715515772563243997">Hvis du har tillid til <ph name="SITE" />, kan du bruge en gemt adgangskode til at logge ind.</translation> <translation id="1740468249224277719">Tryk to gange for at installere.</translation> <translation id="1752547299766512813">Gem adgangskoder</translation> <translation id="1753905327828125965">Mest besøgte</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Rediger bogmærke</translation> <translation id="2155145621546387786">Del Chrome</translation> <translation id="2175927920773552910">QR-kode</translation> +<translation id="2178545675770638239">Vælg adgangskode</translation> <translation id="2218443599109088993">Zoom ud</translation> <translation id="2230173723195178503">Websiden er indlæst</translation> <translation id="2239626343334228536">Browserdata ryddes...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Tjek nu</translation> <translation id="4505980578794259603">Senest tjekket <ph name="TIME" />.</translation> <translation id="4508750114462689118">Luk loginkampagne</translation> +<translation id="4514889972748124117">Foreslå en stærk adgangskode...</translation> <translation id="4520798012560649652">Få flere oplysninger om inkognitotilstand</translation> <translation id="4526249700380860531">Se og administrer gemte adgangskoder på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Gennemgå dine synkroniserede data</translation> @@ -1016,6 +1019,7 @@ <translation id="8917490105272468696">Ja tak</translation> <translation id="8928133177108699615">Computer</translation> <translation id="8952559610785099500">Tilføj adgangskode</translation> +<translation id="8953046091948372197">Her finder du dine adgangskoder</translation> <translation id="895541991026785598">Rapportér et problem</translation> <translation id="8974714402877957201">1. Åbn iPad-indstillingerne</translation> <translation id="8976382372951310360">Hjælp</translation> @@ -1049,6 +1053,7 @@ <translation id="9200875785104711666">For <ph name="TIME" /> d. siden</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Der er sendt en nedbrudsrapport.</translation> +<translation id="941747855997058526">Vælg adgangskode...</translation> <translation id="952704832371081537">Annuller</translation> <translation id="953008885340860025">Chrome er logget ud</translation> <translation id="959066944189734975">Du følger <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 5293e5c..5715336 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Alle als gelesen markieren</translation> <translation id="1689333818294560261">Alias</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ausgewählt</translation> +<translation id="1715515772563243997">Wenn du <ph name="SITE" /> vertraust, kannst du ein gespeichertes Passwort zur Anmeldung verwenden.</translation> <translation id="1740468249224277719">Tippe hier doppelt, um die Installation zu starten.</translation> <translation id="1752547299766512813">Passwörter speichern</translation> <translation id="1753905327828125965">Meistbesucht</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Lesezeichen bearbeiten</translation> <translation id="2155145621546387786">Chrome teilen</translation> <translation id="2175927920773552910">QR-Code</translation> +<translation id="2178545675770638239">Passwort auswählen</translation> <translation id="2218443599109088993">Herauszoomen</translation> <translation id="2230173723195178503">Webseite geladen</translation> <translation id="2239626343334228536">Browserdaten werden gelöscht…</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Jetzt prüfen</translation> <translation id="4505980578794259603">Letzte Überprüfung: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Anmeldeangebot schließen</translation> +<translation id="4514889972748124117">Starkes Passwort vorschlagen…</translation> <translation id="4526249700380860531">Unter <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> gespeicherte Passwörter aufrufen und verwalten</translation> <translation id="452750746583162491">Synchronisierte Daten prüfen</translation> <translation id="4536418791685807335">Melde dich noch einmal an.</translation> @@ -1015,6 +1018,7 @@ <translation id="8917490105272468696">Ja, bitte</translation> <translation id="8928133177108699615">Computer</translation> <translation id="8952559610785099500">Passwort hinzufügen</translation> +<translation id="8953046091948372197">Hier werden deine Lesezeichen angezeigt</translation> <translation id="895541991026785598">Problem melden</translation> <translation id="8974714402877957201">1. Öffne die iPad-Einstellungen</translation> <translation id="8976382372951310360">Hilfe</translation> @@ -1048,6 +1052,7 @@ <translation id="9200875785104711666">vor <ph name="TIME" /> Tg.</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Absturzbericht wurde gesendet.</translation> +<translation id="941747855997058526">Passwort auswählen…</translation> <translation id="952704832371081537">Abbrechen</translation> <translation id="953008885340860025">Von Chrome abgemeldet</translation> <translation id="959066944189734975">Du folgst „<ph name="CHANNEL_NAME" />“</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 808a5fb..0181cca 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Επισήμανση όλων ως αναγνωσμένων</translation> <translation id="1689333818294560261">Ψευδώνυμο</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> στοιχεία επιλεγμένα</translation> +<translation id="1715515772563243997">Εάν εμπιστεύεστε την προέλευση <ph name="SITE" />, μπορείτε να χρησιμοποιήσετε έναν αποθηκευμένο κωδικό πρόσβασης για σύνδεση.</translation> <translation id="1740468249224277719">Πατήστε δύο φορές για εγκατάσταση.</translation> <translation id="1752547299766512813">Απ. κωδ. πρόσβ.</translation> <translation id="1753905327828125965">Πιο Δημοφιλή</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Επεξεργασία σελιδοδείκτη</translation> <translation id="2155145621546387786">Κοινοποίηση του Chrome</translation> <translation id="2175927920773552910">Κωδικός QR</translation> +<translation id="2178545675770638239">Επιλογή κωδικού πρόσβασης</translation> <translation id="2218443599109088993">Σμίκρυνση</translation> <translation id="2230173723195178503">Η ιστοσελίδα φορτώθηκε</translation> <translation id="2239626343334228536">Διαγραφή δεδομένων περιήγησης…</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Έλεγχος τώρα</translation> <translation id="4505980578794259603">Τελευταίος έλεγχος: <ph name="TIME" /></translation> <translation id="4508750114462689118">Κλείσιμο προσφοράς σύνδεσης</translation> +<translation id="4514889972748124117">Πρόταση ισχυρού κωδικού πρόσβασης…</translation> <translation id="4520798012560649652">Μάθετε περισσότερα σχετικά με την κατάσταση ανώνυμης περιήγησης.</translation> <translation id="4526249700380860531">Προβολή και διαχείριση των αποθηκευμένων κωδικών πρόσβασης στη διεύθυνση <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Έλεγχος συγχρονισμένων δεδομένων</translation> @@ -1017,6 +1020,7 @@ <translation id="8917490105272468696">Ναι, συμφωνώ</translation> <translation id="8928133177108699615">Για υπολογιστή</translation> <translation id="8952559610785099500">Προσθήκη κωδικού πρόσβασης</translation> +<translation id="8953046091948372197">Εδώ θα βρείτε τους κωδικούς πρόσβασής σας</translation> <translation id="895541991026785598">Αναφορά προβλήματος</translation> <translation id="8974714402877957201">1. Ανοίξτε τις Ρυθμίσεις του iPad</translation> <translation id="8976382372951310360">Βοήθεια</translation> @@ -1050,6 +1054,7 @@ <translation id="9200875785104711666">Πριν από <ph name="TIME" /> ημ.</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Η αναφορά σφάλματος εστάλη.</translation> +<translation id="941747855997058526">Επιλογή κωδικού πρόσβασης…</translation> <translation id="952704832371081537">Ακύρωση</translation> <translation id="953008885340860025">Έγινε αποσύνδεση από το Chrome</translation> <translation id="959066944189734975">Ακολουθείτε το κανάλι <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 9993ac7..18637f88 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Marcar todo como leído</translation> <translation id="1689333818294560261">Apodo</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> seleccionados</translation> +<translation id="1715515772563243997">Si confías en <ph name="SITE" />, puedes usar una contraseña guardada para iniciar sesión.</translation> <translation id="1740468249224277719">Toca dos veces para instalar.</translation> <translation id="1752547299766512813">Guardar contraseñas</translation> <translation id="1753905327828125965">Más visitado</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Editar marcador</translation> <translation id="2155145621546387786">Compartir Chrome</translation> <translation id="2175927920773552910">Código QR</translation> +<translation id="2178545675770638239">Selecciona una contraseña</translation> <translation id="2218443599109088993">Reducir</translation> <translation id="2230173723195178503">Página web cargada</translation> <translation id="2239626343334228536">Borrando datos de navegación...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Comprobar ahora</translation> <translation id="4505980578794259603">Última comprobación: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Cierra el inicio de sesión en la promoción</translation> +<translation id="4514889972748124117">Sugerir contraseña segura...</translation> <translation id="4526249700380860531">Consulta y gestiona las contraseñas guardadas en la página <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Revisar los datos sincronizados</translation> <translation id="4536418791685807335">Prueba a iniciar sesión de nuevo.</translation> @@ -1015,6 +1018,7 @@ <translation id="8917490105272468696">Sí, acepto</translation> <translation id="8928133177108699615">Ordenador</translation> <translation id="8952559610785099500">Añadir contraseña</translation> +<translation id="8953046091948372197">Aquí verás tus contraseñas</translation> <translation id="895541991026785598">Notificar un problema</translation> <translation id="8974714402877957201">1. Abre los ajustes del iPad</translation> <translation id="8976382372951310360">Ayuda</translation> @@ -1048,6 +1052,7 @@ <translation id="9200875785104711666">Hace <ph name="TIME" /> d</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Informe sobre fallos enviado.</translation> +<translation id="941747855997058526">Seleccionar contraseña...</translation> <translation id="952704832371081537">Cancelar</translation> <translation id="953008885340860025">Se ha cerrado sesión en Chrome</translation> <translation id="959066944189734975">Estás siguiendo a <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 9b0df6e7..fd157fe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Märgi kõik loetuks</translation> <translation id="1689333818294560261">Hüüdnimi</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> valitud</translation> +<translation id="1715515772563243997">Kui usaldate saiti <ph name="SITE" />, saate sisselogimiseks kasutada salvestatud parooli.</translation> <translation id="1740468249224277719">Installimiseks topeltpuudutage.</translation> <translation id="1752547299766512813">Paroolide salv.</translation> <translation id="1753905327828125965">Enim külastatud</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Muuda järjehoidjat</translation> <translation id="2155145621546387786">Chrome'i jagamine</translation> <translation id="2175927920773552910">QR-kood</translation> +<translation id="2178545675770638239">Parooli valimine</translation> <translation id="2218443599109088993">Suumi välja</translation> <translation id="2230173723195178503">Veebileht laaditi</translation> <translation id="2239626343334228536">Sirvimisandmete kustutamine …</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Kontrolli kohe</translation> <translation id="4505980578794259603">Viimati kontrollitud <ph name="TIME" /></translation> <translation id="4508750114462689118">Sule sisselogimisviip</translation> +<translation id="4514889972748124117">Soovita tugevat parooli …</translation> <translation id="4520798012560649652">Lisateave inkognito režiimi kohta</translation> <translation id="4526249700380860531">Vaadake ja hallake salvestatud paroole saidil <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Vaadake oma sünkroonitud andmed üle</translation> @@ -1016,6 +1019,7 @@ <translation id="8917490105272468696">Jah, olen nõus</translation> <translation id="8928133177108699615">Lauaarvuti</translation> <translation id="8952559610785099500">Parooli lisamine</translation> +<translation id="8953046091948372197">Oma paroolid leiate siit</translation> <translation id="895541991026785598">Teavitage probleemist</translation> <translation id="8974714402877957201">1. Avage iPadi rakendus Settings</translation> <translation id="8976382372951310360">Abi</translation> @@ -1049,6 +1053,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> p tagasi</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Krahhiaruanne on saadetud.</translation> +<translation id="941747855997058526">Valige parool …</translation> <translation id="952704832371081537">Tühista</translation> <translation id="953008885340860025">Olete Chrome'ist välja logitud</translation> <translation id="959066944189734975">Jälgite kanalit <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 548f29eb..f033f0bc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">علامتگذاری همه بهعنوان خواندهشده</translation> <translation id="1689333818294560261">نام مستعار</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> نشانک انتخاب شده است</translation> +<translation id="1715515772563243997">اگر به <ph name="SITE" /> اعتماد دارید، میتوانید از گذرواژه ذخیرهشده برای ورود به سیستم استفاده کنید.</translation> <translation id="1740468249224277719">برای نصب دو ضربه سریع بزنید.</translation> <translation id="1752547299766512813">ذخیره گذرواژهها</translation> <translation id="1753905327828125965">بیشترین موارد بازدید شده</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">ویرایش نشانک</translation> <translation id="2155145621546387786">همرسانی Chrome</translation> <translation id="2175927920773552910">رمزینه پاسخسریع</translation> +<translation id="2178545675770638239">انتخاب گذرواژه</translation> <translation id="2218443599109088993">کوچک کردن</translation> <translation id="2230173723195178503">صفحه وب بار شد</translation> <translation id="2239626343334228536">درحال پاک کردن دادههای محصول مرور…</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">اکنون بررسی شود</translation> <translation id="4505980578794259603">آخرین بررسی: <ph name="TIME" />.</translation> <translation id="4508750114462689118">بستن تبلیغ ورود به سیستم</translation> +<translation id="4514889972748124117">پیشنهاد گذرواژهای قوی…</translation> <translation id="4520798012560649652">درباره «حالت ناشناس» بیشتر بدانید</translation> <translation id="4526249700380860531">مشاهده و مدیریت گذرواژههای ذخیره شده در <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">مرور دادههای همگامسازیشده</translation> @@ -1016,6 +1019,7 @@ <translation id="8917490105272468696">بله، موافقم</translation> <translation id="8928133177108699615">رایانه</translation> <translation id="8952559610785099500">افزودن گذرواژه</translation> +<translation id="8953046091948372197">گذرواژههایتان را اینجا خواهید دید</translation> <translation id="895541991026785598">گزارش یک مسئله</translation> <translation id="8974714402877957201">۱. iPad Settings (تنظیمات iPad) را باز کنید</translation> <translation id="8976382372951310360">راهنما</translation> @@ -1049,6 +1053,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> روز قبل</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">گزارش خرابی ارسال شد.</translation> +<translation id="941747855997058526">انتخاب گذرواژه…</translation> <translation id="952704832371081537">لغو</translation> <translation id="953008885340860025">Chrome از سیستم خارج شده است</translation> <translation id="959066944189734975"><ph name="CHANNEL_NAME" /> را دنبال میکنید</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index dd5f744b..9c21f542 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Markahan ang Lahat Bilang Nabasa Na</translation> <translation id="1689333818294560261">Nickname</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ang napili</translation> +<translation id="1715515772563243997">Kung pinagkakatiwalaan mo ang <ph name="SITE" />, puwede kang gumamit ng naka-save na password para mag-sign in.</translation> <translation id="1740468249224277719">I-double tap upang i-install.</translation> <translation id="1752547299766512813">I-save ang Mga Password</translation> <translation id="1753905327828125965">Most Visited</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">I-edit ang Bookmark</translation> <translation id="2155145621546387786">Ibahagi ang Chrome</translation> <translation id="2175927920773552910">QR Code</translation> +<translation id="2178545675770638239">Pumili ng Password</translation> <translation id="2218443599109088993">Zoom Out</translation> <translation id="2230173723195178503">Na-load na ang webpage</translation> <translation id="2239626343334228536">Kini-clear ang data sa pag-browse...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Suriin Ngayon</translation> <translation id="4505980578794259603">Huling nasuri noong <ph name="TIME" />.</translation> <translation id="4508750114462689118">Isara ang promo sa pag-sign in</translation> +<translation id="4514889972748124117">Magmungkahi ng Malakas na Password...</translation> <translation id="4520798012560649652">Matuto pa tungkol sa Incognito mode</translation> <translation id="4526249700380860531">Tingnan at pamahalaan ang mga naka-save na password sa <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Suriin ang iyong naka-sync na data</translation> @@ -1016,6 +1019,7 @@ <translation id="8917490105272468696">Oo, Tinatanggap Ko</translation> <translation id="8928133177108699615">Desktop</translation> <translation id="8952559610785099500">Magdagdag ng Password</translation> +<translation id="8953046091948372197">Makikita mo rito ang iyong mga password</translation> <translation id="895541991026785598">Mag-ulat ng Isyu</translation> <translation id="8974714402877957201">1. Buksan ang Mga Setting ng iPad</translation> <translation id="8976382372951310360">Tulong</translation> @@ -1049,6 +1053,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> (na) araw na ang nakalipas</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Nagpadala ng ulat sa pag-crash.</translation> +<translation id="941747855997058526">Pumili ng Password...</translation> <translation id="952704832371081537">Kanselahin</translation> <translation id="953008885340860025">Naka-sign Out ang Chrome</translation> <translation id="959066944189734975">Sinusubaybayan mo ang <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index bff9ed7c..69dac7e4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Tandai Semua Sudah Dibaca</translation> <translation id="1689333818294560261">Nama panggilan</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> dipilih</translation> +<translation id="1715515772563243997">Jika Anda memercayai <ph name="SITE" />, Anda dapat menggunakan sandi tersimpan untuk login.</translation> <translation id="1740468249224277719">Ketuk dua kali untuk memasang.</translation> <translation id="1752547299766512813">Simpan Sandi</translation> <translation id="1753905327828125965">Sering Dibuka</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Edit Bookmark</translation> <translation id="2155145621546387786">Bagikan Chrome</translation> <translation id="2175927920773552910">Kode QR</translation> +<translation id="2178545675770638239">Pilih Sandi</translation> <translation id="2218443599109088993">Perkecil</translation> <translation id="2230173723195178503">Halaman web dimuat</translation> <translation id="2239626343334228536">Menghapus data browsing...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Periksa Sekarang</translation> <translation id="4505980578794259603">Terakhir diperiksa <ph name="TIME" />.</translation> <translation id="4508750114462689118">Tutup promo login</translation> +<translation id="4514889972748124117">Sarankan Sandi Kuat ...</translation> <translation id="4526249700380860531">Melihat dan mengelola sandi yang tersimpan di <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Tinjau data Anda yang disinkronkan</translation> <translation id="4536418791685807335">Coba masuk lagi.</translation> @@ -1015,6 +1018,7 @@ <translation id="8917490105272468696">Ya, Saya Setuju</translation> <translation id="8928133177108699615">Desktop</translation> <translation id="8952559610785099500">Tambahkan Sandi</translation> +<translation id="8953046091948372197">Sandi Anda akan ditampilkan di sini</translation> <translation id="895541991026785598">Laporkan Masalah</translation> <translation id="8974714402877957201">1. Buka Settings di iPad</translation> <translation id="8976382372951310360">Bantuan</translation> @@ -1048,6 +1052,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> h lalu</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Laporan kerusakan terkirim.</translation> +<translation id="941747855997058526">Pilih Sandi ...</translation> <translation id="952704832371081537">Batal</translation> <translation id="953008885340860025">Chrome Telah Logout</translation> <translation id="959066944189734975">Anda mengikuti <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index a01b714..743ca28 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -434,6 +434,7 @@ <translation id="4502566650163919158">Athuga núna</translation> <translation id="4505980578794259603">Síðast skoðað <ph name="TIME" />.</translation> <translation id="4508750114462689118">Loka innskráningarkynningu</translation> +<translation id="4520798012560649652">Nánar um huliðsstillingu</translation> <translation id="4526249700380860531">Skoða og hafa umsjón með vistuðum aðgangsorðum á <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Fara yfir samstillt gögn</translation> <translation id="4536418791685807335">Reyndu að skrá þig inn aftur.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index e24012f5..a269dbc9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">ყველას წაკითხულად მონიშვნა</translation> <translation id="1689333818294560261">მეტსახელი</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> არჩეულია</translation> +<translation id="1715515772563243997">თუ <ph name="SITE" />-ს ენდობით, შესასვლელად შეგიძლიათ გამოიყენოთ შენახული პაროლი.</translation> <translation id="1740468249224277719">დასაინსტალირებლად, შეეხეთ ორმაგად.</translation> <translation id="1752547299766512813">პაროლების შენახვა</translation> <translation id="1753905327828125965">ყველაზე ხშირად მონახულებადი</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">სანიშნის რედაქტირება</translation> <translation id="2155145621546387786">Chrome-ის გაზიარება</translation> <translation id="2175927920773552910">QR კოდი</translation> +<translation id="2178545675770638239">აირჩიეთ პაროლი</translation> <translation id="2218443599109088993">მასშტაბის შემცირება</translation> <translation id="2230173723195178503">ვებგვერდი ჩაიტვირთა</translation> <translation id="2239626343334228536">მიმდინარეობს დათვალიერების მონაცემების გასუფთავება…</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">ახლავე შემოწმება</translation> <translation id="4505980578794259603">ბოლო შემოწმება: <ph name="TIME" />.</translation> <translation id="4508750114462689118">შესვლის პრომო-ერთეულის დახურვა</translation> +<translation id="4514889972748124117">ძლიერი პაროლის შემოთავაზება...</translation> <translation id="4520798012560649652">შეიტყვეთ მეტი ინკოგნიტო რეჟიმის შესახებ</translation> <translation id="4526249700380860531">შენახული პაროლების ნახვა და მართვა შეგიძლიათ აქ: <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">სინქრონიზებული მონაცემების გადახედვა</translation> @@ -1016,6 +1019,7 @@ <translation id="8917490105272468696">დიახ, თანახმა ვარ</translation> <translation id="8928133177108699615">დესკტოპი</translation> <translation id="8952559610785099500">პაროლის დამატება</translation> +<translation id="8953046091948372197">აქ იპოვით თქვენს პაროლებს</translation> <translation id="895541991026785598">მოხსენება პრობლემის შესახებ</translation> <translation id="8974714402877957201">1. გახსენით iPad-ის პარამეტრები</translation> <translation id="8976382372951310360">დახმარება</translation> @@ -1049,6 +1053,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> დღის წინ</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">მოხსენება შეცდომების შესახებ გაიგზავნა.</translation> +<translation id="941747855997058526">პაროლის არჩევა...</translation> <translation id="952704832371081537">გაუქმება</translation> <translation id="953008885340860025">Chrome სისტემიდან გამოსულია</translation> <translation id="959066944189734975">თქვენ თვალს ადევნებთ <ph name="CHANNEL_NAME" />-ს</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index e73e17991..9dbaa98c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">모두 읽음으로 표시</translation> <translation id="1689333818294560261">닉네임</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" />개 항목 선택됨</translation> +<translation id="1715515772563243997"><ph name="SITE" /> 사이트를 신뢰하는 경우 저장된 비밀번호를 사용하여 로그인할 수 있습니다.</translation> <translation id="1740468249224277719">설치하려면 두 번 탭하세요.</translation> <translation id="1752547299766512813">비밀번호 저장</translation> <translation id="1753905327828125965">자주 방문한 페이지</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">북마크 수정</translation> <translation id="2155145621546387786">Chrome 공유</translation> <translation id="2175927920773552910">QR 코드</translation> +<translation id="2178545675770638239">비밀번호 선택</translation> <translation id="2218443599109088993">축소</translation> <translation id="2230173723195178503">웹페이지 로드됨</translation> <translation id="2239626343334228536">인터넷 사용 기록 삭제 중...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">지금 확인</translation> <translation id="4505980578794259603"><ph name="TIME" />에 마지막으로 확인함</translation> <translation id="4508750114462689118">로그인 프로모션 닫기</translation> +<translation id="4514889972748124117">안전한 비밀번호 추천...</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />에서 저장된 비밀번호 보기 및 관리</translation> <translation id="452750746583162491">동기화된 데이터 검토</translation> <translation id="4536418791685807335">다시 로그인해 주세요.</translation> @@ -1015,6 +1018,7 @@ <translation id="8917490105272468696">사용</translation> <translation id="8928133177108699615">데스크톱</translation> <translation id="8952559610785099500">비밀번호 추가</translation> +<translation id="8953046091948372197">여기에서 비밀번호를 확인할 수 있습니다.</translation> <translation id="895541991026785598">문제 신고</translation> <translation id="8974714402877957201">1. iPad 설정을 엽니다.</translation> <translation id="8976382372951310360">도움말</translation> @@ -1048,6 +1052,7 @@ <translation id="9200875785104711666"><ph name="TIME" />일 전</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">비정상 종료 보고서 전송 완료</translation> +<translation id="941747855997058526">비밀번호 선택...</translation> <translation id="952704832371081537">취소</translation> <translation id="953008885340860025">Chrome에서 로그아웃됨</translation> <translation id="959066944189734975"><ph name="CHANNEL_NAME" /> 채널을 팔로우 중입니다</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 978a8a3f..b0270a01 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -434,6 +434,7 @@ <translation id="4502566650163919158">ກວດເບິ່ງດຽວນີ້</translation> <translation id="4505980578794259603">ກວດສອບຫຼ້າສຸດເມື່ອ <ph name="TIME" />.</translation> <translation id="4508750114462689118">ປິດໂປຣໂມການເຂົ້າສູ່ລະບົບ</translation> +<translation id="4520798012560649652">ສຶກສາເພີ່ມເຕີມກ່ຽວກັບໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="4526249700380860531">ເບິ່ງ ແລະຈັດການລະຫັດຜ່ານໄດ້ຢູ່ທີ່ <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">ກວດເບິ່ງຂໍ້ມູນທີ່ຊິ້ງຂອງທ່ານ</translation> <translation id="4536418791685807335">ລອງເຂົ້າສູ່ລະບົບອີກຄັ້ງ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 684026f..b308996 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Бүгдийг уншсан гэж тэмдэглэх</translation> <translation id="1689333818294560261">Хоч</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> сонгогдсон</translation> +<translation id="1715515772563243997">Та <ph name="SITE" />-д итгэдэг бол нэвтрэхдээ хадгалсан нууц үгээ ашиглах боломжтой.</translation> <translation id="1740468249224277719">Суулгахын тулд хоёр удаа товшино уу.</translation> <translation id="1752547299766512813">Нууц үг хадгалах</translation> <translation id="1753905327828125965">Түгээмэл зочилсон</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Хадгалагдсан хуудсыг засах</translation> <translation id="2155145621546387786">Chrome-г хуваалцах</translation> <translation id="2175927920773552910">QR код</translation> +<translation id="2178545675770638239">Нууц үг сонгоно уу</translation> <translation id="2218443599109088993">Жижигрүүлэх</translation> <translation id="2230173723195178503">Веб хуудсыг ачаалласан</translation> <translation id="2239626343334228536">Хөтчийн өгөгдлийг устгаж байна...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Одоо шалгах</translation> <translation id="4505980578794259603">Сүүлд <ph name="TIME" /> шалгасан.</translation> <translation id="4508750114462689118">Нэвтрэх сурталчилгааг хаах</translation> +<translation id="4514889972748124117">Хүчтэй нууц үг санал болгох...</translation> <translation id="4520798012560649652">Нууцлалын горимын талаар нэмэлт мэдээлэл авах</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" />-д хадгалсан нууц үгээ нээж, удирдах</translation> <translation id="452750746583162491">Синк хийсэн өгөгдлөө шалгах</translation> @@ -1015,6 +1018,7 @@ <translation id="8917490105272468696">Тийм, би зөвшөөрч байна</translation> <translation id="8928133177108699615">Компьютер</translation> <translation id="8952559610785099500">Нууц үг нэмэх</translation> +<translation id="8953046091948372197">Та нууц үгнүүдээ эндээс олно</translation> <translation id="895541991026785598">Асуудлыг мэдэгдэх…</translation> <translation id="8974714402877957201">1. iPad-н тохиргоог нээнэ үү</translation> <translation id="8976382372951310360">Тусламж</translation> @@ -1048,6 +1052,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> өдрийн өмнө</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Алдаа ослын тайланг илгээсэн байна.</translation> +<translation id="941747855997058526">Нууц үг сонгох...</translation> <translation id="952704832371081537">Цуцлах</translation> <translation id="953008885340860025">Chrome-с гарсан</translation> <translation id="959066944189734975">Та <ph name="CHANNEL_NAME" />-г дагаж байна</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 741ae93..f350fa4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">सर्व वाचले चिन्हांकित करा</translation> <translation id="1689333818294560261">टोपणनाव</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> निवडले</translation> +<translation id="1715515772563243997"><ph name="SITE" /> वर तुमचा विश्वास असल्यास, साइन इन करण्यासाठी तुम्ही सेव्ह केलेला पासवर्ड वापरू शकता.</translation> <translation id="1740468249224277719">इंस्टॉल करण्यासाठी दोनदा टॅप करा.</translation> <translation id="1752547299766512813">पासवर्ड सेव्ह करा</translation> <translation id="1753905327828125965">सर्वाधिक भेट दिलेले</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">बुकमार्क संपादित करा</translation> <translation id="2155145621546387786">Chrome शेअर करा</translation> <translation id="2175927920773552910">QR कोड</translation> +<translation id="2178545675770638239">पासवर्ड निवडा</translation> <translation id="2218443599109088993">झूम आउट करा</translation> <translation id="2230173723195178503">वेबपेज लोड केले</translation> <translation id="2239626343334228536">ब्राउझिंग डेटा साफ करत आहे...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">आता तपासा</translation> <translation id="4505980578794259603">शेवटचे तपासले <ph name="TIME" />.</translation> <translation id="4508750114462689118">साइन-इन प्रोमो बंद करा</translation> +<translation id="4514889972748124117">क्लिष्ट पासवर्ड सुचवा...</translation> <translation id="4520798012560649652">गुप्त मोडबद्दल अधिक जाणून घ्या</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> वर सेव्ह केलेले पासवर्ड पहा आणि व्यवस्थापित करा</translation> @@ -1018,6 +1021,7 @@ <translation id="8917490105272468696">होय, मला मान्य आहे</translation> <translation id="8928133177108699615">डेस्कटॉप</translation> <translation id="8952559610785099500">पासवर्ड जोडा</translation> +<translation id="8953046091948372197">तुमचे पासवर्ड तुम्हाला येथे सापडतील</translation> <translation id="895541991026785598">समस्या नोंदवा</translation> <translation id="8974714402877957201">१. iPad सेटिंग्ज उघडा</translation> <translation id="8976382372951310360">मदत</translation> @@ -1051,6 +1055,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> दिवसांपूर्वी</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">क्रॅश अहवाल पाठवला.</translation> +<translation id="941747855997058526">पासवर्ड निवडा...</translation> <translation id="952704832371081537">रद्द करा</translation> <translation id="953008885340860025">Chrome साइन आउट केले आहे</translation> <translation id="959066944189734975">तुम्ही <ph name="CHANNEL_NAME" /> ला फॉलो करत आहात</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index 44fc3c1..105970a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">အားလုံးကို ဖတ်ပြီးကြောင်း အမှတ်အသားလုပ်ရန်</translation> <translation id="1689333818294560261">နာမည်ပြောင်</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ရွေးချယ်ထားသည်</translation> +<translation id="1715515772563243997"><ph name="SITE" /> ကို ယုံကြည်ပါက သိမ်းထားသည့် စကားဝှက်တစ်ခုကို လက်မှတ်ထိုးဝင်ရန် သုံးနိုင်သည်။</translation> <translation id="1740468249224277719">ထည့်သွင်းရန် နှစ်ချက်တို့ပါ။</translation> <translation id="1752547299766512813">စကားဝှက်များ သိမ်ဆည်းမည်</translation> <translation id="1753905327828125965">အများဆုံး ဝင်ကြည့်ခံခဲ့ရ</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">စာညှပ် တည်းဖြတ်ရန်</translation> <translation id="2155145621546387786">Chrome ကို မျှဝေရန်</translation> <translation id="2175927920773552910">QR ကုဒ်</translation> +<translation id="2178545675770638239">စကားဝှက် ရွေးပါ</translation> <translation id="2218443599109088993">ဇူးမ်ဖြုတ်ရန်</translation> <translation id="2230173723195178503">ဝဘ်စာမျက်နှာကို ဖွင့်ပြီးပါပြီ</translation> <translation id="2239626343334228536">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာများ ဖယ်ရှားနေသည်…</translation> @@ -434,6 +436,8 @@ <translation id="4502566650163919158">ယခု စစ်ကြည့်ရန်</translation> <translation id="4505980578794259603"><ph name="TIME" /> တွင် နောက်ဆုံးစစ်ဆေးခဲ့သည်။</translation> <translation id="4508750114462689118">လက်မှတ်ထိုးဝင်ထားသော ပရိုမိုးရှင်းများကို ပိတ်ရန်</translation> +<translation id="4514889972748124117">လုံခြုံမှုမြင့်သည့် စကားဝှက် အကြံပြုရန်…</translation> +<translation id="4520798012560649652">‘ရုပ်ဖျက်မုဒ်’ အကြောင်း ပိုမိုလေ့လာရန်</translation> <translation id="4526249700380860531"><ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> တွင် သိမ်းဆည်းထားသော စကားဝှက်များအား ကြည့်ပြီး စီမံပါ</translation> <translation id="452750746583162491">သင်စင့်ခ်လုပ်ထားသည့် ဒေတာများကို ပြန်စစ်ခြင်း</translation> <translation id="4536418791685807335">ထပ်မံ၍ လက်မှတ်ထိုးဝင်ကြည့်ပါ။</translation> @@ -1014,6 +1018,7 @@ <translation id="8917490105272468696">သဘောတူပါသည်</translation> <translation id="8928133177108699615">ဒက်စ်တော့</translation> <translation id="8952559610785099500">စကားဝှက် ထည့်ခြင်း</translation> +<translation id="8953046091948372197">သင့်စကားဝှက်ကို ဤနေရာတွင် တွေ့မည်</translation> <translation id="895541991026785598">ပြဿနာတစ်ခု အစီရင်ခံမည်</translation> <translation id="8974714402877957201">၁။ ‘iPad ဆက်တင်များ’ ဖွင့်ပါ</translation> <translation id="8976382372951310360">အကူအညီ</translation> @@ -1047,6 +1052,7 @@ <translation id="9200875785104711666">ပြီးခဲ့သော <ph name="TIME" /> d</translation> <translation id="9203116392574189331">လက်မပါဘဲ</translation> <translation id="9223358826628549784">ပျက်စီးမှု အစီရင်ခံစာကို ပေးပို့ပြီးပါပြီ။</translation> +<translation id="941747855997058526">စကားဝှက်ရွေးရန်…</translation> <translation id="952704832371081537">မလုပ်တော့</translation> <translation id="953008885340860025">Chrome ထွက်သွားသည်</translation> <translation id="959066944189734975"><ph name="CHANNEL_NAME" /> ကို လိုက်ကြည့်နေသည်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index e57ffee..dd2aea2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Merk alle som lest</translation> <translation id="1689333818294560261">Kallenavn</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> er valgt</translation> +<translation id="1715515772563243997">Hvis du stoler på <ph name="SITE" />, kan du logge på med et lagret passord.</translation> <translation id="1740468249224277719">Dobbelttrykk for å installere.</translation> <translation id="1752547299766512813">Lagre passord</translation> <translation id="1753905327828125965">Mest besøkt</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Rediger bokmerke</translation> <translation id="2155145621546387786">Del Chrome</translation> <translation id="2175927920773552910">QR-kode</translation> +<translation id="2178545675770638239">Velg passord</translation> <translation id="2218443599109088993">Zoom ut</translation> <translation id="2230173723195178503">Nettsiden er lastet inn</translation> <translation id="2239626343334228536">Sletter nettlesingsdata …</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Sjekk nå</translation> <translation id="4505980578794259603">Sist sjekket <ph name="TIME" />.</translation> <translation id="4508750114462689118">Lukk påloggingskampanjen</translation> +<translation id="4514889972748124117">Foreslå et sterkt passord…</translation> <translation id="4526249700380860531">Se og administrer lagrede passord på <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Gjennomgå de synkroniserte dataene dine</translation> <translation id="4536418791685807335">Prøv å logge på igjen.</translation> @@ -1015,6 +1018,7 @@ <translation id="8917490105272468696">Ja, den er grei</translation> <translation id="8928133177108699615">Datamaskin</translation> <translation id="8952559610785099500">Legg til et passord</translation> +<translation id="8953046091948372197">Her finner du passordene dine</translation> <translation id="895541991026785598">Rapporter et problem</translation> <translation id="8974714402877957201">1. Åpne iPad-innstillingene</translation> <translation id="8976382372951310360">Hjelp</translation> @@ -1048,6 +1052,7 @@ <translation id="9200875785104711666">for <ph name="TIME" /> d siden</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Programstopprapporten er sendt.</translation> +<translation id="941747855997058526">Velg passord…</translation> <translation id="952704832371081537">Avbryt</translation> <translation id="953008885340860025">Chrome er logget av</translation> <translation id="959066944189734975">Du følger <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index bb22b62..099553f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Marchează-le pe toate ca citite</translation> <translation id="1689333818294560261">Pseudonim</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> selectate</translation> +<translation id="1715515772563243997">Dacă ai încredere în <ph name="SITE" />, poți folosi o parolă salvată pentru a te conecta.</translation> <translation id="1740468249224277719">Atinge de două ori pentru a instala.</translation> <translation id="1752547299766512813">Salvează parole</translation> <translation id="1753905327828125965">Cele mai vizitate</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Editați marcajul</translation> <translation id="2155145621546387786">Permite accesul la Chrome</translation> <translation id="2175927920773552910">Cod QR</translation> +<translation id="2178545675770638239">Selectează o parolă</translation> <translation id="2218443599109088993">Micșorează</translation> <translation id="2230173723195178503">Pagina web s-a încărcat</translation> <translation id="2239626343334228536">Se șterg datele de navigare...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Verifică acum</translation> <translation id="4505980578794259603">Ultima verificare: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Închide mesajul promoțional de conectare</translation> +<translation id="4514889972748124117">Sugerează o parolă puternică</translation> <translation id="4526249700380860531">Vezi și gestionează parolele salvate la <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Examinează datele sincronizate</translation> <translation id="4536418791685807335">Încearcă să te conectezi din nou.</translation> @@ -1015,6 +1018,7 @@ <translation id="8917490105272468696">Da, accept</translation> <translation id="8928133177108699615">Computer</translation> <translation id="8952559610785099500">Adaugă parola</translation> +<translation id="8953046091948372197">Aici vei vedea parolele</translation> <translation id="895541991026785598">Raportați o problemă</translation> <translation id="8974714402877957201">1. Deschide Setările dispozitivului iPad.</translation> <translation id="8976382372951310360">Ajutor</translation> @@ -1048,6 +1052,7 @@ <translation id="9200875785104711666">acum <ph name="TIME" /> zile</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Raportul de blocare a fost trimis.</translation> +<translation id="941747855997058526">Selectează o parolă...</translation> <translation id="952704832371081537">Anulează</translation> <translation id="953008885340860025">Te-ai deconectat de la Chrome</translation> <translation id="959066944189734975">Urmărești <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index a6e8a5e..1bccf02 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -437,6 +437,7 @@ <translation id="4505980578794259603">Posledná kontrola: <ph name="TIME" /></translation> <translation id="4508750114462689118">Zavrieť propagáciu prihlásenia</translation> <translation id="4514889972748124117">Navrhnúť silné heslo…</translation> +<translation id="4520798012560649652">Ďalšie informácie o režime inkognito</translation> <translation id="4526249700380860531">Zobrazte si a spravujte uložené heslá na stránke <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Skontrolovať synchronizované údaje</translation> <translation id="4536418791685807335">Skúste sa znova prihlásiť.</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 a85163b..e0f14f9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Označi sve kao pročitano</translation> <translation id="1689333818294560261">Nadimak</translation> <translation id="1700629756560807968">Broj izabranih stavki je <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> +<translation id="1715515772563243997">Ako veb-sajt <ph name="SITE" /> smatrate pouzdanim, možete da koristite sačuvanu lozinku za prijavljivanje.</translation> <translation id="1740468249224277719">Dodirnite dvaput da biste instalirali.</translation> <translation id="1752547299766512813">Sačuvane lozinke</translation> <translation id="1753905327828125965">Najposećenije</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Izmenite obeleživač</translation> <translation id="2155145621546387786">Deli Chrome</translation> <translation id="2175927920773552910">QR kôd</translation> +<translation id="2178545675770638239">Izaberite lozinku</translation> <translation id="2218443599109088993">Umanjite</translation> <translation id="2230173723195178503">Veb-stranica je učitana</translation> <translation id="2239626343334228536">Brišu se podaci pregledanja...</translation> @@ -434,6 +436,8 @@ <translation id="4502566650163919158">Proveri</translation> <translation id="4505980578794259603">Poslednja provera: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Zatvori promociju za prijavljivanje</translation> +<translation id="4514889972748124117">Predloži jaku lozinku…</translation> +<translation id="4520798012560649652">Saznajte više o režimu bez arhiviranja</translation> <translation id="4526249700380860531">Pregledajte sačuvane lozinke i upravljajte njima na <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Pregledajte sinhronizovane podatke</translation> <translation id="4536418791685807335">Probajte ponovo da se prijavite.</translation> @@ -1015,6 +1019,7 @@ <translation id="8917490105272468696">Da, omogući</translation> <translation id="8928133177108699615">Računar</translation> <translation id="8952559610785099500">Dodajte lozinku</translation> +<translation id="8953046091948372197">Ovde ćete pronaći lozinke</translation> <translation id="895541991026785598">Prijavite problem</translation> <translation id="8974714402877957201">1. Otvorite podešavanja iPad-a</translation> <translation id="8976382372951310360">Pomoć</translation> @@ -1048,6 +1053,7 @@ <translation id="9200875785104711666">pre <ph name="TIME" /> d</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Izveštaj o otkazivanju je poslat.</translation> +<translation id="941747855997058526">Izaberite lozinku…</translation> <translation id="952704832371081537">Otkaži</translation> <translation id="953008885340860025">Odjavljeni ste iz Chrome-a</translation> <translation id="959066944189734975">Pratite <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 61c5c26..24d0c2b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Означи све као прочитано</translation> <translation id="1689333818294560261">Надимак</translation> <translation id="1700629756560807968">Број изабраних ставки је <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /></translation> +<translation id="1715515772563243997">Ако веб-сајт <ph name="SITE" /> сматрате поузданим, можете да користите сачувану лозинку за пријављивање.</translation> <translation id="1740468249224277719">Додирните двапут да бисте инсталирали.</translation> <translation id="1752547299766512813">Сачуване лозинке</translation> <translation id="1753905327828125965">Најпосећеније</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Измените обележивач</translation> <translation id="2155145621546387786">Дели Chrome</translation> <translation id="2175927920773552910">QR кôд</translation> +<translation id="2178545675770638239">Изаберите лозинку</translation> <translation id="2218443599109088993">Умањите</translation> <translation id="2230173723195178503">Веб-страница је учитана</translation> <translation id="2239626343334228536">Бришу се подаци прегледања...</translation> @@ -434,6 +436,8 @@ <translation id="4502566650163919158">Провери</translation> <translation id="4505980578794259603">Последња провера: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Затвори промоцију за пријављивање</translation> +<translation id="4514889972748124117">Предложи јаку лозинку…</translation> +<translation id="4520798012560649652">Сазнајте више о режиму без архивирања</translation> <translation id="4526249700380860531">Прегледајте сачуване лозинке и управљајте њима на <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Прегледајте синхронизоване податке</translation> <translation id="4536418791685807335">Пробајте поново да се пријавите.</translation> @@ -1015,6 +1019,7 @@ <translation id="8917490105272468696">Да, омогући</translation> <translation id="8928133177108699615">Рачунар</translation> <translation id="8952559610785099500">Додајте лозинку</translation> +<translation id="8953046091948372197">Овде ћете пронаћи лозинке</translation> <translation id="895541991026785598">Пријавите проблем</translation> <translation id="8974714402877957201">1. Отворите подешавања iPad-а</translation> <translation id="8976382372951310360">Помоћ</translation> @@ -1048,6 +1053,7 @@ <translation id="9200875785104711666">пре <ph name="TIME" /> д</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Извештај о отказивању је послат.</translation> +<translation id="941747855997058526">Изаберите лозинку…</translation> <translation id="952704832371081537">Откажи</translation> <translation id="953008885340860025">Одјављени сте из Chrome-а</translation> <translation id="959066944189734975">Пратите <ph name="CHANNEL_NAME" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 9789737..2980e33 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Hammasi o‘qildi</translation> <translation id="1689333818294560261">Nik</translation> <translation id="1700629756560807968"><ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> ta xatcho‘p tanlandi</translation> +<translation id="1715515772563243997"><ph name="SITE" /> saytiga ishonsangiz, kirish uchun saqlangan parolingizni ishlatishingiz mumkin.</translation> <translation id="1740468249224277719">O‘rnatish uchun ikki marta bosing.</translation> <translation id="1752547299766512813">Parollarni saqlash</translation> <translation id="1753905327828125965">Eng ko‘p ochilganlar</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Xatcho‘p tahriri</translation> <translation id="2155145621546387786">Chromeni ulashish</translation> <translation id="2175927920773552910">QR kod</translation> +<translation id="2178545675770638239">Parolni tanlang</translation> <translation id="2218443599109088993">Uzoqlashtirish</translation> <translation id="2230173723195178503">Veb-sahifa yuklandi</translation> <translation id="2239626343334228536">Brauzer tarixini tozalash...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Hozir tekshirish</translation> <translation id="4505980578794259603">Oxirgi marta: <ph name="TIME" /> da tekshirilgan.</translation> <translation id="4508750114462689118">Kirish reklamasini yopish</translation> +<translation id="4514889972748124117">Ishonchli parol yaratish...</translation> <translation id="4520798012560649652">Inkognito rejimi haqida batafsil</translation> <translation id="4526249700380860531">Saqlab olingan parollarni <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> sahifasi orqali ko‘ring va ularni boshqaring.</translation> <translation id="452750746583162491">Sinxronlangan maʼlumotlaringizni tekshiring</translation> @@ -1016,6 +1019,7 @@ <translation id="8917490105272468696">Ha, roziman</translation> <translation id="8928133177108699615">Ish stoli</translation> <translation id="8952559610785099500">Parol kiritish</translation> +<translation id="8953046091948372197">Parollaringiz shu yerda chiqadi</translation> <translation id="895541991026785598">Muammo haqida xabar yuborish</translation> <translation id="8974714402877957201">1. iPad sozlamalarini oching</translation> <translation id="8976382372951310360">Yordam</translation> @@ -1049,6 +1053,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> kun oldin</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">Ishdan chiqish hisoboti yuborildi.</translation> +<translation id="941747855997058526">Parolni tanlang...</translation> <translation id="952704832371081537">Bekor qilish</translation> <translation id="953008885340860025">Chrome hisobidan chiqarildi</translation> <translation id="959066944189734975"><ph name="CHANNEL_NAME" /> tasmasiga obuna boʻlgansiz</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index a53fbc99..7ff56ec4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -109,6 +109,7 @@ <translation id="1687475363370981210">Đánh dấu tất cả là đã đọc</translation> <translation id="1689333818294560261">Biệt hiệu</translation> <translation id="1700629756560807968">Đã chọn <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> dấu trang</translation> +<translation id="1715515772563243997">Nếu tin tưởng <ph name="SITE" />, bạn có thể sử dụng mật khẩu đã lưu để đăng nhập.</translation> <translation id="1740468249224277719">Nhấn đúp để cài đặt.</translation> <translation id="1752547299766512813">Lưu mật khẩu</translation> <translation id="1753905327828125965">Truy cập nhiều nhất</translation> @@ -151,6 +152,7 @@ <translation id="2149973817440762519">Chỉnh sửa dấu trang</translation> <translation id="2155145621546387786">Chia sẻ Chrome</translation> <translation id="2175927920773552910">Mã QR</translation> +<translation id="2178545675770638239">Chọn mật khẩu</translation> <translation id="2218443599109088993">Thu nhỏ</translation> <translation id="2230173723195178503">Đã tải trang web</translation> <translation id="2239626343334228536">Đang xóa dữ liệu duyệt web...</translation> @@ -434,6 +436,7 @@ <translation id="4502566650163919158">Kiểm tra ngay</translation> <translation id="4505980578794259603">Lần kiểm tra gần đây nhất: <ph name="TIME" />.</translation> <translation id="4508750114462689118">Đóng quảng cáo đăng nhập</translation> +<translation id="4514889972748124117">Đề xuất mật khẩu mạnh...</translation> <translation id="4526249700380860531">Xem và quản lý mật khẩu đã lưu tại <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /></translation> <translation id="452750746583162491">Xem lại các dữ liệu đã đồng bộ hóa của bạn</translation> <translation id="4536418791685807335">Thử đăng nhập lại.</translation> @@ -1015,6 +1018,7 @@ <translation id="8917490105272468696">Có, tôi đồng ý</translation> <translation id="8928133177108699615">Máy tính</translation> <translation id="8952559610785099500">Thêm mật khẩu</translation> +<translation id="8953046091948372197">Bạn sẽ thấy mật khẩu ở đây</translation> <translation id="895541991026785598">Báo cáo sự cố</translation> <translation id="8974714402877957201">1. Mở phần Cài đặt iPad</translation> <translation id="8976382372951310360">Trợ giúp</translation> @@ -1048,6 +1052,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> ngày trước</translation> <translation id="9203116392574189331">Tiếp nối</translation> <translation id="9223358826628549784">Đã gửi báo cáo lỗi.</translation> +<translation id="941747855997058526">Chọn mật khẩu...</translation> <translation id="952704832371081537">Hủy</translation> <translation id="953008885340860025">Bạn đã bị đăng xuất khỏi Chrome</translation> <translation id="959066944189734975">Bạn đang theo dõi <ph name="CHANNEL_NAME" /></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 bb060c05b..0009dc4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -109,7 +109,7 @@ <translation id="1687475363370981210">全部標示為已閱讀</translation> <translation id="1689333818294560261">暱稱</translation> <translation id="1700629756560807968">已選取 <ph name="NUMBER_OF_SELECTED_BOOKMARKS" /> 個項目</translation> -<translation id="1715515772563243997">如果你信任 <ph name="SITE" />,可以使用已儲存的密碼登入。</translation> +<translation id="1715515772563243997">如果您信任 <ph name="SITE" />,可使用已儲存的密碼登入。</translation> <translation id="1740468249224277719">輕按兩下即可安裝。</translation> <translation id="1752547299766512813">儲存密碼</translation> <translation id="1753905327828125965">最常瀏覽</translation> @@ -436,7 +436,7 @@ <translation id="4502566650163919158">立即檢查</translation> <translation id="4505980578794259603">上次檢查時間:<ph name="TIME" />。</translation> <translation id="4508750114462689118">閂登入宣傳元素</translation> -<translation id="4514889972748124117">建議高強度密碼...</translation> +<translation id="4514889972748124117">建議安全度高的密碼…</translation> <translation id="4526249700380860531">檢視及管理您在 <ph name="BEGIN_LINK" />passwords.google.com<ph name="END_LINK" /> 中已儲存的密碼</translation> <translation id="452750746583162491">查看您已同步的資料</translation> <translation id="4536418791685807335">請嘗試再次登入。</translation> @@ -1016,7 +1016,7 @@ <translation id="8917490105272468696">係,我同意</translation> <translation id="8928133177108699615">桌面模式</translation> <translation id="8952559610785099500">新增密碼</translation> -<translation id="8953046091948372197">這裡會顯示你的密碼</translation> +<translation id="8953046091948372197">這裡會顯示您的密碼</translation> <translation id="895541991026785598">回報問題</translation> <translation id="8974714402877957201">1. 開啟 iPad 的「設定」</translation> <translation id="8976382372951310360">說明</translation> @@ -1050,7 +1050,7 @@ <translation id="9200875785104711666"><ph name="TIME" /> 天前</translation> <translation id="9203116392574189331">Handoff</translation> <translation id="9223358826628549784">當機報告已送出。</translation> -<translation id="941747855997058526">選取密碼...</translation> +<translation id="941747855997058526">選取密碼…</translation> <translation id="952704832371081537">取消</translation> <translation id="953008885340860025">您已登出 Chrome</translation> <translation id="959066944189734975">您正在追蹤「<ph name="CHANNEL_NAME" />」</translation>
diff --git a/ios/chrome/browser/autofill/BUILD.gn b/ios/chrome/browser/autofill/BUILD.gn index 4186ea4..89675c0 100644 --- a/ios/chrome/browser/autofill/BUILD.gn +++ b/ios/chrome/browser/autofill/BUILD.gn
@@ -126,368 +126,9 @@ ] } -autofill_test_files = [ - "//components/test/data/autofill/heuristics/input/000_i18n_de.html", - "//components/test/data/autofill/heuristics/input/001_i18n_de2.html", - "//components/test/data/autofill/heuristics/input/002_i18n_en.html", - "//components/test/data/autofill/heuristics/input/003_i18n_es.html", - "//components/test/data/autofill/heuristics/input/004_i18n_fr.html", - "//components/test/data/autofill/heuristics/input/005_i18n_it.html", - "//components/test/data/autofill/heuristics/input/006_i18n_ja.html", - "//components/test/data/autofill/heuristics/input/007_i18n_ko.html", - "//components/test/data/autofill/heuristics/input/008_i18n_pt.html", - "//components/test/data/autofill/heuristics/input/009_i18n_ru.html", - "//components/test/data/autofill/heuristics/input/010_i18n_zh_cn.html", - "//components/test/data/autofill/heuristics/input/011_i18n_zh_tw.html", - "//components/test/data/autofill/heuristics/input/012_autocomplete_attribute_advanced.html", - "//components/test/data/autofill/heuristics/input/013_autocomplete_attribute_basic.html", - "//components/test/data/autofill/heuristics/input/014_autocomplete_attribute_invalid.html", - "//components/test/data/autofill/heuristics/input/015_autocomplete_attribute_malicious.html", - "//components/test/data/autofill/heuristics/input/016_misc_phones.html", - "//components/test/data/autofill/heuristics/input/017_checkout_advanceautoparts.com.html", - "//components/test/data/autofill/heuristics/input/018_checkout_ae.com.html", - "//components/test/data/autofill/heuristics/input/019_checkout_bedbathandbeyond.com.html", - "//components/test/data/autofill/heuristics/input/020_checkout_cafepress.com.html", - "//components/test/data/autofill/heuristics/input/021_checkout_cduniverse.com.html", - "//components/test/data/autofill/heuristics/input/022_checkout_crutchfield.com.html", - "//components/test/data/autofill/heuristics/input/023_checkout_gamestop.com.html", - "//components/test/data/autofill/heuristics/input/024_checkout_homedepot.com.html", - "//components/test/data/autofill/heuristics/input/025_checkout_hsn.com.html", - "//components/test/data/autofill/heuristics/input/026_checkout_ikea.com.html", - "//components/test/data/autofill/heuristics/input/027_checkout_jcrew.com.html", - "//components/test/data/autofill/heuristics/input/028_checkout_jr.com.html", - "//components/test/data/autofill/heuristics/input/029_checkout_kohls.com.html", - "//components/test/data/autofill/heuristics/input/030_checkout_lowes.com.html", - "//components/test/data/autofill/heuristics/input/031_checkout_macys.com.html", - "//components/test/data/autofill/heuristics/input/032_checkout_nordstrom.com.html", - "//components/test/data/autofill/heuristics/input/033_checkout_officemax.com.html", - "//components/test/data/autofill/heuristics/input/034_checkout_overstock.com.html", - "//components/test/data/autofill/heuristics/input/035_checkout_petco.com.html", - "//components/test/data/autofill/heuristics/input/036_checkout_petsmart.com.html", - "//components/test/data/autofill/heuristics/input/037_checkout_qvc.com.html", - "//components/test/data/autofill/heuristics/input/038_checkout_sears.com.html", - "//components/test/data/autofill/heuristics/input/039_checkout_target.com.html", - "//components/test/data/autofill/heuristics/input/040_checkout_urbanoutfitters.com.html", - "//components/test/data/autofill/heuristics/input/041_checkout_vitacost.com.html", - "//components/test/data/autofill/heuristics/input/042_checkout_williams-sonoma.com.html", - "//components/test/data/autofill/heuristics/input/043_register_adobe.com.html", - "//components/test/data/autofill/heuristics/input/044_register_amazon.com.html", - "//components/test/data/autofill/heuristics/input/045_register_aol.com.html", - "//components/test/data/autofill/heuristics/input/046_register_bestbuy.com.html", - "//components/test/data/autofill/heuristics/input/047_register_continental.com.html", - "//components/test/data/autofill/heuristics/input/048_register_deviantart.com.html", - "//components/test/data/autofill/heuristics/input/049_register_ebay.com.html", - "//components/test/data/autofill/heuristics/input/050_register_ecomm.dell.com.html", - "//components/test/data/autofill/heuristics/input/051_register_epson.com.html", - "//components/test/data/autofill/heuristics/input/052_register_google.com.html", - "//components/test/data/autofill/heuristics/input/053_register_gymboree.com.html", - "//components/test/data/autofill/heuristics/input/054_register_hotels.com.html", - "//components/test/data/autofill/heuristics/input/055_register_imdb.com.html", - "//components/test/data/autofill/heuristics/input/056_register_jbox.com.html", - "//components/test/data/autofill/heuristics/input/057_register_live.com.html", - "//components/test/data/autofill/heuristics/input/058_register_livejournal.com.html", - "//components/test/data/autofill/heuristics/input/059_register_macys.com.html", - "//components/test/data/autofill/heuristics/input/060_register_mcphee.com.html", - "//components/test/data/autofill/heuristics/input/061_register_myspace.com.html", - "//components/test/data/autofill/heuristics/input/062_register_newegg.com.html", - "//components/test/data/autofill/heuristics/input/063_register_officedepot.com.html", - "//components/test/data/autofill/heuristics/input/064_register_officemax.com.html", - "//components/test/data/autofill/heuristics/input/065_register_pyramidcollection.com.html", - "//components/test/data/autofill/heuristics/input/066_register_rediff.com.html", - "//components/test/data/autofill/heuristics/input/067_register_rei.com.html", - "//components/test/data/autofill/heuristics/input/068_register_rocketlawyer.com.html", - "//components/test/data/autofill/heuristics/input/069_register_signup.clicksor.com.html", - "//components/test/data/autofill/heuristics/input/070_register_signup.live.com.html", - "//components/test/data/autofill/heuristics/input/071_register_sourceforge.net.html", - "//components/test/data/autofill/heuristics/input/072_register_supershuttle.com.html", - "//components/test/data/autofill/heuristics/input/073_register_target.com.html", - "//components/test/data/autofill/heuristics/input/074_register_threadless.com.html", - "//components/test/data/autofill/heuristics/input/075_register_trueblue.jetblue.com.html", - "//components/test/data/autofill/heuristics/input/076_register_uhaul.com.html", - "//components/test/data/autofill/heuristics/input/077_register_yahoo.com.html", - "//components/test/data/autofill/heuristics/input/078_crbug_40687.html", - "//components/test/data/autofill/heuristics/input/079_crbug_52198.html", - "//components/test/data/autofill/heuristics/input/080_crbug_53075.html", - "//components/test/data/autofill/heuristics/input/081_crbug_64569.html", - "//components/test/data/autofill/heuristics/input/082_crbug_74918.html", - "//components/test/data/autofill/heuristics/input/083_crbug_87517.html", - "//components/test/data/autofill/heuristics/input/084_crbug_93595.html", - "//components/test/data/autofill/heuristics/input/085_crbug_98152.html", - "//components/test/data/autofill/heuristics/input/086_crbug_98269.html", - "//components/test/data/autofill/heuristics/input/087_crbug_98286.html", - "//components/test/data/autofill/heuristics/input/088_crbug_98338.html", - "//components/test/data/autofill/heuristics/input/089_crbug_224601.html", - "//components/test/data/autofill/heuristics/input/090_crbug_308839.html", - "//components/test/data/autofill/heuristics/input/091_crbug_433703.html", - "//components/test/data/autofill/heuristics/input/092_checkout_alaskaair.com.html", - "//components/test/data/autofill/heuristics/input/093_checkout_m_walmart.com.html", - "//components/test/data/autofill/heuristics/input/094_checkout_staples.com.html", - "//components/test/data/autofill/heuristics/input/095_landsend.html", - "//components/test/data/autofill/heuristics/input/096_llbean.html", - "//components/test/data/autofill/heuristics/input/097_register_alaskaair.com.html", - "//components/test/data/autofill/heuristics/input/098_register_epson.com.mx.html", - "//components/test/data/autofill/heuristics/input/099_checkout_address2lines.html", - "//components/test/data/autofill/heuristics/input/100_checkout_costco.com.html", - "//components/test/data/autofill/heuristics/input/101_checkout_m_bestbuy.com.html", - "//components/test/data/autofill/heuristics/input/102_checkout_m_macys.com.html", - "//components/test/data/autofill/heuristics/input/103_checkout_peapod.com.html", - "//components/test/data/autofill/heuristics/input/104_checkout_m_kohls.com.html", - "//components/test/data/autofill/heuristics/input/105_checkout_m_lowes.com.html", - "//components/test/data/autofill/heuristics/input/106_checkout_m_amazon.com.html", - "//components/test/data/autofill/heuristics/input/107_checkout_m_apple.com.html", - "//components/test/data/autofill/heuristics/input/108_checkout_m_gap.com.html", - "//components/test/data/autofill/heuristics/input/109_checkout_m_nordstroms.com.html", - "//components/test/data/autofill/heuristics/input/110_checkout_harryanddavid.com.html", - "//components/test/data/autofill/heuristics/input/111_checkout_virgin_america.com.html", - "//components/test/data/autofill/heuristics/input/112_checkout_m_llbean.com.html", - "//components/test/data/autofill/heuristics/input/113_guest_checkout_peapod.com.html", - "//components/test/data/autofill/heuristics/input/114_cc_checkout_wayfair.com.html", - "//components/test/data/autofill/heuristics/input/115_checkout_walgreens.com.html", - "//components/test/data/autofill/heuristics/input/116_cc_checkout_walgreens.com.html", - "//components/test/data/autofill/heuristics/input/117_cc_checkout_macys.com.html", - "//components/test/data/autofill/heuristics/input/118_checkout_cvs.com.html", - "//components/test/data/autofill/heuristics/input/119_bug_465571.html", - "//components/test/data/autofill/heuristics/input/120_bug_447332.html", - "//components/test/data/autofill/heuristics/input/121_bug_454366.html", - "//components/test/data/autofill/heuristics/input/122_bug_454366b.html", - "//components/test/data/autofill/heuristics/input/123_bug_459132.html", - "//components/test/data/autofill/heuristics/input/124_bug_460832.html", - "//components/test/data/autofill/heuristics/input/125_bug_462080.html", - "//components/test/data/autofill/heuristics/input/126_bug_463856.html", - "//components/test/data/autofill/heuristics/input/127_bug_463986.html", - "//components/test/data/autofill/heuristics/input/128_bug_464002.html", - "//components/test/data/autofill/heuristics/input/129_bug_465053.html", - "//components/test/data/autofill/heuristics/input/130_bug_465576.html", - "//components/test/data/autofill/heuristics/input/131_bug_465587.html", - "//components/test/data/autofill/heuristics/input/132_bug_469012.html", - "//components/test/data/autofill/heuristics/input/133_bug_469472.html", - "//components/test/data/autofill/heuristics/input/134_bug_471748.html", - "//components/test/data/autofill/heuristics/input/135_bug_471831.html", - "//components/test/data/autofill/heuristics/input/136_bug_497850.html", - "//components/test/data/autofill/heuristics/input/137_bug_555010.html", - "//components/test/data/autofill/heuristics/input/138_cc_checkout_united.com.html", - "//components/test/data/autofill/heuristics/input/139_bug_594475.html", - "//components/test/data/autofill/heuristics/input/140_checkout_nike.com.html", - "//components/test/data/autofill/heuristics/input/141_checkout_cc_keurig.com.html", - "//components/test/data/autofill/heuristics/input/142_cc_checkout_netaporter.com.html", - "//components/test/data/autofill/heuristics/input/143_cc_checkout_efollet.com.html", - "//components/test/data/autofill/heuristics/input/144_cc_checkout_m_jcp.com.html", - "//components/test/data/autofill/heuristics/input/145_hal-india.com.html", - "//components/test/data/autofill/heuristics/input/146_checkout_store.scholastic.com.html", - "//components/test/data/autofill/heuristics/input/147_panera.custhelp.com_app_ask.html", - "//components/test/data/autofill/heuristics/input/148_payment_dickblick.com.html", - "//components/test/data/autofill/heuristics/input/149_checkout_qvc.com_non_hidden.html", - "//components/test/data/autofill/heuristics/input/150_checkout_venus.com_search_field.html", - "//components/test/data/autofill/heuristics/input/151_ticketmaster.com.html", - "//components/test/data/autofill/heuristics/input/153_fmm-en_inm.gob.mx.html", - "//components/test/data/autofill/heuristics/input/154_fmm-es_inm.gob.mx.html", - "//components/test/data/autofill/heuristics/input/155_fmm-ja_inm.gob.mx.html", - "//components/test/data/autofill/heuristics/input/156_buyAlbum_bandcamp.com_price.html", - "//components/test/data/autofill/heuristics/input/157_bug_971402_opentable_checkout.html", - "//components/test/data/autofill/heuristics/input/158_i18n_ml.html", - "//components/test/data/autofill/heuristics/input/159_bug_966406_transavia.com.html", - "//components/test/data/autofill/heuristics/input/160_credit_card_ignore_birthday_fields.html", - "//components/test/data/autofill/heuristics/input/161_i18n_tr.html", - "//components/test/data/autofill/heuristics/input/162_i18n_tr2.html", - "//components/test/data/autofill/heuristics/input/163_giftcard_hotels.com.html", - "//components/test/data/autofill/heuristics/input/164_i18n_es_two_last_names_1.html", - "//components/test/data/autofill/heuristics/input/165_i18n_es_two_last_names_2.html", - "//components/test/data/autofill/heuristics/input/166_i18n_en_honorific_prefix.html", - "//components/test/data/autofill/heuristics/input/167_helity.es.html", - "//components/test/data/autofill/heuristics/input/168_i18n_hi.html", - "//components/test/data/autofill/heuristics/input/169_dominos_de.html", - "//components/test/data/autofill/heuristics/input/170_i18n_ru_structured_address_1.html", - "//components/test/data/autofill/heuristics/input/171_i18n_ru_structured_address_2.html", - "//components/test/data/autofill/heuristics/input/172_i18n_pt_structured_address_1.html", - "//components/test/data/autofill/heuristics/input/173_i18n_pt_structured_address_2.html", - "//components/test/data/autofill/heuristics/input/174_i18n_id.html", - "//components/test/data/autofill/heuristics/input/175_id_address_alfacart.com.html", - "//components/test/data/autofill/heuristics/input/176_id_payment_shopee.co.id.html", - "//components/test/data/autofill/heuristics/input/177_reichelt.html", - "//components/test/data/autofill/heuristics/input/178_zip_file_extension.html", - "//components/test/data/autofill/heuristics/input/179_twtcgirls.html", - "//components/test/data/autofill/heuristics/input/180_namesurname.html", - "//components/test/data/autofill/heuristics/output/000_i18n_de.out", - "//components/test/data/autofill/heuristics/output/001_i18n_de2.out", - "//components/test/data/autofill/heuristics/output/002_i18n_en.out", - "//components/test/data/autofill/heuristics/output/003_i18n_es.out", - "//components/test/data/autofill/heuristics/output/004_i18n_fr.out", - "//components/test/data/autofill/heuristics/output/005_i18n_it.out", - "//components/test/data/autofill/heuristics/output/006_i18n_ja.out", - "//components/test/data/autofill/heuristics/output/007_i18n_ko.out", - "//components/test/data/autofill/heuristics/output/008_i18n_pt.out", - "//components/test/data/autofill/heuristics/output/009_i18n_ru.out", - "//components/test/data/autofill/heuristics/output/010_i18n_zh_cn.out", - "//components/test/data/autofill/heuristics/output/011_i18n_zh_tw.out", - "//components/test/data/autofill/heuristics/output/012_autocomplete_attribute_advanced.out", - "//components/test/data/autofill/heuristics/output/013_autocomplete_attribute_basic.out", - "//components/test/data/autofill/heuristics/output/014_autocomplete_attribute_invalid.out", - "//components/test/data/autofill/heuristics/output/015_autocomplete_attribute_malicious.out", - "//components/test/data/autofill/heuristics/output/016_misc_phones.out", - "//components/test/data/autofill/heuristics/output/017_checkout_advanceautoparts.com.out", - "//components/test/data/autofill/heuristics/output/018_checkout_ae.com.out", - "//components/test/data/autofill/heuristics/output/019_checkout_bedbathandbeyond.com.out", - "//components/test/data/autofill/heuristics/output/020_checkout_cafepress.com.out", - "//components/test/data/autofill/heuristics/output/021_checkout_cduniverse.com.out", - "//components/test/data/autofill/heuristics/output/022_checkout_crutchfield.com.out", - "//components/test/data/autofill/heuristics/output/023_checkout_gamestop.com.out", - "//components/test/data/autofill/heuristics/output/024_checkout_homedepot.com.out", - "//components/test/data/autofill/heuristics/output/025_checkout_hsn.com.out", - "//components/test/data/autofill/heuristics/output/026_checkout_ikea.com.out", - "//components/test/data/autofill/heuristics/output/027_checkout_jcrew.com.out", - "//components/test/data/autofill/heuristics/output/028_checkout_jr.com.out", - "//components/test/data/autofill/heuristics/output/029_checkout_kohls.com.out", - "//components/test/data/autofill/heuristics/output/030_checkout_lowes.com.out", - "//components/test/data/autofill/heuristics/output/031_checkout_macys.com.out", - "//components/test/data/autofill/heuristics/output/032_checkout_nordstrom.com.out", - "//components/test/data/autofill/heuristics/output/033_checkout_officemax.com.out", - "//components/test/data/autofill/heuristics/output/034_checkout_overstock.com.out", - "//components/test/data/autofill/heuristics/output/035_checkout_petco.com.out", - "//components/test/data/autofill/heuristics/output/036_checkout_petsmart.com.out", - "//components/test/data/autofill/heuristics/output/037_checkout_qvc.com.out", - "//components/test/data/autofill/heuristics/output/038_checkout_sears.com.out", - "//components/test/data/autofill/heuristics/output/039_checkout_target.com.out", - "//components/test/data/autofill/heuristics/output/040_checkout_urbanoutfitters.com.out", - "//components/test/data/autofill/heuristics/output/041_checkout_vitacost.com.out", - "//components/test/data/autofill/heuristics/output/042_checkout_williams-sonoma.com.out", - "//components/test/data/autofill/heuristics/output/043_register_adobe.com.out", - "//components/test/data/autofill/heuristics/output/044_register_amazon.com.out", - "//components/test/data/autofill/heuristics/output/045_register_aol.com.out", - "//components/test/data/autofill/heuristics/output/046_register_bestbuy.com.out", - "//components/test/data/autofill/heuristics/output/047_register_continental.com.out", - "//components/test/data/autofill/heuristics/output/048_register_deviantart.com.out", - "//components/test/data/autofill/heuristics/output/049_register_ebay.com.out", - "//components/test/data/autofill/heuristics/output/050_register_ecomm.dell.com.out", - "//components/test/data/autofill/heuristics/output/051_register_epson.com.out", - "//components/test/data/autofill/heuristics/output/052_register_google.com.out", - "//components/test/data/autofill/heuristics/output/053_register_gymboree.com.out", - "//components/test/data/autofill/heuristics/output/054_register_hotels.com.out", - "//components/test/data/autofill/heuristics/output/055_register_imdb.com.out", - "//components/test/data/autofill/heuristics/output/056_register_jbox.com.out", - "//components/test/data/autofill/heuristics/output/057_register_live.com.out", - "//components/test/data/autofill/heuristics/output/058_register_livejournal.com.out", - "//components/test/data/autofill/heuristics/output/059_register_macys.com.out", - "//components/test/data/autofill/heuristics/output/060_register_mcphee.com.out", - "//components/test/data/autofill/heuristics/output/061_register_myspace.com.out", - "//components/test/data/autofill/heuristics/output/062_register_newegg.com.out", - "//components/test/data/autofill/heuristics/output/063_register_officedepot.com.out", - "//components/test/data/autofill/heuristics/output/064_register_officemax.com.out", - "//components/test/data/autofill/heuristics/output/065_register_pyramidcollection.com.out", - "//components/test/data/autofill/heuristics/output/066_register_rediff.com.out", - "//components/test/data/autofill/heuristics/output/067_register_rei.com.out", - "//components/test/data/autofill/heuristics/output/068_register_rocketlawyer.com.out", - "//components/test/data/autofill/heuristics/output/069_register_signup.clicksor.com.out", - "//components/test/data/autofill/heuristics/output/070_register_signup.live.com.out", - "//components/test/data/autofill/heuristics/output/071_register_sourceforge.net.out", - "//components/test/data/autofill/heuristics/output/072_register_supershuttle.com.out", - "//components/test/data/autofill/heuristics/output/073_register_target.com.out", - "//components/test/data/autofill/heuristics/output/074_register_threadless.com.out", - "//components/test/data/autofill/heuristics/output/075_register_trueblue.jetblue.com.out", - "//components/test/data/autofill/heuristics/output/076_register_uhaul.com.out", - "//components/test/data/autofill/heuristics/output/077_register_yahoo.com.out", - "//components/test/data/autofill/heuristics/output/078_crbug_40687.out", - "//components/test/data/autofill/heuristics/output/079_crbug_52198.out", - "//components/test/data/autofill/heuristics/output/080_crbug_53075.out", - "//components/test/data/autofill/heuristics/output/081_crbug_64569.out", - "//components/test/data/autofill/heuristics/output/082_crbug_74918.out", - "//components/test/data/autofill/heuristics/output/083_crbug_87517.out", - "//components/test/data/autofill/heuristics/output/084_crbug_93595.out", - "//components/test/data/autofill/heuristics/output/085_crbug_98152.out", - "//components/test/data/autofill/heuristics/output/086_crbug_98269.out", - "//components/test/data/autofill/heuristics/output/087_crbug_98286.out", - "//components/test/data/autofill/heuristics/output/088_crbug_98338.out", - "//components/test/data/autofill/heuristics/output/089_crbug_224601.out", - "//components/test/data/autofill/heuristics/output/090_crbug_308839.out", - "//components/test/data/autofill/heuristics/output/091_crbug_433703.out", - "//components/test/data/autofill/heuristics/output/092_checkout_alaskaair.com.out", - "//components/test/data/autofill/heuristics/output/093_checkout_m_walmart.com.out", - "//components/test/data/autofill/heuristics/output/094_checkout_staples.com.out", - "//components/test/data/autofill/heuristics/output/095_landsend.out", - "//components/test/data/autofill/heuristics/output/096_llbean.out", - "//components/test/data/autofill/heuristics/output/097_register_alaskaair.com.out", - "//components/test/data/autofill/heuristics/output/098_register_epson.com.mx.out", - "//components/test/data/autofill/heuristics/output/099_checkout_address2lines.out", - "//components/test/data/autofill/heuristics/output/100_checkout_costco.com.out", - "//components/test/data/autofill/heuristics/output/101_checkout_m_bestbuy.com.out", - "//components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out", - "//components/test/data/autofill/heuristics/output/103_checkout_peapod.com.out", - "//components/test/data/autofill/heuristics/output/104_checkout_m_kohls.com.out", - "//components/test/data/autofill/heuristics/output/105_checkout_m_lowes.com.out", - "//components/test/data/autofill/heuristics/output/106_checkout_m_amazon.com.out", - "//components/test/data/autofill/heuristics/output/107_checkout_m_apple.com.out", - "//components/test/data/autofill/heuristics/output/108_checkout_m_gap.com.out", - "//components/test/data/autofill/heuristics/output/109_checkout_m_nordstroms.com.out", - "//components/test/data/autofill/heuristics/output/110_checkout_harryanddavid.com.out", - "//components/test/data/autofill/heuristics/output/111_checkout_virgin_america.com.out", - "//components/test/data/autofill/heuristics/output/112_checkout_m_llbean.com.out", - "//components/test/data/autofill/heuristics/output/113_guest_checkout_peapod.com.out", - "//components/test/data/autofill/heuristics/output/114_cc_checkout_wayfair.com.out", - "//components/test/data/autofill/heuristics/output/115_checkout_walgreens.com.out", - "//components/test/data/autofill/heuristics/output/116_cc_checkout_walgreens.com.out", - "//components/test/data/autofill/heuristics/output/117_cc_checkout_macys.com.out", - "//components/test/data/autofill/heuristics/output/118_checkout_cvs.com.out", - "//components/test/data/autofill/heuristics/output/119_bug_465571.out", - "//components/test/data/autofill/heuristics/output/120_bug_447332.out", - "//components/test/data/autofill/heuristics/output/121_bug_454366.out", - "//components/test/data/autofill/heuristics/output/122_bug_454366b.out", - "//components/test/data/autofill/heuristics/output/123_bug_459132.out", - "//components/test/data/autofill/heuristics/output/124_bug_460832.out", - "//components/test/data/autofill/heuristics/output/125_bug_462080.out", - "//components/test/data/autofill/heuristics/output/126_bug_463856.out", - "//components/test/data/autofill/heuristics/output/127_bug_463986.out", - "//components/test/data/autofill/heuristics/output/128_bug_464002.out", - "//components/test/data/autofill/heuristics/output/129_bug_465053.out", - "//components/test/data/autofill/heuristics/output/130_bug_465576.out", - "//components/test/data/autofill/heuristics/output/131_bug_465587.out", - "//components/test/data/autofill/heuristics/output/132_bug_469012.out", - "//components/test/data/autofill/heuristics/output/133_bug_469472.out", - "//components/test/data/autofill/heuristics/output/134_bug_471748.out", - "//components/test/data/autofill/heuristics/output/135_bug_471831.out", - "//components/test/data/autofill/heuristics/output/136_bug_497850.out", - "//components/test/data/autofill/heuristics/output/137_bug_555010.out", - "//components/test/data/autofill/heuristics/output/138_cc_checkout_united.com.out", - "//components/test/data/autofill/heuristics/output/139_bug_594475.out", - "//components/test/data/autofill/heuristics/output/140_checkout_nike.com.out", - "//components/test/data/autofill/heuristics/output/141_checkout_cc_keurig.com.out", - "//components/test/data/autofill/heuristics/output/142_cc_checkout_netaporter.com.out", - "//components/test/data/autofill/heuristics/output/143_cc_checkout_efollet.com.out", - "//components/test/data/autofill/heuristics/output/144_cc_checkout_m_jcp.com.out", - "//components/test/data/autofill/heuristics/output/145_hal-india.com.out", - "//components/test/data/autofill/heuristics/output/146_checkout_store.scholastic.com.out", - "//components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out", - "//components/test/data/autofill/heuristics/output/148_payment_dickblick.com.out", - "//components/test/data/autofill/heuristics/output/149_checkout_qvc.com_non_hidden.out", - "//components/test/data/autofill/heuristics/output/150_checkout_venus.com_search_field.out", - "//components/test/data/autofill/heuristics/output/151_ticketmaster.com.out", - "//components/test/data/autofill/heuristics/output/153_fmm-en_inm.gob.mx.out", - "//components/test/data/autofill/heuristics/output/154_fmm-es_inm.gob.mx.out", - "//components/test/data/autofill/heuristics/output/155_fmm-ja_inm.gob.mx.out", - "//components/test/data/autofill/heuristics/output/156_buyAlbum_bandcamp.com_price.out", - "//components/test/data/autofill/heuristics/output/157_bug_971402_opentable_checkout.out", - "//components/test/data/autofill/heuristics/output/158_i18n_ml.out", - "//components/test/data/autofill/heuristics/output/159_bug_966406_transavia.com.out", - "//components/test/data/autofill/heuristics/output/160_credit_card_ignore_birthday_fields.out", - "//components/test/data/autofill/heuristics/output/161_i18n_tr.out", - "//components/test/data/autofill/heuristics/output/162_i18n_tr2.out", - "//components/test/data/autofill/heuristics/output/163_giftcard_hotels.com.out", - "//components/test/data/autofill/heuristics/output/164_i18n_es_two_last_names_1.out", - "//components/test/data/autofill/heuristics/output/165_i18n_es_two_last_names_2.out", - "//components/test/data/autofill/heuristics/output/166_i18n_en_honorific_prefix.out", - "//components/test/data/autofill/heuristics/output/167_helity.es.out", - "//components/test/data/autofill/heuristics/output/168_i18n_hi.out", - "//components/test/data/autofill/heuristics/output/169_dominos_de.out", - "//components/test/data/autofill/heuristics/output/170_i18n_ru_structured_address_1.out", - "//components/test/data/autofill/heuristics/output/171_i18n_ru_structured_address_2.out", - "//components/test/data/autofill/heuristics/output/172_i18n_pt_structured_address_1.out", - "//components/test/data/autofill/heuristics/output/173_i18n_pt_structured_address_2.out", - "//components/test/data/autofill/heuristics/output/174_i18n_id.out", - "//components/test/data/autofill/heuristics/output/175_id_address_alfacart.com.out", - "//components/test/data/autofill/heuristics/output/176_id_payment_shopee.co.id.out", - "//components/test/data/autofill/heuristics/output/177_reichelt.out", - "//components/test/data/autofill/heuristics/output/178_zip_file_extension.out", - "//components/test/data/autofill/heuristics/output/179_twtcgirls.out", - "//components/test/data/autofill/heuristics/output/180_namesurname.out", -] +# This file defines the autofill_test_files list, which contains all input +# and output files for form_structure_browsertest.mm. +import("//components/test/data/autofill/heuristics/test_files.gni") # Generate a file containing the list of test input files. This list will # be used to initialise the test as enumerating the file in the bundle is
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.h b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.h index e8bb05f..b201237 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.h +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.h
@@ -9,6 +9,7 @@ #import "ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_constants.h" @class UserSigninLogger; +@protocol SystemIdentity; // Coordinates the user sign-in with different intents: // + user sign-in when triggered from UI (settings, bookmarks...) @@ -26,7 +27,7 @@ // `logger` is the logger for sign-in flow operations. This should not be nil. - (instancetype)initWithBaseViewController:(UIViewController*)viewController browser:(Browser*)browser - identity:(ChromeIdentity*)identity + identity:(id<SystemIdentity>)identity signinIntent:(UserSigninIntent)signinIntent logger:(UserSigninLogger*)logger NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm index be712366..b4b1bc6 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_coordinator.mm
@@ -62,7 +62,7 @@ // Mediator that handles the sign-in authentication state. @property(nonatomic, strong) UserSigninMediator* mediator; // Suggested identity shown at sign-in. -@property(nonatomic, strong, readonly) ChromeIdentity* defaultIdentity; +@property(nonatomic, strong, readonly) id<SystemIdentity> defaultIdentity; // Logger for sign-in operations. @property(nonatomic, strong, readonly) UserSigninLogger* logger; // Sign-in intent. @@ -78,7 +78,7 @@ @property(nonatomic, assign) IdentitySigninState signinStateOnStart; // Sign-in identity when the coordiantor starts. This is used as the // identity to revert to in case the user is interrupted during sign-in. -@property(nonatomic, strong) ChromeIdentity* signinIdentityOnStart; +@property(nonatomic, strong) id<SystemIdentity> signinIdentityOnStart; // Account manager service to retrieve Chrome identities. @property(nonatomic, assign) ChromeAccountManagerService* accountManagerService; // YES if the user tapped on the managed, learn more link. @@ -109,7 +109,7 @@ - (instancetype)initWithBaseViewController:(UIViewController*)viewController browser:(Browser*)browser - identity:(ChromeIdentity*)identity + identity:(id<SystemIdentity>)identity signinIntent:(UserSigninIntent)signinIntent logger:(UserSigninLogger*)logger { self = [super initWithBaseViewController:viewController browser:browser]; @@ -629,9 +629,7 @@ self.unifiedConsentCoordinator.uiDisabled = YES; [self.viewController signinWillStart]; [self.mediator - authenticateWithIdentity:base::mac::ObjCCastStrict<ChromeIdentity>( - self.unifiedConsentCoordinator - .selectedIdentity) + authenticateWithIdentity:self.unifiedConsentCoordinator.selectedIdentity authenticationFlow:authenticationFlow]; } @@ -640,7 +638,7 @@ // `self.advancedSettingsSigninCoordinator` is done. - (void)advancedSettingsSigninCoordinatorFinishedWithResult: (SigninCoordinatorResult)signinResult - identity:(ChromeIdentity*) + identity:(id<SystemIdentity>) identity { DCHECK(self.advancedSettingsSigninCoordinator); [self.advancedSettingsSigninCoordinator stop];
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.h b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.h index 6bb6cb6..06d361e4 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.h +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.h
@@ -14,8 +14,8 @@ @class AuthenticationFlow; class AuthenticationService; class ChromeAccountManagerService; -@class ChromeIdentity; class SyncSetupService; +@protocol SystemIdentity; namespace consent_auditor { class ConsentAuditor; @@ -53,7 +53,7 @@ // User's sign-in state before starting the coordinator. @property(nonatomic, assign, readonly) IdentitySigninState signinStateOnStart; // Users's sign-in identity before starting the coordinator. -@property(nonatomic, strong, readonly) ChromeIdentity* signinIdentityOnStart; +@property(nonatomic, strong, readonly) id<SystemIdentity> signinIdentityOnStart; @end @@ -83,7 +83,7 @@ // Enters the authentication state following identity selection. If there is an // error transitions to the identity selection state, otherwise enters the final // authentication completed state. -- (void)authenticateWithIdentity:(ChromeIdentity*)identity +- (void)authenticateWithIdentity:(id<SystemIdentity>)identity authenticationFlow:(AuthenticationFlow*)authenticationFlow; // Reverts the sign-in operation.
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm index 98d4143..3a187ca8 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm
@@ -83,7 +83,7 @@ DCHECK(!self.delegate); } -- (void)authenticateWithIdentity:(ChromeIdentity*)identity +- (void)authenticateWithIdentity:(id<SystemIdentity>)identity authenticationFlow:(AuthenticationFlow*)authenticationFlow { DCHECK(!self.authenticationFlow); @@ -164,19 +164,7 @@ self.authenticationService->SignOut( signin_metrics::ABORT_SIGNIN, /*force_clear_browsing_data=*/false, ^() { - AuthenticationService* authenticationService = - weakSelf.authenticationService; - ChromeIdentity* identity = - weakSelf.delegate.signinIdentityOnStart; - ChromeAccountManagerService* accountManagerService = - weakSelf.accountManagerService; - if (authenticationService && identity && - accountManagerService->IsValidIdentity(identity)) { - // Make sure the mediator is still alive, and the identity is - // stil valid (for example the identity can be removed by - // another app. - authenticationService->SignIn(identity); - } + [weakSelf signinWithIdentityOnStartAfterSignout]; if (completion) completion(); }); @@ -191,6 +179,26 @@ } } +- (void)signinWithIdentityOnStartAfterSignout { + ChromeAccountManagerService* accountManagerService = + self.accountManagerService; + if (!accountManagerService) + return; + + // Make sure the mediator is still alive and the identity is + // still valid (for example, the identity can be removed by + // another application). + id<SystemIdentity> identity = self.delegate.signinIdentityOnStart; + if (!accountManagerService->IsValidIdentity(identity)) + return; + + AuthenticationService* authenticationService = self.authenticationService; + if (!authenticationService) + return; + + authenticationService->SignIn(identity); +} + - (void)disconnect { self.authenticationFlow = nil; self.identityManager = nil; @@ -209,7 +217,7 @@ // Called when signin is complete, after tapping "Yes, I'm in". - (void)onAccountSigninCompletion:(BOOL)success - identity:(ChromeIdentity*)identity { + identity:(id<SystemIdentity>)identity { self.authenticationFlow = nil; if (!success) { [self.delegate userSigninMediatorSigninFailed]; @@ -219,7 +227,7 @@ } // Grants and records Sync consent, and finishes the Sync setup flow. -- (void)signinCompletedWithIdentity:(ChromeIdentity*)identity { +- (void)signinCompletedWithIdentity:(id<SystemIdentity>)identity { self.unifiedConsentService->SetUrlKeyedAnonymizedDataCollectionEnabled(true); sync_pb::UserConsentTypes::SyncConsent syncConsent; @@ -239,8 +247,8 @@ } CoreAccountId coreAccountId = self.identityManager->PickAccountIdForAccount( - base::SysNSStringToUTF8([identity gaiaID]), - base::SysNSStringToUTF8([identity userEmail])); + base::SysNSStringToUTF8(identity.gaiaID), + base::SysNSStringToUTF8(identity.userEmail)); self.consentAuditor->RecordSyncConsent(coreAccountId, syncConsent); self.authenticationService->GrantSyncConsent(identity);
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm index be8dda0..1d52411 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator_unittest.mm
@@ -499,7 +499,7 @@ // * Cancel the user sign-in dialog TEST_F(UserSigninMediatorTest, OpenSettingsLinkWithDifferentIdentityAndCancel) { // Signs in with identity 2. - ChromeIdentity* identity2 = + id<SystemIdentity> identity2 = [FakeChromeIdentity identityWithEmail:@"foo2@gmail.com" gaiaID:@"foo2ID" name:@"Fake Foo 2"]; @@ -551,7 +551,7 @@ TEST_F(UserSigninMediatorTest, OpenSettingsLinkWithDifferentIdentityAndForgetIdentity) { // Signs in with identity 2. - ChromeIdentity* identity2 = + id<SystemIdentity> identity2 = [FakeChromeIdentity identityWithEmail:@"foo2@gmail.com" gaiaID:@"foo2ID" name:@"Fake Foo 2"];
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm index 625b83ae..4dce8f61 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -486,6 +486,10 @@ // Tests that the trending queries module header is visible and all four // trending queries are interactable. - (void)testTrendingQueries { +#if TARGET_IPHONE_SIMULATOR + // TODO(crbug.com/1364725): Re-enable test after fixing failure. + EARL_GREY_TEST_DISABLED(@"Failing on simulator."); +#endif // TARGET_IPHONE_SIMULATOR [[EarlGrey selectElementWithMatcher: grey_accessibilityID([NSString
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm index 612ef83..3f21ce4 100644 --- a/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_mediator.mm
@@ -398,7 +398,7 @@ - (void)updateAccountImage { UIImage* image = nil; // Fetches user's identity from Authentication Service. - ChromeIdentity* identity = + id<SystemIdentity> identity = self.authService->GetPrimaryIdentity(signin::ConsentLevel::kSignin); if (identity) { // Only show an avatar if the user is signed in.
diff --git a/ios/chrome/browser/ui/elements/instruction_view.mm b/ios/chrome/browser/ui/elements/instruction_view.mm index e26e996..24c2030 100644 --- a/ios/chrome/browser/ui/elements/instruction_view.mm +++ b/ios/chrome/browser/ui/elements/instruction_view.mm
@@ -9,6 +9,7 @@ #import "ios/chrome/common/ui/colors/semantic_color_names.h" #import "ios/chrome/common/ui/util/constraints_ui_util.h" #import "ios/chrome/common/ui/util/dynamic_type_util.h" +#import "ios/chrome/common/ui/util/ui_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -125,7 +126,8 @@ [separator.trailingAnchor constraintEqualToAnchor:liner.trailingAnchor], [separator.topAnchor constraintEqualToAnchor:liner.topAnchor], [separator.bottomAnchor constraintEqualToAnchor:liner.bottomAnchor], - [liner.heightAnchor constraintEqualToConstant:kSeparatorHeight] + [liner.heightAnchor + constraintEqualToConstant:AlignValueToPixel(kSeparatorHeight)], ]]; return liner;
diff --git a/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_coordinator.mm b/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_coordinator.mm index 06c0ee5..d99e2be 100644 --- a/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_coordinator.mm +++ b/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_coordinator.mm
@@ -4,7 +4,6 @@ #import "ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_coordinator.h" -#import "base/mac/foundation_util.h" #import "base/metrics/histogram_functions.h" #import "ios/chrome/app/application_delegate/app_state.h" #import "ios/chrome/app/application_delegate/app_state_observer.h" @@ -250,8 +249,7 @@ - (void)identityChooserCoordinator:(IdentityChooserCoordinator*)coordinator didSelectIdentity:(id<SystemIdentity>)identity { CHECK_EQ(self.identityChooserCoordinator, coordinator); - self.mediator.selectedIdentity = - base::mac::ObjCCastStrict<ChromeIdentity>(identity); + self.mediator.selectedIdentity = identity; } #pragma mark - PolicyWatcherBrowserAgentObserving @@ -353,8 +351,6 @@ DCHECK(self.mediator.selectedIdentity); self.attemptStatus = first_run::SignInAttemptStatus::ATTEMPTED; - - DCHECK(self.mediator.selectedIdentity); AuthenticationFlow* authenticationFlow = [[AuthenticationFlow alloc] initWithBrowser:self.browser identity:self.mediator.selectedIdentity
diff --git a/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_mediator.h b/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_mediator.h index c42146b..233b2610 100644 --- a/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_mediator.h +++ b/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_mediator.h
@@ -12,8 +12,8 @@ @class AuthenticationFlow; class AuthenticationService; class ChromeAccountManagerService; -@class ChromeIdentity; @protocol LegacySigninScreenConsumer; +@protocol SystemIdentity; // Mediator that handles the sign-in operation. @interface LegacySigninScreenMediator : NSObject @@ -31,7 +31,7 @@ @property(nonatomic, weak) id<LegacySigninScreenConsumer> consumer; // The identity currently selected. -@property(nonatomic, strong) ChromeIdentity* selectedIdentity; +@property(nonatomic, strong) id<SystemIdentity> selectedIdentity; // Whether an account has been added. Must be set externally. @property(nonatomic, assign) BOOL addedAccount;
diff --git a/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_mediator.mm b/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_mediator.mm index 679c47e..39b4d53 100644 --- a/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_mediator.mm +++ b/ios/chrome/browser/ui/first_run/legacy_signin/legacy_signin_screen_mediator.mm
@@ -99,8 +99,8 @@ #pragma mark - Properties -- (void)setSelectedIdentity:(ChromeIdentity*)selectedIdentity { - if ([self.selectedIdentity isEqual:selectedIdentity]) +- (void)setSelectedIdentity:(id<SystemIdentity>)selectedIdentity { + if ([_selectedIdentity isEqual:selectedIdentity]) return; // nil is allowed only if there is no other identity. DCHECK(selectedIdentity || !self.accountManagerService->HasIdentities()); @@ -124,8 +124,7 @@ return; } - if (!self.selectedIdentity || - !self.accountManagerService->IsValidIdentity(self.selectedIdentity)) { + if (!self.accountManagerService->IsValidIdentity(self.selectedIdentity)) { self.selectedIdentity = self.accountManagerService->GetDefaultIdentity(); } } @@ -139,16 +138,16 @@ #pragma mark - Private - (void)updateConsumer { - if (!self.selectedIdentity) { + id<SystemIdentity> selectedIdentity = self.selectedIdentity; + if (!selectedIdentity) { [self.consumer noIdentityAvailable]; } else { UIImage* avatar = self.accountManagerService->GetIdentityAvatarWithIdentity( - self.selectedIdentity, IdentityAvatarSize::Regular); - [self.consumer - setSelectedIdentityUserName:self.selectedIdentity.userFullName - email:self.selectedIdentity.userEmail - givenName:self.selectedIdentity.userGivenName - avatar:avatar]; + selectedIdentity, IdentityAvatarSize::Regular); + [self.consumer setSelectedIdentityUserName:selectedIdentity.userFullName + email:selectedIdentity.userEmail + givenName:selectedIdentity.userGivenName + avatar:avatar]; } }
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.h b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.h index 0fc793c..cb8b701 100644 --- a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.h +++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.h
@@ -28,7 +28,7 @@ // Consumer for this mediator. @property(nonatomic, weak) id<SigninScreenConsumer> consumer; // The identity currently selected. -@property(nonatomic, strong, readwrite) id<SystemIdentity> selectedIdentity; +@property(nonatomic, strong) id<SystemIdentity> selectedIdentity; // Contains the user choice for UMA reporting. This value is set to the default // value when the coordinator is initialized. @property(nonatomic, assign) BOOL UMAReportingUserChoice;
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm index 1fa641e3..38fe0ca 100644 --- a/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm +++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_mediator.mm
@@ -150,7 +150,7 @@ completion(); }]; }; - ChromeIdentity* primaryIdentity = + id<SystemIdentity> primaryIdentity = self.authenticationService->GetPrimaryIdentity( signin::ConsentLevel::kSignin); if (primaryIdentity && ![primaryIdentity isEqual:self.selectedIdentity]) { @@ -271,7 +271,7 @@ } } -- (void)setSelectedIdentity:(ChromeIdentity*)selectedIdentity { +- (void)setSelectedIdentity:(id<SystemIdentity>)selectedIdentity { if ([_selectedIdentity isEqual:selectedIdentity]) { return; }
diff --git a/ios/chrome/browser/ui/icons/BUILD.gn b/ios/chrome/browser/ui/icons/BUILD.gn index d4d767e..01ec4ab 100644 --- a/ios/chrome/browser/ui/icons/BUILD.gn +++ b/ios/chrome/browser/ui/icons/BUILD.gn
@@ -121,6 +121,7 @@ "//ios/chrome/browser/ui/icons/resources:language", "//ios/chrome/browser/ui/icons/resources:laptopcomputer_and_phone", "//ios/chrome/browser/ui/icons/resources:password", + "//ios/chrome/browser/ui/icons/resources:password_manager", "//ios/chrome/browser/ui/icons/resources:photo_badge_magnifyingglass", "//ios/chrome/browser/ui/icons/resources:photo_badge_plus", "//ios/chrome/browser/ui/icons/resources:plus_circle_fill",
diff --git a/ios/chrome/browser/ui/icons/chrome_symbol.h b/ios/chrome/browser/ui/icons/chrome_symbol.h index c028cab..1bcc6060 100644 --- a/ios/chrome/browser/ui/icons/chrome_symbol.h +++ b/ios/chrome/browser/ui/icons/chrome_symbol.h
@@ -14,6 +14,7 @@ extern NSString* const kTranslateSymbol; extern NSString* const kCameraSymbol; extern NSString* const kCameraFillSymbol; +extern NSString* const kPasswordManagerSymbol; extern NSString* const kPlusCircleFillSymbol; extern NSString* const kPopupBadgeMinusSymbol; extern NSString* const kPhotoBadgePlusSymbol;
diff --git a/ios/chrome/browser/ui/icons/chrome_symbol.mm b/ios/chrome/browser/ui/icons/chrome_symbol.mm index da2fc13..ef83b9e 100644 --- a/ios/chrome/browser/ui/icons/chrome_symbol.mm +++ b/ios/chrome/browser/ui/icons/chrome_symbol.mm
@@ -51,6 +51,7 @@ NSString* const kTranslateSymbol = @"translate"; NSString* const kCameraSymbol = @"camera"; NSString* const kCameraFillSymbol = @"camera_fill"; +NSString* const kPasswordManagerSymbol = @"password_manager"; NSString* const kPlusCircleFillSymbol = @"plus_circle_fill"; NSString* const kPopupBadgeMinusSymbol = @"popup_badge_minus"; NSString* const kPhotoBadgePlusSymbol = @"photo_badge_plus";
diff --git a/ios/chrome/browser/ui/icons/resources/BUILD.gn b/ios/chrome/browser/ui/icons/resources/BUILD.gn index bd65daf..570402f 100644 --- a/ios/chrome/browser/ui/icons/resources/BUILD.gn +++ b/ios/chrome/browser/ui/icons/resources/BUILD.gn
@@ -53,6 +53,13 @@ ] } +symbolset("password_manager") { + sources = [ + "password_manager.symbolset/Contents.json", + "password_manager.symbolset/password.manager.cr.svg", + ] +} + symbolset("square_number") { sources = [ "square_number.symbolset/Contents.json",
diff --git a/ios/chrome/browser/ui/icons/resources/password_manager.symbolset/Contents.json b/ios/chrome/browser/ui/icons/resources/password_manager.symbolset/Contents.json new file mode 100644 index 0000000..b8967ba --- /dev/null +++ b/ios/chrome/browser/ui/icons/resources/password_manager.symbolset/Contents.json
@@ -0,0 +1,12 @@ +{ + "info": { + "author": "xcode", + "version": 1 + }, + "symbols": [ + { + "filename": "password.manager.cr.svg", + "idiom": "universal" + } + ] +}
diff --git a/ios/chrome/browser/ui/icons/resources/password_manager.symbolset/password.manager.cr.svg b/ios/chrome/browser/ui/icons/resources/password_manager.symbolset/password.manager.cr.svg new file mode 100644 index 0000000..2bc9748 --- /dev/null +++ b/ios/chrome/browser/ui/icons/resources/password_manager.symbolset/password.manager.cr.svg
@@ -0,0 +1,281 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--Generator: Apple Native CoreSVG 175--> +<!DOCTYPE svg +PUBLIC "-//W3C//DTD SVG 1.1//EN" + "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="3300" height="2200"> + <!--glyph: "", point size: 100.0, font version: "17.3d3e1", template writer version: "65.1"--> + <style>.multicolor-0:custom {fill:#34A853;opacity:1.0} +.multicolor-1:custom {fill:#188038;opacity:1.0} +.multicolor-2:custom {fill:#FBBC04;opacity:1.0} +.multicolor-3:custom {fill:#4183F0;opacity:1.0} +.multicolor-4:custom {fill:#EA4335;opacity:1.0} + +.SFSymbolsPreview188038 {fill:#188038;opacity:1.0} +.SFSymbolsPreview34A853 {fill:#34A853;opacity:1.0} +.SFSymbolsPreview4183F0 {fill:#4183F0;opacity:1.0} +.SFSymbolsPreviewEA4335 {fill:#EA4335;opacity:1.0} +.SFSymbolsPreviewFBBC04 {fill:#FBBC04;opacity:1.0} +</style> + <g id="Notes"> + <rect height="2200" id="artboard" style="fill:white;opacity:1" width="3300" x="0" y="0"/> + <line style="fill:none;stroke:black;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="292" y2="292"/> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;font-weight:bold;" transform="matrix(1 0 0 1 263 322)">Weight/Scale Variations</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 559.711 322)">Ultralight</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 856.422 322)">Thin</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 1153.13 322)">Light</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 1449.84 322)">Regular</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 1746.56 322)">Medium</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 2043.27 322)">Semibold</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 2339.98 322)">Bold</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 2636.69 322)">Heavy</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:middle;" transform="matrix(1 0 0 1 2933.4 322)">Black</text> + <line style="fill:none;stroke:black;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1903" y2="1903"/> + <g transform="matrix(1 0 0 1 263 1933)"> + <path d="M9.24805 0.830078Q10.8691 0.830078 12.2949 0.214844Q13.7207-0.400391 14.8096-1.49414Q15.8984-2.58789 16.5186-4.01367Q17.1387-5.43945 17.1387-7.05078Q17.1387-8.66211 16.5186-10.0879Q15.8984-11.5137 14.8047-12.6074Q13.7109-13.7012 12.2852-14.3164Q10.8594-14.9316 9.23828-14.9316Q7.62695-14.9316 6.20117-14.3164Q4.77539-13.7012 3.69141-12.6074Q2.60742-11.5137 1.9873-10.0879Q1.36719-8.66211 1.36719-7.05078Q1.36719-5.43945 1.9873-4.01367Q2.60742-2.58789 3.69629-1.49414Q4.78516-0.400391 6.21094 0.214844Q7.63672 0.830078 9.24805 0.830078ZM9.24805-0.654297Q7.91992-0.654297 6.7627-1.14746Q5.60547-1.64062 4.73145-2.51953Q3.85742-3.39844 3.36426-4.56055Q2.87109-5.72266 2.87109-7.05078Q2.87109-8.37891 3.35938-9.54102Q3.84766-10.7031 4.72168-11.582Q5.5957-12.4609 6.75293-12.9541Q7.91016-13.4473 9.23828-13.4473Q10.5762-13.4473 11.7334-12.9541Q12.8906-12.4609 13.7695-11.582Q14.6484-10.7031 15.1465-9.54102Q15.6445-8.37891 15.6445-7.05078Q15.6445-5.72266 15.1514-4.56055Q14.6582-3.39844 13.7842-2.51953Q12.9102-1.64062 11.748-1.14746Q10.5859-0.654297 9.24805-0.654297ZM5.6543-7.05078Q5.6543-6.72852 5.85938-6.52832Q6.06445-6.32812 6.40625-6.32812L8.51562-6.32812L8.51562-4.20898Q8.51562-3.88672 8.71094-3.67676Q8.90625-3.4668 9.23828-3.4668Q9.56055-3.4668 9.77051-3.67676Q9.98047-3.88672 9.98047-4.20898L9.98047-6.32812L12.0898-6.32812Q12.4219-6.32812 12.627-6.52832Q12.832-6.72852 12.832-7.05078Q12.832-7.38281 12.627-7.58789Q12.4219-7.79297 12.0898-7.79297L9.98047-7.79297L9.98047-9.90234Q9.98047-10.2344 9.77051-10.4443Q9.56055-10.6543 9.23828-10.6543Q8.90625-10.6543 8.71094-10.4443Q8.51562-10.2344 8.51562-9.90234L8.51562-7.79297L6.40625-7.79297Q6.06445-7.79297 5.85938-7.58789Q5.6543-7.38281 5.6543-7.05078Z"/> + </g> + <g transform="matrix(1 0 0 1 281.867 1933)"> + <path d="M11.709 2.91016Q13.75 2.91016 15.5518 2.12891Q17.3535 1.34766 18.7305-0.0292969Q20.1074-1.40625 20.8887-3.20801Q21.6699-5.00977 21.6699-7.05078Q21.6699-9.0918 20.8887-10.8936Q20.1074-12.6953 18.7305-14.0723Q17.3535-15.4492 15.5469-16.2305Q13.7402-17.0117 11.6992-17.0117Q9.6582-17.0117 7.85645-16.2305Q6.05469-15.4492 4.68262-14.0723Q3.31055-12.6953 2.5293-10.8936Q1.74805-9.0918 1.74805-7.05078Q1.74805-5.00977 2.5293-3.20801Q3.31055-1.40625 4.6875-0.0292969Q6.06445 1.34766 7.86621 2.12891Q9.66797 2.91016 11.709 2.91016ZM11.709 1.25Q9.98047 1.25 8.47656 0.605469Q6.97266-0.0390625 5.83496-1.17676Q4.69727-2.31445 4.05762-3.81836Q3.41797-5.32227 3.41797-7.05078Q3.41797-8.7793 4.05762-10.2832Q4.69727-11.7871 5.83008-12.9297Q6.96289-14.0723 8.4668-14.7119Q9.9707-15.3516 11.6992-15.3516Q13.4277-15.3516 14.9316-14.7119Q16.4355-14.0723 17.5781-12.9297Q18.7207-11.7871 19.3652-10.2832Q20.0098-8.7793 20.0098-7.05078Q20.0098-5.32227 19.3701-3.81836Q18.7305-2.31445 17.5928-1.17676Q16.4551-0.0390625 14.9463 0.605469Q13.4375 1.25 11.709 1.25ZM7.17773-7.05078Q7.17773-6.69922 7.41211-6.47461Q7.64648-6.25 8.01758-6.25L10.8887-6.25L10.8887-3.36914Q10.8887-2.99805 11.1133-2.76855Q11.3379-2.53906 11.6895-2.53906Q12.0605-2.53906 12.29-2.76855Q12.5195-2.99805 12.5195-3.36914L12.5195-6.25L15.4004-6.25Q15.7715-6.25 16.001-6.47461Q16.2305-6.69922 16.2305-7.05078Q16.2305-7.42188 16.001-7.65137Q15.7715-7.88086 15.4004-7.88086L12.5195-7.88086L12.5195-10.752Q12.5195-11.1328 12.29-11.3623Q12.0605-11.5918 11.6895-11.5918Q11.3379-11.5918 11.1133-11.3574Q10.8887-11.123 10.8887-10.752L10.8887-7.88086L8.01758-7.88086Q7.63672-7.88086 7.40723-7.65137Q7.17773-7.42188 7.17773-7.05078Z"/> + </g> + <g transform="matrix(1 0 0 1 305.646 1933)"> + <path d="M14.9707 5.66406Q17.0605 5.66406 18.96 5.01465Q20.8594 4.36523 22.4512 3.19336Q24.043 2.02148 25.2197 0.429688Q26.3965-1.16211 27.0459-3.06641Q27.6953-4.9707 27.6953-7.05078Q27.6953-9.14062 27.0459-11.04Q26.3965-12.9395 25.2197-14.5312Q24.043-16.123 22.4512-17.2998Q20.8594-18.4766 18.9551-19.126Q17.0508-19.7754 14.9609-19.7754Q12.8711-19.7754 10.9717-19.126Q9.07227-18.4766 7.48535-17.2998Q5.89844-16.123 4.72168-14.5312Q3.54492-12.9395 2.90039-11.04Q2.25586-9.14062 2.25586-7.05078Q2.25586-4.9707 2.90527-3.06641Q3.55469-1.16211 4.72656 0.429688Q5.89844 2.02148 7.49023 3.19336Q9.08203 4.36523 10.9814 5.01465Q12.8809 5.66406 14.9707 5.66406ZM14.9707 3.84766Q13.1641 3.84766 11.5283 3.2959Q9.89258 2.74414 8.53516 1.74805Q7.17773 0.751953 6.17676-0.610352Q5.17578-1.97266 4.62891-3.6084Q4.08203-5.24414 4.08203-7.05078Q4.08203-8.86719 4.62891-10.5029Q5.17578-12.1387 6.17188-13.501Q7.16797-14.8633 8.52539-15.8594Q9.88281-16.8555 11.5186-17.4023Q13.1543-17.9492 14.9609-17.9492Q16.7773-17.9492 18.4131-17.4023Q20.0488-16.8555 21.4111-15.8594Q22.7734-14.8633 23.7695-13.501Q24.7656-12.1387 25.3174-10.5029Q25.8691-8.86719 25.8691-7.05078Q25.8789-5.24414 25.332-3.6084Q24.7852-1.97266 23.7842-0.610352Q22.7832 0.751953 21.4209 1.74805Q20.0586 2.74414 18.4229 3.2959Q16.7871 3.84766 14.9707 3.84766ZM9.19922-7.05078Q9.19922-6.66992 9.45801-6.4209Q9.7168-6.17188 10.1172-6.17188L14.0625-6.17188L14.0625-2.2168Q14.0625-1.81641 14.3115-1.55762Q14.5605-1.29883 14.9512-1.29883Q15.3516-1.29883 15.6104-1.55273Q15.8691-1.80664 15.8691-2.2168L15.8691-6.17188L19.8242-6.17188Q20.2246-6.17188 20.4785-6.4209Q20.7324-6.66992 20.7324-7.05078Q20.7324-7.46094 20.4785-7.71484Q20.2246-7.96875 19.8242-7.96875L15.8691-7.96875L15.8691-11.9141Q15.8691-12.3242 15.6104-12.583Q15.3516-12.8418 14.9512-12.8418Q14.5605-12.8418 14.3115-12.583Q14.0625-12.3242 14.0625-11.9141L14.0625-7.96875L10.1172-7.96875Q9.70703-7.96875 9.45312-7.71484Q9.19922-7.46094 9.19922-7.05078Z"/> + </g> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;font-weight:bold;" transform="matrix(1 0 0 1 263 1953)">Design Variations</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 1971)">Symbols are supported in up to nine weights and three scales.</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 1989)">For optimal layout with text and other symbols, vertically align</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 2007)">symbols with the adjacent text.</text> + <line style="fill:none;stroke:#00AEEF;stroke-width:0.5;opacity:1.0;" x1="776" x2="776" y1="1919" y2="1933"/> + <g transform="matrix(1 0 0 1 776 1933)"> + <path d="M3.31055 0.15625Q3.70117 0.15625 3.91602-0.00976562Q4.13086-0.175781 4.26758-0.585938L5.52734-4.0332L11.2891-4.0332L12.5488-0.585938Q12.6855-0.175781 12.9004-0.00976562Q13.1152 0.15625 13.4961 0.15625Q13.8867 0.15625 14.1162-0.0585938Q14.3457-0.273438 14.3457-0.644531Q14.3457-0.869141 14.2383-1.17188L9.6582-13.3691Q9.48242-13.8184 9.17969-14.043Q8.87695-14.2676 8.4082-14.2676Q7.5-14.2676 7.17773-13.3789L2.59766-1.16211Q2.49023-0.859375 2.49023-0.634766Q2.49023-0.263672 2.70996-0.0537109Q2.92969 0.15625 3.31055 0.15625ZM6.00586-5.51758L8.37891-12.0898L8.42773-12.0898L10.8008-5.51758Z"/> + </g> + <line style="fill:none;stroke:#00AEEF;stroke-width:0.5;opacity:1.0;" x1="793.197" x2="793.197" y1="1919" y2="1933"/> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;font-weight:bold;" transform="matrix(1 0 0 1 776 1953)">Margins</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 776 1971)">Leading and trailing margins on the left and right side of each symbol</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 776 1989)">can be adjusted by modifying the x-location of the margin guidelines.</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 776 2007)">Modifications are automatically applied proportionally to all</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 776 2025)">scales and weights.</text> + <g transform="matrix(1 0 0 1 1289 1933)"> + <path d="M2.8418 1.86523L4.54102 3.57422Q5.18555 4.22852 5.90332 4.17969Q6.62109 4.13086 7.31445 3.35938L18.0078-8.42773L17.041-9.4043L6.42578 2.27539Q6.16211 2.57812 5.89355 2.61719Q5.625 2.65625 5.27344 2.30469L4.10156 1.14258Q3.75 0.791016 3.79395 0.522461Q3.83789 0.253906 4.14062-0.0195312L15.6152-10.8203L14.6387-11.7871L3.04688-0.898438Q2.30469-0.214844 2.25098 0.498047Q2.19727 1.21094 2.8418 1.86523ZM9.25781-16.3281Q8.94531-16.0254 8.90625-15.6348Q8.86719-15.2441 9.04297-14.9512Q9.21875-14.6777 9.55566-14.541Q9.89258-14.4043 10.3809-14.5215Q11.4746-14.7754 12.5977-14.7314Q13.7207-14.6875 14.7949-13.9844L14.209-12.5293Q13.9551-11.9043 14.0674-11.4404Q14.1797-10.9766 14.5801-10.5664L16.875-8.25195Q17.2363-7.88086 17.5781-7.82227Q17.9199-7.76367 18.3398-7.8418L19.4043-8.03711L20.0684-7.36328L20.0293-6.80664Q20-6.43555 20.1221-6.12305Q20.2441-5.81055 20.6055-5.44922L21.3672-4.70703Q21.7285-4.3457 22.1533-4.33105Q22.5781-4.31641 22.9297-4.66797L25.8398-7.58789Q26.1914-7.93945 26.1816-8.35449Q26.1719-8.76953 25.8105-9.13086L25.0391-9.89258Q24.6875-10.2539 24.3799-10.3857Q24.0723-10.5176 23.7109-10.4883L23.1348-10.4395L22.4902-11.0742L22.7344-12.1973Q22.832-12.6172 22.6953-12.9834Q22.5586-13.3496 22.1191-13.7891L19.9219-15.9766Q18.6719-17.2168 17.2607-17.8369Q15.8496-18.457 14.4189-18.4814Q12.9883-18.5059 11.665-17.959Q10.3418-17.4121 9.25781-16.3281ZM10.752-15.957Q11.6602-16.6211 12.7002-16.9043Q13.7402-17.1875 14.8047-17.085Q15.8691-16.9824 16.8701-16.5137Q17.8711-16.0449 18.7012-15.2051L21.1328-12.793Q21.3086-12.6172 21.3525-12.4512Q21.3965-12.2852 21.3379-12.0312L21.0156-10.5469L22.5195-9.0625L23.5059-9.12109Q23.6914-9.13086 23.7891-9.09668Q23.8867-9.0625 24.0332-8.91602L24.6094-8.33984L22.168-5.89844L21.5918-6.47461Q21.4453-6.62109 21.4062-6.71875Q21.3672-6.81641 21.377-7.01172L21.4453-7.98828L19.9512-9.47266L18.4277-9.21875Q18.1836-9.16992 18.042-9.2041Q17.9004-9.23828 17.7148-9.41406L15.7129-11.416Q15.5176-11.5918 15.4932-11.7529Q15.4688-11.9141 15.5859-12.1875L16.4648-14.2773Q15.293-15.3711 13.8281-15.791Q12.3633-16.2109 10.8398-15.7617Q10.7227-15.7324 10.6885-15.8057Q10.6543-15.8789 10.752-15.957Z"/> + </g> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;font-weight:bold;" transform="matrix(1 0 0 1 1289 1953)">Exporting</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 1289 1971)">Symbols should be outlined when exporting to ensure the</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 1289 1989)">design is preserved when submitting to Xcode.</text> + <text id="template-version" style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:end;" transform="matrix(1 0 0 1 3036 1933)">Template v.3.0</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:end;" transform="matrix(1 0 0 1 3036 1951)">Requires Xcode 13 or greater</text> + <text id="descriptive-name" style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:end;" transform="matrix(1 0 0 1 3036 1969)">Generated from key.cr</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;text-anchor:end;" transform="matrix(1 0 0 1 3036 1987)">Typeset at 100 points</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 726)">Small</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 1156)">Medium</text> + <text style="stroke:none;fill:black;font-family:sans-serif;font-size:13;" transform="matrix(1 0 0 1 263 1586)">Large</text> + </g> + <g id="Guides"> + <g id="H-reference" style="fill:#27AAE1;stroke:none;" transform="matrix(1 0 0 1 339 696)"> + <path d="M0.993347 0L3.6377 0L29.3282-67.1326L30.0301-67.1326L30.0301-70.459L28.1227-70.459ZM11.6882-24.4797L46.9818-24.4797L46.2311-26.7288L12.4382-26.7288ZM55.1193 0L57.7637 0L30.6381-70.459L29.4327-70.459L29.4327-67.1326Z"/> + </g> + <line id="Baseline-S" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="696" y2="696"/> + <line id="Capline-S" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="625.541" y2="625.541"/> + <g id="H-reference" style="fill:#27AAE1;stroke:none;" transform="matrix(1 0 0 1 339 1126)"> + <path d="M0.993347 0L3.6377 0L29.3282-67.1326L30.0301-67.1326L30.0301-70.459L28.1227-70.459ZM11.6882-24.4797L46.9818-24.4797L46.2311-26.7288L12.4382-26.7288ZM55.1193 0L57.7637 0L30.6381-70.459L29.4327-70.459L29.4327-67.1326Z"/> + </g> + <line id="Baseline-M" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1126" y2="1126"/> + <line id="Capline-M" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1055.54" y2="1055.54"/> + <g id="H-reference" style="fill:#27AAE1;stroke:none;" transform="matrix(1 0 0 1 339 1556)"> + <path d="M0.993347 0L3.6377 0L29.3282-67.1326L30.0301-67.1326L30.0301-70.459L28.1227-70.459ZM11.6882-24.4797L46.9818-24.4797L46.2311-26.7288L12.4382-26.7288ZM55.1193 0L57.7637 0L30.6381-70.459L29.4327-70.459L29.4327-67.1326Z"/> + </g> + <line id="Baseline-L" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1556" y2="1556"/> + <line id="Capline-L" style="fill:none;stroke:#27AAE1;opacity:1;stroke-width:0.5;" x1="263" x2="3036" y1="1485.54" y2="1485.54"/> + <line id="left-margin-Regular-M" style="fill:none;stroke:#00AEEF;stroke-width:0.5;opacity:1.0;" x1="1381.27" x2="1381.27" y1="1030.78" y2="1150.12"/> + <line id="right-margin-Regular-M" style="fill:none;stroke:#00AEEF;stroke-width:0.5;opacity:1.0;" x1="1518.41" x2="1518.41" y1="1030.78" y2="1150.12"/> + </g> + <g id="Symbols"> + <g id="Black-L" transform="matrix(1 0 0 1 2857.14 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.58-25.64L120.77-25.64L107.95-25.64L107.95-6.41L120.77-6.41L120.77-12.82C120.77-16.35 123.65-19.23 127.17-19.23C130.7-19.23 133.58-16.35 133.58-12.82L133.58-6.41L146.4-6.41L146.4-25.64L133.58-25.64Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.4-44.86L107.95-44.86L107.95-25.64L146.4-25.64L146.4-44.86Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.95-44.86L74.63-44.86C75.44-41.82 75.92-38.61 75.92-35.25C75.92-31.88 75.44-28.68 74.63-25.64L107.95-25.64L107.95-44.86Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0C21.29 0 5.44-15.86 5.44-35.24C5.44-54.63 21.29-70.48 40.68-70.48C60.06-70.48 75.92-54.63 75.92-35.24C75.92-15.86 60.06 0 40.68 0ZM40.68-51.26C31.87-51.26 24.66-44.05 24.66-35.24C24.66-26.43 31.87-19.23 40.68-19.23C49.49-19.23 56.69-26.43 56.69-35.24C56.69-44.05 49.49-51.26 40.68-51.26Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.63-44.86L53.49-44.86C55.41-42.14 56.69-38.93 56.69-35.25C56.69-31.56 55.41-28.36 53.49-25.64L74.63-25.64C75.44-28.68 75.92-31.88 75.92-35.25C75.92-38.61 75.44-41.82 74.63-44.86Z"/> + </g> + <g id="Heavy-L" transform="matrix(1 0 0 1 2560.43 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.59-25.63L120.78-25.63L107.96-25.63L107.96-6.41L120.78-6.41L120.78-12.82C120.78-16.34 123.66-19.23 127.18-19.23C130.71-19.23 133.59-16.34 133.59-12.82L133.59-6.41L146.4-6.41L146.4-25.63L133.59-25.63Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.4-44.86L107.96-44.86L107.96-25.63L146.4-25.63L146.4-44.86Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.96-44.86L74.64-44.86C75.44-41.81 75.92-38.61 75.92-35.24C75.92-31.88 75.44-28.68 74.64-25.63L107.96-25.63L107.96-44.86Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0C21.3 0 5.44-15.86 5.44-35.24C5.44-54.62 21.3-70.48 40.68-70.48C60.07-70.48 75.92-54.62 75.92-35.24C75.92-15.86 60.07 0 40.68 0ZM40.68-51.26C31.87-51.26 24.67-44.05 24.67-35.24C24.67-26.43 31.87-19.22 40.68-19.22C49.49-19.22 56.7-26.43 56.7-35.24C56.7-44.05 49.49-51.26 40.68-51.26Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.64-44.86L53.5-44.86C55.42-42.13 56.7-38.93 56.7-35.24C56.7-31.56 55.42-28.36 53.5-25.63L74.64-25.63C75.44-28.68 75.92-31.88 75.92-35.24C75.92-38.61 75.44-41.81 74.64-44.86Z"/> + </g> + <g id="Bold-L" transform="matrix(1 0 0 1 2263.72 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.59-25.63L120.77-25.63L107.96-25.63L107.96-6.41L120.77-6.41L120.77-12.81C120.77-16.34 123.66-19.22 127.18-19.22C130.7-19.22 133.59-16.34 133.59-12.81L133.59-6.41L146.4-6.41L146.4-25.63L133.59-25.63Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.4-44.85L107.96-44.85L107.96-25.63L146.4-25.63L146.4-44.85Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.96-44.85L74.64-44.85C75.44-41.81 75.92-38.6 75.92-35.24C75.92-31.88 75.44-28.67 74.64-25.63L107.96-25.63L107.96-44.85Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0C21.3 0 5.44-15.85 5.44-35.24C5.44-54.62 21.3-70.48 40.68-70.48C60.06-70.48 75.92-54.62 75.92-35.24C75.92-15.85 60.06 0 40.68 0ZM40.68-51.25C31.87-51.25 24.66-44.05 24.66-35.24C24.66-26.43 31.87-19.22 40.68-19.22C49.49-19.22 56.7-26.43 56.7-35.24C56.7-44.05 49.49-51.25 40.68-51.25Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.64-44.85L53.5-44.85C55.42-42.13 56.7-38.92 56.7-35.24C56.7-31.56 55.42-28.35 53.5-25.63L74.64-25.63C75.44-28.67 75.92-31.88 75.92-35.24C75.92-38.6 75.44-41.81 74.64-44.85Z"/> + </g> + <g id="Semibold-L" transform="matrix(1 0 0 1 1967 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.59-25.09L120.78-25.09L107.96-25.09L107.96-5.86L120.78-5.86L120.78-12.27C120.78-15.8 123.66-18.68 127.18-18.68C130.71-18.68 133.59-15.8 133.59-12.27L133.59-5.86L146.41-5.86L146.41-25.09L133.59-25.09Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.41-44.31L107.96-44.31L107.96-25.09L146.41-25.09L146.41-44.31Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.96-44.31L74.64-44.31C75.44-41.27 75.93-38.06 75.93-34.7C75.93-31.33 75.44-28.13 74.64-25.09L107.96-25.09L107.96-44.31Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0.55C21.3 0.55 5.44-15.31 5.44-34.69C5.44-54.08 21.3-69.93 40.68-69.93C60.07-69.93 75.92-54.08 75.92-34.69C75.92-15.31 60.07 0.55 40.68 0.55ZM40.68-50.71C31.87-50.71 24.67-43.5 24.67-34.69C24.67-25.88 31.87-18.68 40.68-18.68C49.49-18.68 56.7-25.88 56.7-34.69C56.7-43.5 49.49-50.71 40.68-50.71Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.64-44.31L53.5-44.31C55.42-41.59 56.7-38.38 56.7-34.7C56.7-31.01 55.42-27.81 53.5-25.09L74.64-25.09C75.44-28.13 75.92-31.33 75.92-34.7C75.92-38.06 75.44-41.27 74.64-44.31Z"/> + </g> + <g id="Medium-L" transform="matrix(1 0 0 1 1670.3 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.59-25.26L120.77-25.26L107.96-25.26L107.96-6.04L120.77-6.04L120.77-12.45C120.77-15.97 123.66-18.85 127.18-18.85C130.7-18.85 133.59-15.97 133.59-12.45L133.59-6.04L146.4-6.04L146.4-25.26L133.59-25.26Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.4-44.48L107.96-44.48L107.96-25.26L146.4-25.26L146.4-44.48Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.96-44.48L74.64-44.48C75.44-41.44 75.92-38.24 75.92-34.87C75.92-31.51 75.44-28.31 74.64-25.26L107.96-25.26L107.96-44.48Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0.37C21.3 0.37 5.44-15.49 5.44-34.87C5.44-54.25 21.3-70.11 40.68-70.11C60.06-70.11 75.92-54.25 75.92-34.87C75.92-15.49 60.06 0.37 40.68 0.37ZM40.68-50.89C31.87-50.89 24.66-43.68 24.66-34.87C24.66-26.06 31.87-18.85 40.68-18.85C49.49-18.85 56.7-26.06 56.7-34.87C56.7-43.68 49.49-50.89 40.68-50.89Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.64-44.48L53.5-44.48C55.42-41.76 56.7-38.56 56.7-34.87C56.7-31.19 55.42-27.99 53.5-25.26L74.64-25.26C75.44-28.31 75.92-31.51 75.92-34.87C75.92-38.24 75.44-41.44 74.64-44.48Z"/> + </g> + <g id="Regular-L" transform="matrix(1 0 0 1 1373.58 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.58-25.61L120.77-25.61L107.95-25.61L107.95-6.39L120.77-6.39L120.77-12.8C120.77-16.32 123.65-19.21 127.18-19.21C130.7-19.21 133.58-16.32 133.58-12.8L133.58-6.39L146.4-6.39L146.4-25.61L133.58-25.61Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.4-44.84L107.95-44.84L107.95-25.61L146.4-25.61L146.4-44.84Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.95-44.84L74.64-44.84C75.44-41.79 75.92-38.59 75.92-35.23C75.92-31.86 75.44-28.66 74.64-25.61L107.95-25.61L107.95-44.84Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0.02C21.29 0.02 5.44-15.84 5.44-35.22C5.44-54.6 21.29-70.46 40.68-70.46C60.06-70.46 75.92-54.6 75.92-35.22C75.92-15.84 60.06 0.02 40.68 0.02ZM40.68-51.24C31.87-51.24 24.66-44.03 24.66-35.22C24.66-26.41 31.87-19.2 40.68-19.2C49.49-19.2 56.69-26.41 56.69-35.22C56.69-44.03 49.49-51.24 40.68-51.24Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.64-44.84L53.49-44.84C55.41-42.11 56.7-38.91 56.7-35.23C56.7-31.54 55.41-28.34 53.49-25.61L74.64-25.61C75.44-28.66 75.92-31.86 75.92-35.23C75.92-38.59 75.44-41.79 74.64-44.84Z"/> + </g> + <g id="Light-L" transform="matrix(1 0 0 1 1076.87 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.59-25.64L120.77-25.64L107.96-25.64L107.96-6.41L120.77-6.41L120.77-12.82C120.77-16.35 123.66-19.23 127.18-19.23C130.7-19.23 133.59-16.35 133.59-12.82L133.59-6.41L146.4-6.41L146.4-25.64L133.59-25.64Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.4-44.86L107.96-44.86L107.96-25.64L146.4-25.64L146.4-44.86Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.96-44.86L74.64-44.86C75.44-41.82 75.92-38.61 75.92-35.25C75.92-31.88 75.44-28.68 74.64-25.64L107.96-25.64L107.96-44.86Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0C21.3 0 5.44-15.86 5.44-35.24C5.44-54.63 21.3-70.48 40.68-70.48C60.06-70.48 75.92-54.63 75.92-35.24C75.92-15.86 60.06 0 40.68 0ZM40.68-51.26C31.87-51.26 24.66-44.05 24.66-35.24C24.66-26.43 31.87-19.23 40.68-19.23C49.49-19.23 56.7-26.43 56.7-35.24C56.7-44.05 49.49-51.26 40.68-51.26Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.64-44.86L53.5-44.86C55.42-42.14 56.7-38.93 56.7-35.25C56.7-31.56 55.42-28.36 53.5-25.64L74.64-25.64C75.44-28.68 75.92-31.88 75.92-35.25C75.92-38.61 75.44-41.82 74.64-44.86Z"/> + </g> + <g id="Thin-L" transform="matrix(1 0 0 1 780.162 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.586-25.63L120.771-25.63L107.957-25.63L107.957-6.41L120.771-6.41L120.771-12.81C120.771-16.34 123.655-19.22 127.179-19.22C130.703-19.22 133.586-16.34 133.586-12.81L133.586-6.41L146.4-6.41L146.4-25.63L133.586-25.63Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.4-44.85L107.957-44.85L107.957-25.63L146.4-25.63L146.4-44.85Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.957-44.85L74.639-44.85C75.44-41.81 75.92-38.6 75.92-35.24C75.92-31.88 75.44-28.67 74.639-25.63L107.957-25.63L107.957-44.85Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0C21.298 0 5.44-15.85 5.44-35.24C5.44-54.62 21.298-70.48 40.68-70.48C60.062-70.48 75.92-54.62 75.92-35.24C75.92-15.85 60.062 0 40.68 0ZM40.68-51.25C31.87-51.25 24.662-44.05 24.662-35.24C24.662-26.43 31.87-19.22 40.68-19.22C49.49-19.22 56.698-26.43 56.698-35.24C56.698-44.05 49.49-51.25 40.68-51.25Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.639-44.85L53.495-44.85C55.417-42.13 56.699-38.92 56.699-35.24C56.699-31.56 55.417-28.35 53.495-25.63L74.639-25.63C75.44-28.67 75.92-31.88 75.92-35.24C75.92-38.6 75.44-41.81 74.639-44.85Z"/> + </g> + <g id="Ultralight-L" transform="matrix(1 0 0 1 483.451 1556)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M133.586-25.61L120.771-25.61L107.957-25.61L107.957-6.39L120.771-6.39L120.771-12.8C120.771-16.32 123.655-19.21 127.179-19.21C130.703-19.21 133.586-16.32 133.586-12.8L133.586-6.39L146.4-6.39L146.4-25.61L133.586-25.61Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M146.4-44.84L107.957-44.84L107.957-25.61L146.4-25.61L146.4-44.84Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M107.957-44.84L74.639-44.84C75.44-41.79 75.92-38.59 75.92-35.23C75.92-31.86 75.44-28.66 74.639-25.61L107.957-25.61L107.957-44.84Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M40.68 0.02C21.298 0.02 5.44-15.84 5.44-35.22C5.44-54.6 21.298-70.46 40.68-70.46C60.062-70.46 75.92-54.6 75.92-35.22C75.92-15.84 60.062 0.02 40.68 0.02ZM40.68-51.24C31.87-51.24 24.662-44.03 24.662-35.22C24.662-26.41 31.87-19.2 40.68-19.2C49.49-19.2 56.698-26.41 56.698-35.22C56.698-44.03 49.49-51.24 40.68-51.24Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M74.639-44.84L53.495-44.84C55.417-42.11 56.699-38.91 56.699-35.23C56.699-31.54 55.417-28.34 53.495-25.61L74.639-25.61C75.44-28.66 75.92-31.86 75.92-35.23C75.92-38.59 75.44-41.79 74.639-44.84Z"/> + </g> + <g id="Black-M" transform="matrix(1 0 0 1 2864.83 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.61-25.94L108.19-25.94L96.78-25.94L96.78-8.81L108.19-8.81L108.19-14.52C108.19-17.66 110.76-20.23 113.9-20.23C117.04-20.23 119.61-17.66 119.61-14.52L119.61-8.81L131.03-8.81L131.03-25.94L119.61-25.94Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.03-43.06L96.78-43.06L96.78-25.94L131.03-25.94L131.03-43.06Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.78-43.06L67.09-43.06C67.81-40.35 68.24-37.5 68.24-34.5C68.24-31.5 67.81-28.65 67.09-25.94L96.78-25.94L96.78-43.06Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.84-3.1C19.57-3.1 5.44-17.23 5.44-34.5C5.44-51.77 19.57-65.89 36.84-65.89C54.11-65.89 68.24-51.77 68.24-34.5C68.24-17.23 54.11-3.1 36.84-3.1ZM36.84-48.77C28.99-48.77 22.57-42.35 22.57-34.5C22.57-26.65 28.99-20.23 36.84-20.23C44.69-20.23 51.11-26.65 51.11-34.5C51.11-42.35 44.69-48.77 36.84-48.77Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-43.06L48.26-43.06C49.97-40.64 51.11-37.78 51.11-34.5C51.11-31.22 49.97-28.36 48.26-25.94L67.09-25.94C67.81-28.65 68.24-31.5 68.24-34.5C68.24-37.5 67.81-40.35 67.09-43.06Z"/> + </g> + <g id="Heavy-M" transform="matrix(1 0 0 1 2568.12 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.61-25.93L108.19-25.93L96.77-25.93L96.77-8.81L108.19-8.81L108.19-14.52C108.19-17.66 110.76-20.23 113.9-20.23C117.04-20.23 119.61-17.66 119.61-14.52L119.61-8.81L131.02-8.81L131.02-25.93L119.61-25.93Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.02-43.06L96.77-43.06L96.77-25.93L131.02-25.93L131.02-43.06Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.77-43.06L67.09-43.06C67.8-40.35 68.23-37.49 68.23-34.5C68.23-31.5 67.8-28.65 67.09-25.93L96.77-25.93L96.77-43.06Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.84-3.1C19.57-3.1 5.44-17.23 5.44-34.49C5.44-51.76 19.57-65.89 36.84-65.89C54.1-65.89 68.23-51.76 68.23-34.49C68.23-17.23 54.1-3.1 36.84-3.1ZM36.84-48.77C28.99-48.77 22.57-42.34 22.57-34.49C22.57-26.65 28.99-20.22 36.84-20.22C44.69-20.22 51.11-26.65 51.11-34.49C51.11-42.34 44.69-48.77 36.84-48.77Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-43.06L48.25-43.06C49.97-40.63 51.11-37.78 51.11-34.5C51.11-31.21 49.97-28.36 48.25-25.93L67.09-25.93C67.8-28.65 68.23-31.5 68.23-34.5C68.23-37.49 67.8-40.35 67.09-43.06Z"/> + </g> + <g id="Bold-M" transform="matrix(1 0 0 1 2271.41 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.6-25.94L108.19-25.94L96.77-25.94L96.77-8.81L108.19-8.81L108.19-14.52C108.19-17.66 110.75-20.23 113.89-20.23C117.03-20.23 119.6-17.66 119.6-14.52L119.6-8.81L131.02-8.81L131.02-25.94L119.6-25.94Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.02-43.06L96.77-43.06L96.77-25.94L131.02-25.94L131.02-43.06Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.77-43.06L67.09-43.06C67.8-40.35 68.23-37.5 68.23-34.5C68.23-31.5 67.8-28.65 67.09-25.94L96.77-25.94L96.77-43.06Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.83-3.1C19.56-3.1 5.44-17.23 5.44-34.5C5.44-51.77 19.56-65.89 36.83-65.89C54.1-65.89 68.23-51.77 68.23-34.5C68.23-17.23 54.1-3.1 36.83-3.1ZM36.83-48.77C28.98-48.77 22.56-42.35 22.56-34.5C22.56-26.65 28.98-20.23 36.83-20.23C44.68-20.23 51.1-26.65 51.1-34.5C51.1-42.35 44.68-48.77 36.83-48.77Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-43.06L48.25-43.06C49.96-40.64 51.1-37.78 51.1-34.5C51.1-31.22 49.96-28.36 48.25-25.94L67.09-25.94C67.8-28.65 68.23-31.5 68.23-34.5C68.23-37.5 67.8-40.35 67.09-43.06Z"/> + </g> + <g id="Semibold-M" transform="matrix(1 0 0 1 1974.69 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.61-25.93L108.19-25.93L96.78-25.93L96.78-8.81L108.19-8.81L108.19-14.52C108.19-17.66 110.76-20.23 113.9-20.23C117.04-20.23 119.61-17.66 119.61-14.52L119.61-8.81L131.03-8.81L131.03-25.93L119.61-25.93Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.03-43.06L96.78-43.06L96.78-25.93L131.03-25.93L131.03-43.06Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.78-43.06L67.09-43.06C67.81-40.35 68.23-37.49 68.23-34.5C68.23-31.5 67.81-28.65 67.09-25.93L96.78-25.93L96.78-43.06Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.84-3.1C19.57-3.1 5.44-17.23 5.44-34.49C5.44-51.76 19.57-65.89 36.84-65.89C54.11-65.89 68.23-51.76 68.23-34.49C68.23-17.23 54.11-3.1 36.84-3.1ZM36.84-48.77C28.99-48.77 22.57-42.34 22.57-34.49C22.57-26.65 28.99-20.22 36.84-20.22C44.69-20.22 51.11-26.65 51.11-34.49C51.11-42.34 44.69-48.77 36.84-48.77Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-43.06L48.26-43.06C49.97-40.63 51.11-37.78 51.11-34.5C51.11-31.21 49.97-28.36 48.26-25.93L67.09-25.93C67.81-28.65 68.23-31.5 68.23-34.5C68.23-37.49 67.81-40.35 67.09-43.06Z"/> + </g> + <g id="Medium-M" transform="matrix(1 0 0 1 1677.99 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.6-25.94L108.19-25.94L96.77-25.94L96.77-8.81L108.19-8.81L108.19-14.52C108.19-17.66 110.76-20.23 113.9-20.23C117.03-20.23 119.6-17.66 119.6-14.52L119.6-8.81L131.02-8.81L131.02-25.94L119.6-25.94Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.02-43.06L96.77-43.06L96.77-25.94L131.02-25.94L131.02-43.06Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.77-43.06L67.09-43.06C67.8-40.35 68.23-37.5 68.23-34.5C68.23-31.5 67.8-28.65 67.09-25.94L96.77-25.94L96.77-43.06Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.83-3.1C19.56-3.1 5.44-17.23 5.44-34.5C5.44-51.77 19.56-65.89 36.83-65.89C54.1-65.89 68.23-51.77 68.23-34.5C68.23-17.23 54.1-3.1 36.83-3.1ZM36.83-48.77C28.98-48.77 22.56-42.35 22.56-34.5C22.56-26.65 28.98-20.23 36.83-20.23C44.68-20.23 51.1-26.65 51.1-34.5C51.1-42.35 44.68-48.77 36.83-48.77Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-43.06L48.25-43.06C49.96-40.64 51.1-37.78 51.1-34.5C51.1-31.22 49.96-28.36 48.25-25.94L67.09-25.94C67.8-28.65 68.23-31.5 68.23-34.5C68.23-37.5 67.8-40.35 67.09-43.06Z"/> + </g> + <g id="Regular-M" transform="matrix(1 0 0 1 1381.27 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.61-25.93L108.19-25.93L96.77-25.93L96.77-8.81L108.19-8.81L108.19-14.52C108.19-17.66 110.76-20.23 113.9-20.23C117.04-20.23 119.61-17.66 119.61-14.52L119.61-8.81L131.02-8.81L131.02-25.93L119.61-25.93Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.02-43.06L96.77-43.06L96.77-25.93L131.02-25.93L131.02-43.06Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.77-43.06L67.09-43.06C67.8-40.35 68.23-37.49 68.23-34.5C68.23-31.5 67.8-28.65 67.09-25.93L96.77-25.93L96.77-43.06Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.83-3.1C19.57-3.1 5.44-17.23 5.44-34.49C5.44-51.76 19.57-65.89 36.83-65.89C54.1-65.89 68.23-51.76 68.23-34.49C68.23-17.23 54.1-3.1 36.83-3.1ZM36.83-48.77C28.99-48.77 22.56-42.34 22.56-34.49C22.56-26.65 28.99-20.22 36.83-20.22C44.68-20.22 51.1-26.65 51.1-34.49C51.1-42.34 44.68-48.77 36.83-48.77Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-43.06L48.25-43.06C49.96-40.63 51.1-37.78 51.1-34.5C51.1-31.21 49.96-28.36 48.25-25.93L67.09-25.93C67.8-28.65 68.23-31.5 68.23-34.5C68.23-37.49 67.8-40.35 67.09-43.06Z"/> + </g> + <g id="Light-M" transform="matrix(1 0 0 1 1084.56 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.61-26.98L108.19-26.98L96.78-26.98L96.78-9.86L108.19-9.86L108.19-15.57C108.19-18.71 110.76-21.28 113.9-21.28C117.04-21.28 119.61-18.71 119.61-15.57L119.61-9.86L131.03-9.86L131.03-26.98L119.61-26.98Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.03-44.11L96.78-44.11L96.78-26.98L131.03-26.98L131.03-44.11Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.78-44.11L67.09-44.11C67.81-41.4 68.23-38.54 68.23-35.55C68.23-32.55 67.81-29.7 67.09-26.98L96.78-26.98L96.78-44.11Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.84-4.15C19.57-4.15 5.44-18.28 5.44-35.55C5.44-52.81 19.57-66.94 36.84-66.94C54.11-66.94 68.23-52.81 68.23-35.55C68.23-18.28 54.11-4.15 36.84-4.15ZM36.84-49.82C28.99-49.82 22.57-43.39 22.57-35.55C22.57-27.7 28.99-21.27 36.84-21.27C44.69-21.27 51.11-27.7 51.11-35.55C51.11-43.39 44.69-49.82 36.84-49.82Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-44.11L48.25-44.11C49.97-41.68 51.11-38.83 51.11-35.55C51.11-32.26 49.97-29.41 48.25-26.98L67.09-26.98C67.81-29.7 68.23-32.55 68.23-35.55C68.23-38.54 67.81-41.4 67.09-44.11Z"/> + </g> + <g id="Thin-M" transform="matrix(1 0 0 1 787.851 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.606-26.98L108.19-26.98L96.773-26.98L96.773-9.86L108.19-9.86L108.19-15.57C108.19-18.71 110.758-21.28 113.898-21.28C117.038-21.28 119.606-18.71 119.606-15.57L119.606-9.86L131.023-9.86L131.023-26.98L119.606-26.98Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.023-44.11L96.773-44.11L96.773-26.98L131.023-26.98L131.023-44.11Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.773-44.11L67.09-44.11C67.804-41.4 68.232-38.54 68.232-35.55C68.232-32.55 67.804-29.7 67.09-26.98L96.773-26.98L96.773-44.11Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.835-4.15C19.568-4.15 5.44-18.28 5.44-35.55C5.44-52.81 19.568-66.94 36.835-66.94C54.103-66.94 68.231-52.81 68.231-35.55C68.231-18.28 54.103-4.15 36.835-4.15ZM36.835-49.82C28.986-49.82 22.565-43.39 22.565-35.55C22.565-27.7 28.986-21.27 36.835-21.27C44.684-21.27 51.106-27.7 51.106-35.55C51.106-43.39 44.684-49.82 36.835-49.82Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-44.11L48.252-44.11C49.965-41.68 51.106-38.83 51.106-35.55C51.106-32.26 49.965-29.41 48.252-26.98L67.09-26.98C67.803-29.7 68.231-32.55 68.231-35.55C68.231-38.54 67.803-41.4 67.09-44.11Z"/> + </g> + <g id="Ultralight-M" transform="matrix(1 0 0 1 491.14 1126)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M119.606-26.98L108.19-26.98L96.773-26.98L96.773-9.86L108.19-9.86L108.19-15.57C108.19-18.71 110.758-21.28 113.898-21.28C117.038-21.28 119.606-18.71 119.606-15.57L119.606-9.86L131.023-9.86L131.023-26.98L119.606-26.98Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M131.023-44.11L96.773-44.11L96.773-26.98L131.023-26.98L131.023-44.11Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M96.773-44.11L67.089-44.11C67.803-41.4 68.231-38.54 68.231-35.55C68.231-32.55 67.803-29.7 67.089-26.98L96.773-26.98L96.773-44.11Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M36.835-4.15C19.568-4.15 5.44-18.28 5.44-35.55C5.44-52.81 19.568-66.94 36.835-66.94C54.103-66.94 68.231-52.81 68.231-35.55C68.231-18.28 54.103-4.15 36.835-4.15ZM36.835-49.82C28.986-49.82 22.565-43.39 22.565-35.55C22.565-27.7 28.986-21.27 36.835-21.27C44.684-21.27 51.106-27.7 51.106-35.55C51.106-43.39 44.684-49.82 36.835-49.82Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M67.09-44.11L48.252-44.11C49.965-41.68 51.106-38.83 51.106-35.55C51.106-32.26 49.965-29.41 48.252-26.98L67.09-26.98C67.803-29.7 68.231-32.55 68.231-35.55C68.231-38.54 67.803-41.4 67.09-44.11Z"/> + </g> + <g id="Black-S" transform="matrix(1 0 0 1 2880.51 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.1-27.805L82.53-27.805L73.96-27.805L73.96-14.956L82.53-14.956L82.53-19.239C82.53-21.595 84.46-23.522 86.81-23.522C89.17-23.522 91.1-21.595 91.1-19.239L91.1-14.956L99.66-14.956L99.66-27.805L91.1-27.805Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.66-40.652L73.96-40.652L73.96-27.804L99.66-27.804L99.66-40.652Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.96-40.652L51.69-40.652C52.23-38.618 52.55-36.477 52.55-34.228C52.55-31.98 52.23-29.838 51.69-27.804L73.96-27.804L73.96-40.652Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.99-10.674C16.04-10.674 5.44-21.274 5.44-34.23C5.44-47.185 16.04-57.785 28.99-57.785C41.95-57.785 52.55-47.185 52.55-34.23C52.55-21.274 41.95-10.674 28.99-10.674ZM28.99-44.937C23.11-44.937 18.29-40.119 18.29-34.23C18.29-28.341 23.11-23.523 28.99-23.523C34.88-23.523 39.7-28.341 39.7-34.23C39.7-40.119 34.88-44.937 28.99-44.937Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.69-40.652L37.56-40.652C38.84-38.832 39.7-36.691 39.7-34.228C39.7-31.765 38.84-29.624 37.56-27.804L51.69-27.804C52.23-29.838 52.55-31.98 52.55-34.228C52.55-36.477 52.23-38.618 51.69-40.652Z"/> + </g> + <g id="Heavy-S" transform="matrix(1 0 0 1 2583.8 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.1-27.805L82.53-27.805L73.96-27.805L73.96-14.956L82.53-14.956L82.53-19.239C82.53-21.595 84.46-23.522 86.81-23.522C89.17-23.522 91.1-21.595 91.1-19.239L91.1-14.956L99.66-14.956L99.66-27.805L91.1-27.805Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.66-40.652L73.96-40.652L73.96-27.804L99.66-27.804L99.66-40.652Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.96-40.652L51.69-40.652C52.23-38.618 52.55-36.477 52.55-34.228C52.55-31.98 52.23-29.838 51.69-27.804L73.96-27.804L73.96-40.652Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.99-10.674C16.04-10.674 5.44-21.274 5.44-34.23C5.44-47.185 16.04-57.785 28.99-57.785C41.95-57.785 52.55-47.185 52.55-34.23C52.55-21.274 41.95-10.674 28.99-10.674ZM28.99-44.937C23.11-44.937 18.29-40.119 18.29-34.23C18.29-28.341 23.11-23.523 28.99-23.523C34.88-23.523 39.7-28.341 39.7-34.23C39.7-40.119 34.88-44.937 28.99-44.937Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.69-40.652L37.56-40.652C38.84-38.832 39.7-36.691 39.7-34.228C39.7-31.765 38.84-29.624 37.56-27.804L51.69-27.804C52.23-29.838 52.55-31.98 52.55-34.228C52.55-36.477 52.23-38.618 51.69-40.652Z"/> + </g> + <g id="Bold-S" transform="matrix(1 0 0 1 2287.09 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.1-27.801L82.53-27.801L73.96-27.801L73.96-14.952L82.53-14.952L82.53-19.235C82.53-21.591 84.46-23.518 86.81-23.518C89.17-23.518 91.1-21.591 91.1-19.235L91.1-14.952L99.66-14.952L99.66-27.801L91.1-27.801Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.66-40.648L73.96-40.648L73.96-27.8L99.66-27.8L99.66-40.648Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.96-40.648L51.69-40.648C52.23-38.614 52.55-36.473 52.55-34.224C52.55-31.976 52.23-29.834 51.69-27.8L73.96-27.8L73.96-40.648Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.99-10.67C16.04-10.67 5.44-21.27 5.44-34.226C5.44-47.181 16.04-57.781 28.99-57.781C41.95-57.781 52.55-47.181 52.55-34.226C52.55-21.27 41.95-10.67 28.99-10.67ZM28.99-44.933C23.11-44.933 18.29-40.115 18.29-34.226C18.29-28.337 23.11-23.519 28.99-23.519C34.88-23.519 39.7-28.337 39.7-34.226C39.7-40.115 34.88-44.933 28.99-44.933Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.69-40.648L37.56-40.648C38.84-38.828 39.7-36.687 39.7-34.224C39.7-31.762 38.84-29.62 37.56-27.8L51.69-27.8C52.23-29.834 52.55-31.976 52.55-34.224C52.55-36.473 52.23-38.614 51.69-40.648Z"/> + </g> + <g id="Semibold-S" transform="matrix(1 0 0 1 1990.38 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.1-27.805L82.53-27.805L73.96-27.805L73.96-14.956L82.53-14.956L82.53-19.239C82.53-21.595 84.46-23.522 86.81-23.522C89.17-23.522 91.1-21.595 91.1-19.239L91.1-14.956L99.66-14.956L99.66-27.805L91.1-27.805Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.66-40.652L73.96-40.652L73.96-27.804L99.66-27.804L99.66-40.652Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.96-40.652L51.69-40.652C52.23-38.618 52.55-36.477 52.55-34.228C52.55-31.98 52.23-29.838 51.69-27.804L73.96-27.804L73.96-40.652Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.99-10.674C16.04-10.674 5.44-21.274 5.44-34.23C5.44-47.185 16.04-57.785 28.99-57.785C41.95-57.785 52.55-47.185 52.55-34.23C52.55-21.274 41.95-10.674 28.99-10.674ZM28.99-44.937C23.11-44.937 18.29-40.119 18.29-34.23C18.29-28.341 23.11-23.523 28.99-23.523C34.88-23.523 39.7-28.341 39.7-34.23C39.7-40.119 34.88-44.937 28.99-44.937Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.69-40.652L37.56-40.652C38.84-38.832 39.7-36.691 39.7-34.228C39.7-31.765 38.84-29.624 37.56-27.804L51.69-27.804C52.23-29.838 52.55-31.98 52.55-34.228C52.55-36.477 52.23-38.618 51.69-40.652Z"/> + </g> + <g id="Medium-S" transform="matrix(1 0 0 1 1693.67 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.1-27.805L82.53-27.805L73.96-27.805L73.96-14.956L82.53-14.956L82.53-19.239C82.53-21.595 84.46-23.522 86.81-23.522C89.17-23.522 91.1-21.595 91.1-19.239L91.1-14.956L99.66-14.956L99.66-27.805L91.1-27.805Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.66-40.652L73.96-40.652L73.96-27.804L99.66-27.804L99.66-40.652Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.96-40.652L51.69-40.652C52.23-38.618 52.55-36.477 52.55-34.228C52.55-31.98 52.23-29.838 51.69-27.804L73.96-27.804L73.96-40.652Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.99-10.674C16.04-10.674 5.44-21.274 5.44-34.23C5.44-47.185 16.04-57.785 28.99-57.785C41.95-57.785 52.55-47.185 52.55-34.23C52.55-21.274 41.95-10.674 28.99-10.674ZM28.99-44.937C23.11-44.937 18.29-40.119 18.29-34.23C18.29-28.341 23.11-23.523 28.99-23.523C34.88-23.523 39.7-28.341 39.7-34.23C39.7-40.119 34.88-44.937 28.99-44.937Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.69-40.652L37.56-40.652C38.84-38.832 39.7-36.691 39.7-34.228C39.7-31.765 38.84-29.624 37.56-27.804L51.69-27.804C52.23-29.838 52.55-31.98 52.55-34.228C52.55-36.477 52.23-38.618 51.69-40.652Z"/> + </g> + <g id="Regular-S" transform="matrix(1 0 0 1 1396.95 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.1-27.801L82.53-27.801L73.96-27.801L73.96-14.952L82.53-14.952L82.53-19.235C82.53-21.591 84.46-23.518 86.81-23.518C89.17-23.518 91.1-21.591 91.1-19.235L91.1-14.952L99.66-14.952L99.66-27.801L91.1-27.801Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.66-40.648L73.96-40.648L73.96-27.8L99.66-27.8L99.66-40.648Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.96-40.648L51.69-40.648C52.23-38.614 52.55-36.473 52.55-34.224C52.55-31.976 52.23-29.834 51.69-27.8L73.96-27.8L73.96-40.648Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.99-10.67C16.04-10.67 5.44-21.27 5.44-34.226C5.44-47.181 16.04-57.781 28.99-57.781C41.95-57.781 52.55-47.181 52.55-34.226C52.55-21.27 41.95-10.67 28.99-10.67ZM28.99-44.933C23.11-44.933 18.29-40.115 18.29-34.226C18.29-28.337 23.11-23.519 28.99-23.519C34.88-23.519 39.7-28.337 39.7-34.226C39.7-40.115 34.88-44.933 28.99-44.933Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.69-40.648L37.56-40.648C38.84-38.828 39.7-36.687 39.7-34.224C39.7-31.762 38.84-29.62 37.56-27.8L51.69-27.8C52.23-29.834 52.55-31.976 52.55-34.224C52.55-36.473 52.23-38.614 51.69-40.648Z"/> + </g> + <g id="Light-S" transform="matrix(1 0 0 1 1100.24 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.1-27.801L82.53-27.801L73.96-27.801L73.96-14.952L82.53-14.952L82.53-19.235C82.53-21.591 84.46-23.518 86.81-23.518C89.17-23.518 91.1-21.591 91.1-19.235L91.1-14.952L99.66-14.952L99.66-27.801L91.1-27.801Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.66-40.648L73.96-40.648L73.96-27.8L99.66-27.8L99.66-40.648Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.96-40.648L51.69-40.648C52.23-38.614 52.55-36.473 52.55-34.224C52.55-31.976 52.23-29.834 51.69-27.8L73.96-27.8L73.96-40.648Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.99-10.67C16.04-10.67 5.44-21.27 5.44-34.226C5.44-47.181 16.04-57.781 28.99-57.781C41.95-57.781 52.55-47.181 52.55-34.226C52.55-21.27 41.95-10.67 28.99-10.67ZM28.99-44.933C23.11-44.933 18.29-40.115 18.29-34.226C18.29-28.337 23.11-23.519 28.99-23.519C34.88-23.519 39.7-28.337 39.7-34.226C39.7-40.115 34.88-44.933 28.99-44.933Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.69-40.648L37.56-40.648C38.84-38.828 39.7-36.687 39.7-34.224C39.7-31.762 38.84-29.62 37.56-27.8L51.69-27.8C52.23-29.834 52.55-31.976 52.55-34.224C52.55-36.473 52.23-38.614 51.69-40.648Z"/> + </g> + <g id="Thin-S" transform="matrix(1 0 0 1 803.531 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.097-27.805L82.531-27.805L73.965-27.805L73.965-14.956L82.531-14.956L82.531-19.239C82.531-21.595 84.458-23.522 86.814-23.522C89.169-23.522 91.097-21.595 91.097-19.239L91.097-14.956L99.662-14.956L99.662-27.805L91.097-27.805Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.662-40.652L73.965-40.652L73.965-27.804L99.662-27.804L99.662-40.652Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.965-40.652L51.694-40.652C52.23-38.618 52.551-36.477 52.551-34.228C52.551-31.98 52.23-29.838 51.694-27.804L73.965-27.804L73.965-40.652Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.996-10.674C16.04-10.674 5.44-21.274 5.44-34.23C5.44-47.185 16.04-57.785 28.996-57.785C41.951-57.785 52.551-47.185 52.551-34.23C52.551-21.274 41.951-10.674 28.996-10.674ZM28.996-44.937C23.107-44.937 18.288-40.119 18.288-34.23C18.288-28.341 23.107-23.523 28.996-23.523C34.884-23.523 39.703-28.341 39.703-34.23C39.703-40.119 34.884-44.937 28.996-44.937Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.694-40.652L37.561-40.652C38.846-38.832 39.703-36.691 39.703-34.228C39.703-31.765 38.846-29.624 37.561-27.804L51.694-27.804C52.23-29.838 52.551-31.98 52.551-34.228C52.551-36.477 52.23-38.618 51.694-40.652Z"/> + </g> + <g id="Ultralight-S" transform="matrix(1 0 0 1 506.82 696)"> + <path class="multicolor-0:custom SFSymbolsPreview34A853" d="M91.097-28.801L82.531-28.801L73.965-28.801L73.965-15.952L82.531-15.952L82.531-20.235C82.531-22.591 84.458-24.518 86.814-24.518C89.169-24.518 91.097-22.591 91.097-20.235L91.097-15.952L99.662-15.952L99.662-28.801L91.097-28.801Z"/> + <path class="multicolor-1:custom SFSymbolsPreview188038" d="M99.662-41.648L73.965-41.648L73.965-28.8L99.662-28.8L99.662-41.648Z"/> + <path class="multicolor-2:custom SFSymbolsPreviewFBBC04" d="M73.965-41.648L51.694-41.648C52.23-39.614 52.551-37.473 52.551-35.224C52.551-32.976 52.23-30.834 51.694-28.8L73.965-28.8L73.965-41.648Z"/> + <path class="multicolor-3:custom SFSymbolsPreview4183F0" d="M28.995-11.67C16.04-11.67 5.44-22.27 5.44-35.226C5.44-48.181 16.04-58.781 28.995-58.781C41.951-58.781 52.551-48.181 52.551-35.226C52.551-22.27 41.951-11.67 28.995-11.67ZM28.995-45.933C23.106-45.933 18.288-41.115 18.288-35.226C18.288-29.337 23.106-24.519 28.995-24.519C34.884-24.519 39.702-29.337 39.702-35.226C39.702-41.115 34.884-45.933 28.995-45.933Z"/> + <path class="multicolor-4:custom SFSymbolsPreviewEA4335" d="M51.694-41.648L37.561-41.648C38.846-39.828 39.702-37.687 39.702-35.224C39.702-32.762 38.846-30.62 37.561-28.8L51.694-28.8C52.23-30.834 52.551-32.976 52.551-35.224C52.551-37.473 52.23-39.614 51.694-41.648Z"/> + </g> + </g> +</svg>
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h index 527a825c..25a121c 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h
@@ -27,6 +27,7 @@ class OverlayPresenter; @protocol PageInfoCommands; @protocol PopupMenuCommands; +@protocol PriceNotificationsCommands; class PrefService; @protocol FindInPageCommands; @protocol TextZoomCommands; @@ -52,6 +53,7 @@ BrowserCommands, BrowserCoordinatorCommands, FindInPageCommands, + PriceNotificationsCommands, TextZoomCommands> dispatcher;
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm index d1800041..faca3e35 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
@@ -49,6 +49,7 @@ #import "ios/chrome/browser/ui/commands/find_in_page_commands.h" #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" #import "ios/chrome/browser/ui/commands/page_info_commands.h" +#import "ios/chrome/browser/ui/commands/price_notifications_commands.h" #import "ios/chrome/browser/ui/commands/reading_list_add_command.h" #import "ios/chrome/browser/ui/commands/text_zoom_commands.h" #import "ios/chrome/browser/ui/default_promo/default_browser_utils.h" @@ -1701,9 +1702,7 @@ - (void)openPriceNotifications { RecordAction(UserMetricsAction("MobileMenuPriceNotifications")); [self.popupMenuCommandsHandler dismissPopupMenuAnimated:YES]; - // TODO(crbug.com/1371166) Once the Price Notifications coordinator has - // been merged into the codebase, access that coordinator to display the - // Price Notifications UI. + [self.dispatcher showPriceNotifications]; } // Dismisses the menu and opens downloads.
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h index 291370e..2b0500d 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h
@@ -18,6 +18,7 @@ @protocol PageInfoCommands; @protocol PopupMenuActionHandlerDelegate; @protocol PopupMenuCommands; +@protocol PriceNotificationsCommands; @protocol QRScannerCommands; @protocol TextZoomCommands; class WebNavigationBrowserAgent; @@ -37,6 +38,7 @@ BrowserCommands, FindInPageCommands, LoadQueryCommands, + PriceNotificationsCommands, TextZoomCommands> dispatcher;
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm index 1b7b638..ef4574fa 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
@@ -20,6 +20,7 @@ #import "ios/chrome/browser/ui/commands/load_query_commands.h" #import "ios/chrome/browser/ui/commands/open_new_tab_command.h" #import "ios/chrome/browser/ui/commands/page_info_commands.h" +#import "ios/chrome/browser/ui/commands/price_notifications_commands.h" #import "ios/chrome/browser/ui/commands/qr_scanner_commands.h" #import "ios/chrome/browser/ui/commands/text_zoom_commands.h" #import "ios/chrome/browser/ui/default_promo/default_browser_utils.h" @@ -241,9 +242,7 @@ break; case PopupMenuActionPriceNotifications: RecordAction(UserMetricsAction("MobileMenuPriceNotifications")); - // TODO(crbug.com/1371166) Once the Price Notifications coordinator has - // been merged into the codebase, access that coordinator to display the - // Price Notifications UI. + [self.dispatcher showPriceNotifications]; break; default: NOTREACHED() << "Unexpected identifier";
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm index ac46876..534e7a4 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
@@ -32,6 +32,7 @@ #import "ios/chrome/browser/ui/commands/find_in_page_commands.h" #import "ios/chrome/browser/ui/commands/page_info_commands.h" #import "ios/chrome/browser/ui/commands/popup_menu_commands.h" +#import "ios/chrome/browser/ui/commands/price_notifications_commands.h" #import "ios/chrome/browser/ui/commands/qr_scanner_commands.h" #import "ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.h" #import "ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h" @@ -385,11 +386,11 @@ if (IsNewOverflowMenuEnabled()) { if (@available(iOS 15, *)) { self.overflowMenuMediator = [[OverflowMenuMediator alloc] init]; - self.overflowMenuMediator.dispatcher = - static_cast<id<ActivityServiceCommands, ApplicationCommands, - BrowserCommands, BrowserCoordinatorCommands, - FindInPageCommands, TextZoomCommands>>( - self.browser->GetCommandDispatcher()); + self.overflowMenuMediator.dispatcher = static_cast< + id<ActivityServiceCommands, ApplicationCommands, BrowserCommands, + BrowserCoordinatorCommands, FindInPageCommands, + PriceNotificationsCommands, TextZoomCommands>>( + self.browser->GetCommandDispatcher()); self.overflowMenuMediator.bookmarksCommandsHandler = HandlerForProtocol( self.browser->GetCommandDispatcher(), BookmarksCommands); self.overflowMenuMediator.pageInfoCommandsHandler = HandlerForProtocol( @@ -523,10 +524,10 @@ self.actionHandler = [[PopupMenuActionHandler alloc] init]; self.actionHandler.baseViewController = self.baseViewController; - self.actionHandler.dispatcher = - static_cast<id<ApplicationCommands, BrowserCommands, FindInPageCommands, - LoadQueryCommands, TextZoomCommands>>( - self.browser->GetCommandDispatcher()); + self.actionHandler.dispatcher = static_cast< + id<ApplicationCommands, BrowserCommands, FindInPageCommands, + LoadQueryCommands, PriceNotificationsCommands, TextZoomCommands>>( + self.browser->GetCommandDispatcher()); self.actionHandler.bookmarksCommandsHandler = HandlerForProtocol( self.browser->GetCommandDispatcher(), BookmarksCommands); self.actionHandler.browserCoordinatorCommandsHandler = HandlerForProtocol(
diff --git a/ios/chrome/browser/ui/settings/password/create_password_manager_title_view.mm b/ios/chrome/browser/ui/settings/password/create_password_manager_title_view.mm index f239540..80d55fa5 100644 --- a/ios/chrome/browser/ui/settings/password/create_password_manager_title_view.mm +++ b/ios/chrome/browser/ui/settings/password/create_password_manager_title_view.mm
@@ -22,7 +22,7 @@ // Symbol name for the logo image. // Using password logo as placeholder until Password Manager SF Symbol is added. -NSString* const kLogoSymbolName = kPasswordSymbol; +NSString* const kLogoSymbolName = kPasswordManagerSymbol; } // namespace @@ -35,8 +35,8 @@ title_view.title = title; - title_view.imageLogo = CustomSymbolWithPointSize( - /*symbolName=*/kPasswordSymbol, /*pointSize=*/kSymbolPointSize); + title_view.imageLogo = CustomMulticolorSymbol( + /*symbolName=*/kLogoSymbolName, /*pointSize=*/kSymbolPointSize); title_view.accessibilityLabel = l10n_util::GetNSString( IDS_IOS_PASSWORD_MANAGER_TITLE_VIEW_ACCESSIBILITY_LABEL);
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.mm b/ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.mm index 3734cd8..cd16a57 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.mm
@@ -4,6 +4,7 @@ #import "ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.h" +#import "base/check.h" #import "ios/chrome/common/ui/reauthentication/reauthentication_module.h" #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/content_widget_extension/BUILD.gn b/ios/chrome/content_widget_extension/BUILD.gn index 0cfc6a5..caa4c60 100644 --- a/ios/chrome/content_widget_extension/BUILD.gn +++ b/ios/chrome/content_widget_extension/BUILD.gn
@@ -11,8 +11,8 @@ import("//ios/chrome/tools/strings/generate_localizable_strings.gni") import("//tools/grit/repack.gni") -assert(ios_deployment_target == "13.0", - "content_widget_extension must target iOS 13.0") +assert(ios_deployment_target == "13.4", + "content_widget_extension must target iOS 13.4") assert( ios_enable_content_widget_extension,
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb index 0f8f9ce..689916b 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr-Latn.xtb
@@ -32,7 +32,7 @@ <translation id="6159839020698489198">opcionalno</translation> <translation id="6216401132953873625">Dodajte novu lozinku</translation> <translation id="6387994324662817823">Lozinke se čuvaju u Google menadžeru lozinki samo na ovom uređaju.</translation> -<translation id="6539092367496845964">Nešto nije u redu. Probajte ponovo kasnije.</translation> +<translation id="6539092367496845964">Došlo je do greške. Probajte ponovo kasnije.</translation> <translation id="6657585470893396449">Lozinka</translation> <translation id="666236282349601348">Automatsko popunjavanje je uključeno</translation> <translation id="6710648923880003133">Predloži jaku lozinku</translation>
diff --git a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb index ed3b28b..a2c8919 100644 --- a/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb +++ b/ios/chrome/credential_provider_extension/strings/resources/ios_credential_provider_extension_strings_sr.xtb
@@ -32,7 +32,7 @@ <translation id="6159839020698489198">опционално</translation> <translation id="6216401132953873625">Додајте нову лозинку</translation> <translation id="6387994324662817823">Лозинке се чувају у Google менаџеру лозинки само на овом уређају.</translation> -<translation id="6539092367496845964">Нешто није у реду. Пробајте поново касније.</translation> +<translation id="6539092367496845964">Дошло је до грешке. Пробајте поново касније.</translation> <translation id="6657585470893396449">Лозинка</translation> <translation id="666236282349601348">Аутоматско попуњавање је укључено</translation> <translation id="6710648923880003133">Предложи јаку лозинку</translation>
diff --git a/ios/chrome/search_widget_extension/BUILD.gn b/ios/chrome/search_widget_extension/BUILD.gn index e455a43..32f8242 100644 --- a/ios/chrome/search_widget_extension/BUILD.gn +++ b/ios/chrome/search_widget_extension/BUILD.gn
@@ -11,8 +11,8 @@ import("//ios/chrome/tools/strings/generate_localizable_strings.gni") import("//tools/grit/repack.gni") -assert(ios_deployment_target == "13.0", - "search_widget_extension must target iOS 13.0") +assert(ios_deployment_target == "13.4", + "search_widget_extension must target iOS 13.4") assert( ios_enable_search_widget_extension,
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 index c778f58..e82e1dc 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -7ba830b2882a47bcee0c2d45d6f4d6fce56e6abd \ No newline at end of file +ddd5dc15f366da2e7d20e2a7eb20ec50c49d6546 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 index 164d153b..9786aa83 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -5b2c37434ba46ce3faac4de332362b9cf87bb9f5 \ No newline at end of file +6dd57a3338b1083c6ecd8f4b91102d799b120d3c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 77d8731..6b3baa0 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -0bd23483d2372cb6c459962cdd16072c0188354d \ No newline at end of file +1b634bf8ffc6f5d5fb6ddd30fbe6e53ae3f1735b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index eabb2b3..77d3996a 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -fe5f685f275460cfffedf775e1785162d61739c5 \ No newline at end of file +8fccd02572ab4b90d3129f63b76e3bad12c1f1a2 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index d98fe3de..4014c41 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -115e31ab66cf4b43756ee4cb37aabc40aa215eeb \ No newline at end of file +6c496d97c5beff3ddf1863302942fd91e599fb8c \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index 553b081..0efb94b 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -c8da74dd207c86ed516f917a9ebc36793365b538 \ No newline at end of file +0e5522ecc0c6769a1c5fcc67be50b5ee1ca1ac6a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 index 6d42aef..c8ae38a 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -17cf2a5f9de3ba9fad0292aa2d64525e4127071e \ No newline at end of file +84700b4a510ff9e7d973625599eb1e058c9822ee \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 index c0601a7..558dc3d 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -7d879e64855a5ba1a7093d7f4769f140ac47c78e \ No newline at end of file +24d395b416d14c2d867fdeb8e230f7525c5badd1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index 0804bd9..12c96a882 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -25fec8f35a5b78935afca32f942d520813623aef \ No newline at end of file +f29afff47ff62becff21b6d88cb82e064c6d7744 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index b2f8ada..85134682 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -c4b8f51eca13d0c26486e44e27114109f6e38b16 \ No newline at end of file +32d2ca9dbce7d689c5d2fffbc3aaf0b0caf8d835 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index 9d20bcc..4868dea 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -cfea7cda8ae8a21f41beadffc3f351557efcc147 \ No newline at end of file +e95061556bd04cb89cc6c95dabe208c526280798 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 12db6b95..0d079f5d4 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -177c3e9c4781eabc6aa1c340f1928f93d3374d74 \ No newline at end of file +4cc26410540e1d06bd214b18e3e3f9222fa5bb4b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index e22159fd..698e168 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -7cc138f537f8b5a3cd3ab7f3bc1fbcb40a03a5f0 \ No newline at end of file +fcf1f6b9e0aaf9174c78a8f76eefdb7124be9d65 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index 48b2b33..4d9a58f 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -37361d73b54eb4cb9009fdebcf56ea0cb8368df6 \ No newline at end of file +b26adf063d527df45584203d93fa4695bb963cf0 \ No newline at end of file
diff --git a/ios/web/crw_navigation_item_storage.mm b/ios/web/crw_navigation_item_storage.mm index 9262acd5..9250579 100644 --- a/ios/web/crw_navigation_item_storage.mm +++ b/ios/web/crw_navigation_item_storage.mm
@@ -26,8 +26,6 @@ NSString* const kNavigationItemStorageTitleKey = @"title"; NSString* const kNavigationItemStoragePageDisplayStateKey = @"state"; NSString* const kNavigationItemStorageHTTPRequestHeadersKey = @"httpHeaders"; -NSString* const kNavigationItemStorageSkipRepostFormConfirmationKey = - @"skipResubmitDataConfirmation"; NSString* const kNavigationItemStorageUserAgentTypeKey = @"userAgentType"; const char kNavigationItemSerializedSizeHistogram[] = @@ -65,8 +63,6 @@ [description appendFormat:@"title : %@, ", base::SysUTF16ToNSString(_title)]; [description appendFormat:@"displayState : %@", _displayState.GetDescription()]; - [description appendFormat:@"skipRepostConfirmation : %@, ", - @(_shouldSkipRepostFormConfirmation)]; [description appendFormat:@"userAgentType : %s, ", web::GetUserAgentTypeDescription(_userAgentType).c_str()]; @@ -137,9 +133,6 @@ NSDictionary* serializedDisplayState = [aDecoder decodeObjectForKey:web::kNavigationItemStoragePageDisplayStateKey]; _displayState = web::PageDisplayState(serializedDisplayState); - _shouldSkipRepostFormConfirmation = - [aDecoder decodeBoolForKey: - web::kNavigationItemStorageSkipRepostFormConfirmationKey]; _HTTPRequestHeaders = [aDecoder decodeObjectForKey:web::kNavigationItemStorageHTTPRequestHeadersKey]; } @@ -206,10 +199,6 @@ web::kNavigationItemSerializedDisplayStateSizeHistogram, serializedDisplayStateSizeInBytes / 1024); - [aCoder encodeBool:_shouldSkipRepostFormConfirmation - forKey:web::kNavigationItemStorageSkipRepostFormConfirmationKey]; - // Size of BOOL is negligible, do not log or count towards session size. - std::string userAgent = web::GetUserAgentTypeDescription(_userAgentType); web::nscoder_util::EncodeString( aCoder, web::kNavigationItemStorageUserAgentTypeKey, userAgent);
diff --git a/ios/web/navigation/navigation_item_impl.h b/ios/web/navigation/navigation_item_impl.h index 7b821df..a21922c 100644 --- a/ios/web/navigation/navigation_item_impl.h +++ b/ios/web/navigation/navigation_item_impl.h
@@ -81,11 +81,6 @@ web::NavigationInitiationType navigation_initiation_type); web::NavigationInitiationType NavigationInitiationType() const; - // Whether or not to bypass showing the repost form confirmation when loading - // a POST request. Set to YES for browser-generated POST requests. - void SetShouldSkipRepostFormConfirmation(bool skip); - bool ShouldSkipRepostFormConfirmation() const; - // Whether or not to bypass serializing this item to session storage. Set to // YES to skip saving this page (and therefore restoring this page). void SetShouldSkipSerialization(bool skip); @@ -144,7 +139,6 @@ NSString* serialized_state_object_; bool is_created_from_hash_change_; - bool should_skip_repost_form_confirmation_; bool should_skip_serialization_; NSData* post_data_;
diff --git a/ios/web/navigation/navigation_item_impl.mm b/ios/web/navigation/navigation_item_impl.mm index 7a30d5e..c4ae766f 100644 --- a/ios/web/navigation/navigation_item_impl.mm +++ b/ios/web/navigation/navigation_item_impl.mm
@@ -52,7 +52,6 @@ transition_type_(ui::PAGE_TRANSITION_LINK), user_agent_type_(UserAgentType::NONE), is_created_from_hash_change_(false), - should_skip_repost_form_confirmation_(false), should_skip_serialization_(false), navigation_initiation_type_(web::NavigationInitiationType::NONE), is_untrusted_(false), @@ -77,8 +76,6 @@ http_request_headers_([item.http_request_headers_ mutableCopy]), serialized_state_object_([item.serialized_state_object_ copy]), is_created_from_hash_change_(item.is_created_from_hash_change_), - should_skip_repost_form_confirmation_( - item.should_skip_repost_form_confirmation_), should_skip_serialization_(item.should_skip_serialization_), post_data_([item.post_data_ copy]), navigation_initiation_type_(item.navigation_initiation_type_), @@ -271,14 +268,6 @@ return is_created_from_hash_change_; } -void NavigationItemImpl::SetShouldSkipRepostFormConfirmation(bool skip) { - should_skip_repost_form_confirmation_ = skip; -} - -bool NavigationItemImpl::ShouldSkipRepostFormConfirmation() const { - return should_skip_repost_form_confirmation_; -} - void NavigationItemImpl::SetShouldSkipSerialization(bool skip) { should_skip_serialization_ = skip; }
diff --git a/ios/web/navigation/navigation_item_storage_builder.mm b/ios/web/navigation/navigation_item_storage_builder.mm index 17c64b3..fae949cc 100644 --- a/ios/web/navigation/navigation_item_storage_builder.mm +++ b/ios/web/navigation/navigation_item_storage_builder.mm
@@ -30,8 +30,6 @@ storage.timestamp = navigation_item.GetTimestamp(); storage.title = navigation_item.GetTitle(); storage.displayState = navigation_item.GetPageDisplayState(); - storage.shouldSkipRepostFormConfirmation = - navigation_item.ShouldSkipRepostFormConfirmation(); storage.userAgentType = navigation_item.GetUserAgentType(); storage.HTTPRequestHeaders = navigation_item.GetHttpRequestHeaders(); return storage; @@ -64,8 +62,6 @@ item->timestamp_ = navigation_item_storage.timestamp; item->title_ = navigation_item_storage.title; item->page_display_state_ = navigation_item_storage.displayState; - item->should_skip_repost_form_confirmation_ = - navigation_item_storage.shouldSkipRepostFormConfirmation; // Use reload transition type to avoid incorrect increase for typed count. item->transition_type_ = ui::PAGE_TRANSITION_RELOAD; item->user_agent_type_ = navigation_item_storage.userAgentType;
diff --git a/ios/web/navigation/navigation_item_storage_test_util.mm b/ios/web/navigation/navigation_item_storage_test_util.mm index 4980ee681..33385dd 100644 --- a/ios/web/navigation/navigation_item_storage_test_util.mm +++ b/ios/web/navigation/navigation_item_storage_test_util.mm
@@ -19,8 +19,6 @@ item1.referrer.policy == item2.referrer.policy && item1.timestamp == item2.timestamp && item1.title == item2.title && item1.displayState == item2.displayState && - item1.shouldSkipRepostFormConfirmation == - item2.shouldSkipRepostFormConfirmation && item1.userAgentType == item2.userAgentType && [item1.HTTPRequestHeaders isEqualToDictionary:item2.HTTPRequestHeaders];
diff --git a/ios/web/navigation/navigation_manager_impl.mm b/ios/web/navigation/navigation_manager_impl.mm index c107f300..7932694 100644 --- a/ios/web/navigation/navigation_manager_impl.mm +++ b/ios/web/navigation/navigation_manager_impl.mm
@@ -695,7 +695,6 @@ DCHECK([added_item->GetHttpRequestHeaders() objectForKey:@"Content-Type"]) << "Post data should have an associated content type"; added_item->SetPostData(params.post_data); - added_item->SetShouldSkipRepostFormConfirmation(true); } if (!web_view_cache_.IsAttachedToWebView()) {
diff --git a/ios/web/public/session/crw_navigation_item_storage.h b/ios/web/public/session/crw_navigation_item_storage.h index 05794d3..2ce9d472 100644 --- a/ios/web/public/session/crw_navigation_item_storage.h +++ b/ios/web/public/session/crw_navigation_item_storage.h
@@ -66,7 +66,6 @@ @property(nonatomic, assign) base::Time timestamp; @property(nonatomic, assign) const std::u16string& title; @property(nonatomic, assign) web::PageDisplayState displayState; -@property(nonatomic, assign) BOOL shouldSkipRepostFormConfirmation; @property(nonatomic, assign) web::UserAgentType userAgentType; @property(nonatomic, copy) NSDictionary* HTTPRequestHeaders;
diff --git a/ios/web/web_state/ui/crw_web_request_controller.mm b/ios/web/web_state/ui/crw_web_request_controller.mm index cd0020cb..e91c3f1e 100644 --- a/ios/web/web_state/ui/crw_web_request_controller.mm +++ b/ios/web/web_state/ui/crw_web_request_controller.mm
@@ -630,7 +630,6 @@ return; } - DCHECK(!repostedForm || currentItem->ShouldSkipRepostFormConfirmation()); [self webViewNavigationInternal:holder sameDocumentNavigation:sameDocumentNavigation]; }
diff --git a/ios/web/web_state/web_state_impl_realized_web_state.mm b/ios/web/web_state/web_state_impl_realized_web_state.mm index c36294a..f61afec6 100644 --- a/ios/web/web_state/web_state_impl_realized_web_state.mm +++ b/ios/web/web_state/web_state_impl_realized_web_state.mm
@@ -191,6 +191,10 @@ void WebStateImpl::RealizedWebState::OnNavigationStarted( NavigationContextImpl* context) { + // When a navigation starts, immediately close any visible dialogs to avoid + // confusion about the origin of a dialog. + ClearDialogs(); + // Navigation manager loads internal URLs to restore session history and // create back-forward entries for WebUI. Do not trigger external callbacks. if ([CRWErrorPageHelper isErrorPageFileURL:context->GetUrl()] ||
diff --git a/media/BUILD.gn b/media/BUILD.gn index 9272cfb..de679cfc 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn
@@ -189,6 +189,7 @@ data = [ "test/data/", "formats/mp4/h264_annex_b_fuzz_corpus/", + "formats/mp4/h265_annex_b_fuzz_corpus/", ] data_deps = [ "//testing/buildbot/filters:media_unittests_filters" ]
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 24b2208..8ea4923 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -964,6 +964,12 @@ "IncludeIRCamerasInDeviceEnumeration", base::FEATURE_DISABLED_BY_DEFAULT); +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) +// Enables HEVC encode acceleration for Windows. +const base::Feature MEDIA_EXPORT kMediaFoundationHEVCEncoding{ + "MediaFoundationHEVCEncoding", base::FEATURE_DISABLED_BY_DEFAULT}; +#endif + // Enables AV1 encode acceleration for Windows. const base::Feature MEDIA_EXPORT kMediaFoundationAV1Encoding{ "MediaFoundationAV1Encoding", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index d481a84..88206de6 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -273,6 +273,9 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kDirectShowGetPhotoState); MEDIA_EXPORT BASE_DECLARE_FEATURE(kIncludeIRCamerasInDeviceEnumeration); MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaFoundationAV1Encoding); +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) +MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaFoundationHEVCEncoding); +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) // For feature check of kMediaFoundationH264CbpEncoding at runtime, // please use IsMediaFoundationH264CbpEncodingEnabled() instead.
diff --git a/media/base/video_encoder.h b/media/base/video_encoder.h index cba5f44e..9fbb4624 100644 --- a/media/base/video_encoder.h +++ b/media/base/video_encoder.h
@@ -47,6 +47,10 @@ bool produce_annexb = false; }; + struct MEDIA_EXPORT HevcOptions { + bool produce_annexb = false; + }; + enum class LatencyMode { Realtime, Quality }; struct MEDIA_EXPORT Options { @@ -66,6 +70,9 @@ // Only used for H264 encoding. AvcOptions avc; + + // Only used for HEVC encoding. + HevcOptions hevc; }; // A sequence of codec specific bytes, commonly known as extradata.
diff --git a/media/formats/BUILD.gn b/media/formats/BUILD.gn index c25c7b7..cb4868f 100644 --- a/media/formats/BUILD.gn +++ b/media/formats/BUILD.gn
@@ -115,6 +115,13 @@ "mp4/hevc.cc", "mp4/hevc.h", ] + + if (enable_hevc_parser_and_hw_decoder) { + sources += [ + "mp4/h265_annex_b_to_hevc_bitstream_converter.cc", + "mp4/h265_annex_b_to_hevc_bitstream_converter.h", + ] + } } if (proprietary_codecs && enable_platform_dolby_vision) { @@ -321,6 +328,11 @@ if (enable_platform_hevc) { sources += [ "mp4/hevc_unittest.cc" ] + + if (enable_hevc_parser_and_hw_decoder) { + sources += + [ "mp4/h265_annex_b_to_hevc_bitstream_converter_unittest.cc" ] + } } } @@ -397,8 +409,8 @@ fuzzer_test("dts_util_fuzzer") { sources = [ "dts/dts_util_fuzzer.cc" ] deps = [ - "//media", "//base", + "//media", ] } }
diff --git a/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk1-config-idr.bin b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk1-config-idr.bin new file mode 100644 index 0000000..2ef0a35d --- /dev/null +++ b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk1-config-idr.bin Binary files differ
diff --git a/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk2-non-idr.bin b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk2-non-idr.bin new file mode 100644 index 0000000..c779dc0 --- /dev/null +++ b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk2-non-idr.bin Binary files differ
diff --git a/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk3-non-idr.bin b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk3-non-idr.bin new file mode 100644 index 0000000..0c75705f --- /dev/null +++ b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk3-non-idr.bin Binary files differ
diff --git a/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk4-non-idr.bin b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk4-non-idr.bin new file mode 100644 index 0000000..e80dcbf --- /dev/null +++ b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk4-non-idr.bin Binary files differ
diff --git a/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk5-non-idr.bin b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk5-non-idr.bin new file mode 100644 index 0000000..174e0824 --- /dev/null +++ b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk5-non-idr.bin Binary files differ
diff --git a/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk6-config-idr.bin b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk6-config-idr.bin new file mode 100644 index 0000000..2ef0a35d --- /dev/null +++ b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk6-config-idr.bin Binary files differ
diff --git a/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk7-non-idr.bin b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk7-non-idr.bin new file mode 100644 index 0000000..ed80921 --- /dev/null +++ b/media/formats/mp4/h265_annex_b_fuzz_corpus/chunk7-non-idr.bin Binary files differ
diff --git a/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.cc b/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.cc new file mode 100644 index 0000000..866bb51 --- /dev/null +++ b/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.cc
@@ -0,0 +1,340 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.h" + +#include "base/big_endian.h" +#include "base/containers/flat_set.h" + +namespace media { + +H265AnnexBToHevcBitstreamConverter::H265AnnexBToHevcBitstreamConverter() { + // These configuration items never change. + config_.configurationVersion = 1; + config_.lengthSizeMinusOne = 3; +} + +H265AnnexBToHevcBitstreamConverter::~H265AnnexBToHevcBitstreamConverter() = + default; + +const mp4::HEVCDecoderConfigurationRecord& +H265AnnexBToHevcBitstreamConverter::GetCurrentConfig() { + return config_; +} + +MP4Status H265AnnexBToHevcBitstreamConverter::ConvertChunk( + const base::span<const uint8_t> input, + base::span<uint8_t> output, + bool* config_changed_out, + size_t* size_out) { + std::vector<H265NALU> slice_units; + size_t data_size = 0; + bool config_changed = false; + H265NALU nalu; + H265Parser::Result result; + int new_active_sps_id = -1; + int new_active_pps_id = -1; + int new_active_vps_id = -1; + // Sets of SPS, PPS & VPS ids to be included into the decoder config. + // They contain + // - all VPS, SPS and PPS units encountered in the input chunk; + // - any SPS referenced by PPS units encountered in the input; + // - The active VPS/SPS/PPS pair. + base::flat_set<int> sps_to_include; + base::flat_set<int> pps_to_include; + base::flat_set<int> vps_to_include; + + // Scan input buffer looking for two main types of NALUs + // 1. VPS, SPS and PPS. They'll be added to the HEVC configuration |config_| + // and will *not* be copied to |output|. + // 2. Slices. They'll being copied into the output buffer, but also affect + // what configuration (profile and level) is active now. + // A configure change will only happen on IDR frame. It is expected the + // encoder output stream repeats VPS/SPS/PPS on IDR frames. + parser_.SetStream(input.data(), input.size()); + while ((result = parser_.AdvanceToNextNALU(&nalu)) != H265Parser::kEOStream) { + if (result == H265Parser::kUnsupportedStream) + return MP4Status::Codes::kUnsupportedStream; + + if (result != H265Parser::kOk) + return MP4Status::Codes::kFailedToParse; + + switch (nalu.nal_unit_type) { + case H265NALU::AUD_NUT: { + break; + } + case H265NALU::SPS_NUT: { + int sps_id = -1; + result = parser_.ParseSPS(&sps_id); + if (result == H265Parser::kUnsupportedStream) + return MP4Status::Codes::kInvalidSPS; + + if (result != H265Parser::kOk) + return MP4Status::Codes::kInvalidSPS; + + id2sps_.insert_or_assign(sps_id, + blob(nalu.data, nalu.data + nalu.size)); + sps_to_include.insert(sps_id); + if (auto* sps = parser_.GetSPS(sps_id)) { + vps_to_include.insert(sps->sps_video_parameter_set_id); + } + config_changed = true; + break; + } + + case H265NALU::VPS_NUT: { + int vps_id = -1; + result = parser_.ParseVPS(&vps_id); + if (result == H265Parser::kUnsupportedStream) + return MP4Status::Codes::kInvalidVPS; + + if (result != H265Parser::kOk) + return MP4Status::Codes::kInvalidVPS; + + id2vps_.insert_or_assign(vps_id, + blob(nalu.data, nalu.data + nalu.size)); + vps_to_include.insert(vps_id); + config_changed = true; + break; + } + + case H265NALU::PPS_NUT: { + int pps_id = -1; + result = parser_.ParsePPS(nalu, &pps_id); + if (result == H265Parser::kUnsupportedStream) + return MP4Status::Codes::kInvalidPPS; + + if (result != H265Parser::kOk) + return MP4Status::Codes::kInvalidPPS; + + id2pps_.insert_or_assign(pps_id, + blob(nalu.data, nalu.data + nalu.size)); + pps_to_include.insert(pps_id); + if (auto* pps = parser_.GetPPS(pps_id)) + sps_to_include.insert(pps->pps_seq_parameter_set_id); + config_changed = true; + break; + } + + // TODO: when HDR encoding is supported, we need to also move the prefix + // SEI out of slice data and put it into the hvccBox. + + // VCL, Non-IRAP + case H265NALU::TRAIL_N: + case H265NALU::TRAIL_R: + case H265NALU::TSA_N: + case H265NALU::TSA_R: + case H265NALU::STSA_N: + case H265NALU::STSA_R: + case H265NALU::RADL_N: + case H265NALU::RADL_R: + case H265NALU::RASL_N: + case H265NALU::RASL_R: + // VCL, IRAP + case H265NALU::BLA_W_LP: + case H265NALU::BLA_W_RADL: + case H265NALU::BLA_N_LP: + case H265NALU::IDR_W_RADL: + case H265NALU::IDR_N_LP: + case H265NALU::CRA_NUT: { + int pps_id = -1; + result = parser_.ParseSliceHeaderForPictureParameterSets(nalu, &pps_id); + if (result != H265Parser::kOk) { + return MP4Status::Codes::kInvalidSliceHeader; + } + + const H265PPS* pps = parser_.GetPPS(pps_id); + if (!pps) { + return MP4Status::Codes::kFailedToLookupPPS; + } + + const H265SPS* sps = parser_.GetSPS(pps->pps_seq_parameter_set_id); + if (!sps) { + return MP4Status::Codes::kFailedToLookupSPS; + } + const H265VPS* vps = parser_.GetVPS(sps->sps_video_parameter_set_id); + if (!vps) { + return MP4Status::Codes::kFailedToLookupVPS; + } + new_active_pps_id = pps->pps_pic_parameter_set_id; + new_active_sps_id = sps->sps_seq_parameter_set_id; + new_active_vps_id = vps->vps_video_parameter_set_id; + pps_to_include.insert(new_active_pps_id); + sps_to_include.insert(new_active_sps_id); + vps_to_include.insert(new_active_vps_id); + + if (new_active_sps_id != active_sps_id_ || + new_active_vps_id != active_vps_id_) { + if (!config_changed) { + DCHECK(nalu.nal_unit_type == H265NALU::IDR_W_RADL || + nalu.nal_unit_type == H265NALU::IDR_N_LP) + << "SPS/VPS shouldn't change in non-IDR slice"; + } + config_changed = true; + } + } + [[fallthrough]]; + default: + slice_units.push_back(nalu); + data_size += config_.lengthSizeMinusOne + 1 + nalu.size; + break; + } + } + + if (size_out) + *size_out = data_size; + if (data_size > output.size()) { + return MP4Status::Codes::kBufferTooSmall; + } + + // Write slice NALUs from the input buffer to the output buffer + // prefixing them with size. + base::BigEndianWriter writer(reinterpret_cast<char*>(output.data()), + output.size()); + for (auto& unit : slice_units) { + bool written_ok = + writer.WriteU32(unit.size) && writer.WriteBytes(unit.data, unit.size); + if (!written_ok) { + return MP4Status::Codes::kBufferTooSmall; + } + } + + DCHECK_LE(writer.remaining(), output.size()); + size_t bytes_written = output.size() - writer.remaining(); + DCHECK_EQ(bytes_written, data_size); + + // Now when we are sure that everything is written and fits nicely, + // we can update parts of the |config_| that were changed by this data chunk. + if (config_changed) { + if (new_active_sps_id < 0) + new_active_sps_id = active_sps_id_; + if (new_active_pps_id < 0) + new_active_pps_id = active_pps_id_; + if (new_active_vps_id < 0) + new_active_vps_id = active_vps_id_; + + const H265SPS* active_sps = parser_.GetSPS(new_active_sps_id); + if (!active_sps) { + return MP4Status::Codes::kFailedToLookupSPS; + } + + const H265PPS* active_pps = parser_.GetPPS(new_active_pps_id); + if (!active_pps) { + return MP4Status::Codes::kFailedToLookupPPS; + } + + active_pps_id_ = new_active_pps_id; + active_sps_id_ = new_active_sps_id; + active_vps_id_ = new_active_vps_id; + + // General profile space and tier level is not provided by the parser and it + // must always be 0. + config_.general_profile_space = 0; + config_.general_tier_flag = 0; + + auto ptl = active_sps->profile_tier_level; + config_.general_profile_idc = ptl.general_profile_idc; + config_.general_profile_compatibility_flags = + ptl.general_profile_compatibility_flags; + config_.general_level_idc = ptl.general_level_idc; + + if (ptl.general_progressive_source_flag) { + config_.general_constraint_indicator_flags |= 1ull << 47; + } + if (ptl.general_interlaced_source_flag) { + config_.general_constraint_indicator_flags |= 1ull << 46; + } + if (ptl.general_non_packed_constraint_flag) { + config_.general_constraint_indicator_flags |= 1ull << 45; + } + if (ptl.general_frame_only_constraint_flag) { + config_.general_constraint_indicator_flags |= 1ull << 44; + } + if (ptl.general_one_picture_only_constraint_flag) { + config_.general_constraint_indicator_flags |= 1ull << 35; + } + + config_.min_spatial_segmentation_idc = + active_sps->vui_parameters.min_spatial_segmentation_idc; + if (active_sps->vui_parameters.min_spatial_segmentation_idc == 0) { + config_.parallelismType = + mp4::HEVCDecoderConfigurationRecord::kMixedParallel; + } else if (active_pps->entropy_coding_sync_enabled_flag && + active_pps->tiles_enabled_flag) { + config_.parallelismType = + mp4::HEVCDecoderConfigurationRecord::kMixedParallel; + } else if (active_pps->entropy_coding_sync_enabled_flag) { + config_.parallelismType = + mp4::HEVCDecoderConfigurationRecord::kWaveFrontParallel; + } else if (active_pps->tiles_enabled_flag) { + config_.parallelismType = + mp4::HEVCDecoderConfigurationRecord::kTileParallel; + } else { + config_.parallelismType = + mp4::HEVCDecoderConfigurationRecord::kSliceParallel; + } + config_.chromaFormat = active_sps->chroma_format_idc; + config_.bitDepthLumaMinus8 = active_sps->bit_depth_luma_minus8; + config_.bitDepthChromaMinus8 = active_sps->bit_depth_chroma_minus8; + // Gives the average frame rate in units of frames per 256 seconds. + // A value of 0 indicates an unspecified average frame rate. + config_.avgFrameRate = 0; + // Set to 0 to indicate it may or may not be of constant frame rate. + config_.constantFrameRate = 0; + config_.numTemporalLayers = active_sps->sps_max_sub_layers_minus1 + 1; + config_.temporalIdNested = active_sps->sps_temporal_id_nesting_flag; + + // We write 3 arrays, in the order of VPS array, SPS array and PPS array. + auto hvcc_array_idx = 0; + mp4::HEVCDecoderConfigurationRecord::HVCCNALUnit nal_unit; + mp4::HEVCDecoderConfigurationRecord::HVCCNALArray nalu_array; + // bit 7: array_completeness. When set to 1, corresponding type of + // NAL unit will be in the array only and none are in the stream; otherwise + // they may additionally be in the stream. + uint8_t first_byte = (1 << 7) | (H265NALU::VPS_NUT & 0x3F); + if (id2vps_.size() > 0) { + nalu_array.first_byte = first_byte; + for (auto& vps : id2vps_) { + nal_unit.assign(vps.second.begin(), vps.second.end()); + nalu_array.units.push_back(nal_unit); + } + config_.arrays.push_back(nalu_array); + hvcc_array_idx++; + } + + first_byte = (1 << 7) | (H265NALU::SPS_NUT & 0x3F); + nalu_array.units.clear(); + if (id2sps_.size() > 0) { + nalu_array.first_byte = first_byte; + for (auto& sps : id2sps_) { + nal_unit.assign(sps.second.begin(), sps.second.end()); + nalu_array.units.push_back(nal_unit); + } + config_.arrays.push_back(nalu_array); + hvcc_array_idx++; + } + + first_byte = (1 << 7) | (H265NALU::PPS_NUT & 0x3F); + nalu_array.units.clear(); + if (id2sps_.size() > 0) { + nalu_array.first_byte = first_byte; + for (auto& pps : id2pps_) { + nal_unit.assign(pps.second.begin(), pps.second.end()); + nalu_array.units.push_back(nal_unit); + } + config_.arrays.push_back(nalu_array); + hvcc_array_idx++; + } + + config_.numOfArrays = hvcc_array_idx; + } + + if (config_changed_out) { + *config_changed_out = config_changed; + } + + return OkStatus(); +} + +} // namespace media
diff --git a/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.h b/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.h new file mode 100644 index 0000000..dce8a46 --- /dev/null +++ b/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.h
@@ -0,0 +1,75 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_FORMATS_MP4_H265_ANNEX_B_TO_HEVC_BITSTREAM_CONVERTER_H_ +#define MEDIA_FORMATS_MP4_H265_ANNEX_B_TO_HEVC_BITSTREAM_CONVERTER_H_ + +#include <stdint.h> + +#include <vector> + +#include "base/containers/flat_map.h" +#include "base/containers/span.h" +#include "media/base/media_export.h" +#include "media/formats/mp4/box_definitions.h" +#include "media/formats/mp4/hevc.h" +#include "media/formats/mp4/mp4_status.h" +#include "media/video/h265_nalu_parser.h" +#include "media/video/h265_parser.h" + +namespace media { + +// H265AnnexBToHevcBitstreamConverter is a class to convert H.265 bitstream from +// Annex B (ISO/IEC 14496-10) to HEVC (as specified in ISO/IEC 14496-15). +class MEDIA_EXPORT H265AnnexBToHevcBitstreamConverter { + public: + H265AnnexBToHevcBitstreamConverter(); + + H265AnnexBToHevcBitstreamConverter( + const H265AnnexBToHevcBitstreamConverter&) = delete; + H265AnnexBToHevcBitstreamConverter& operator=( + const H265AnnexBToHevcBitstreamConverter&) = delete; + + ~H265AnnexBToHevcBitstreamConverter(); + + // Converts a video chunk from a format with in-place decoder configuration + // into a format where configuration needs to be sent separately. + // + // |input| - where to read the data from + // |output| - where to put the converted video data + // If error kBufferTooSmall is returned, it means that |output| was not + // big enough to contain a converted video chunk. In this case |size_out| + // is populated. + // |config_changed_out| is set to True if the video chunk + // processed by this call contained decoder configuration information. + // In this case latest configuration information can be obtained + // from GetCurrentConfig(). + // |size_out| - number of bytes written to |output|, or desired size of + // |output| if it's too small. + MP4Status ConvertChunk(base::span<const uint8_t> input, + base::span<uint8_t> output, + bool* config_changed_out, + size_t* size_out); + + // Returns the latest version of decoder configuration, found in converted + // video chunks. + const mp4::HEVCDecoderConfigurationRecord& GetCurrentConfig(); + + private: + H265Parser parser_; + mp4::HEVCDecoderConfigurationRecord config_; + + using blob = std::vector<uint8_t>; + base::flat_map<int, blob> id2sps_; + base::flat_map<int, blob> id2pps_; + base::flat_map<int, blob> id2vps_; + + int active_sps_id_ = -1; + int active_pps_id_ = -1; + int active_vps_id_ = -1; +}; + +} // namespace media + +#endif // MEDIA_FORMATS_MP4_H265_ANNEX_B_TO_HEVC_BITSTREAM_CONVERTER_H_
diff --git a/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter_unittest.cc b/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter_unittest.cc new file mode 100644 index 0000000..867f85d --- /dev/null +++ b/media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter_unittest.cc
@@ -0,0 +1,192 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.h" + +#include <stdint.h> + +#include <memory> + +#include "base/files/file.h" +#include "base/path_service.h" +#include "media/formats/mp4/box_definitions.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +std::vector<uint8_t> ReadTestFile(std::string name) { + base::FilePath path; + base::PathService::Get(base::DIR_SOURCE_ROOT, &path); + path = path.Append(FILE_PATH_LITERAL( + "media/formats/mp4/h265_annex_b_fuzz_corpus")) + .AppendASCII(name); + base::File f(path, base::File::FLAG_OPEN | base::File::FLAG_READ); + DCHECK(f.IsValid()) << "path: " << path.AsUTF8Unsafe(); + auto size = f.GetLength(); + + std::vector<uint8_t> result(size); + if (size > 0) + f.ReadAtCurrentPosAndCheck(result); + return result; +} + +} // namespace + +namespace media { + +TEST(H265AnnexBToHevcBitstreamConverterTest, Success) { + std::string chunks[] = {"chunk1-config-idr.bin", "chunk2-non-idr.bin", + "chunk3-non-idr.bin", "chunk4-non-idr.bin", + "chunk5-non-idr.bin", "chunk6-config-idr.bin", + "chunk7-non-idr.bin"}; + H265AnnexBToHevcBitstreamConverter converter; + + for (std::string& name : chunks) { + SCOPED_TRACE(name); + auto input = ReadTestFile(name); + SCOPED_TRACE(input.size()); + std::vector<uint8_t> output; + size_t desired_size = 0; + bool config_changed = false; + + auto status = + converter.ConvertChunk(input, output, &config_changed, &desired_size); + ASSERT_EQ(status.code(), MP4Status::Codes::kBufferTooSmall); + output.resize(desired_size); + + status = converter.ConvertChunk(input, output, &config_changed, nullptr); + EXPECT_TRUE(status.is_ok()) << status.message(); + + auto& config = converter.GetCurrentConfig(); + if (name.find("config") != std::string::npos) { + // Chunks with configuration + EXPECT_TRUE(config_changed); + + EXPECT_EQ(config.configurationVersion, 1); + EXPECT_EQ(config.general_profile_space, 0); + EXPECT_EQ(config.general_tier_flag, 0); + EXPECT_EQ(config.general_profile_idc, 1); + EXPECT_EQ(config.general_profile_compatibility_flags, 0x60000000ul); + EXPECT_EQ(config.general_constraint_indicator_flags, 0x800000000000ull); + EXPECT_EQ(config.general_level_idc, 60); + EXPECT_EQ(config.min_spatial_segmentation_idc, 0); + EXPECT_EQ(config.parallelismType, 0); + EXPECT_EQ(config.chromaFormat, 1); + EXPECT_EQ(config.bitDepthLumaMinus8, 0); + EXPECT_EQ(config.bitDepthChromaMinus8, 0); + EXPECT_EQ(config.avgFrameRate, 0); + EXPECT_EQ(config.numOfArrays, 3); + EXPECT_EQ((config.arrays[0].first_byte & 0x3f), 32); + EXPECT_EQ(config.arrays[0].units.size(), 1ul); + EXPECT_EQ((config.arrays[1].first_byte & 0x3f), 33); + EXPECT_EQ(config.arrays[1].units.size(), 1ul); + EXPECT_EQ((config.arrays[2].first_byte & 0x3f), 34); + EXPECT_EQ(config.arrays[2].units.size(), 1ul); + } else { + EXPECT_FALSE(config_changed); + } + + std::vector<uint8_t> config_bin; + EXPECT_TRUE(config.Serialize(config_bin)) << " file: " << name; + } +} + +// Tests that stream can contain multiple picture parameter sets and switch +// between them without having to reconfigure the decoder. +TEST(H265AnnexBToHevcBitstreamConverterTest, PPS_SwitchWithoutReconfig) { + std::vector<uint8_t> vps{0x00, 0x00, 0x00, 0x01, 0x40, 0x01, 0x0c, + 0x01, 0xff, 0xff, 0x22, 0x20, 0x00, 0x00, + 0x03, 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x03, 0x00, 0x99, 0x2c, 0x09}; + std::vector<uint8_t> sps{ + 0x00, 0x00, 0x00, 0x01, 0x42, 0x01, 0x01, 0x22, 0x20, 0x00, 0x00, 0x03, + 0x00, 0x90, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, 0x99, 0xa0, 0x01, + 0xe0, 0x20, 0x02, 0x1c, 0x4d, 0x94, 0xbb, 0xb4, 0xa3, 0x32, 0xaa, 0xc0, + 0x5a, 0x84, 0x89, 0x04, 0x8a, 0x00, 0x00, 0x07, 0xd0, 0x00, 0x01, 0x86, + 0xa0, 0xe4, 0x68, 0x7c, 0x95, 0x00, 0x00, 0x89, 0x54, 0x00, 0x00, 0xf7, + 0x31, 0x00, 0x00, 0x44, 0xaa, 0x00, 0x00, 0x7b, 0x98, 0x88}; + std::vector<uint8_t> pps1{ + 0x00, 0x00, 0x00, 0x01, 0x44, 0x01, 0xc0, 0x72, 0xb0, 0x3b, 0xc4, 0x0c, + 0x88, 0xc6, 0x70, 0x86, 0x18, 0x82, 0x08, 0x80, 0xc4, 0x10, 0x60, 0xa3, + 0x81, 0x23, 0x02, 0x06, 0x4c, 0x7f, 0xff, 0xf2, 0x88, 0x11, 0x26, 0x4e, + 0x4f, 0x27, 0xc4, 0x7e, 0x23, 0xf8, 0x8f, 0xc6, 0x7c, 0x67, 0x84, 0x38, + 0x43, 0xf1, 0x03, 0x23, 0x30, 0x87, 0x08, 0x78, 0x43, 0xe1, 0x8f, 0xc1, + 0x07, 0xf0, 0x51, 0xf8, 0x10, 0x3f, 0xff, 0xfc, 0xa3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x28, 0x82, 0x12, 0x4c, 0x9c, 0x9e, 0x4f, 0x88, 0xfc, 0x47, + 0xf1, 0x1f, 0x8c, 0xf8, 0xcf, 0x08, 0x70, 0x87, 0xd6, 0x3f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x55, 0x20}; + std::vector<uint8_t> pps2{ + 0x00, 0x00, 0x00, 0x01, 0x44, 0x01, 0x50, 0x1c, 0xac, 0x0e, 0xf1, 0x03, + 0x22, 0x31, 0x9c, 0x21, 0x86, 0x20, 0x82, 0x20, 0x31, 0x04, 0x18, 0x28, + 0xe0, 0x48, 0xc0, 0x81, 0x93, 0x0a, 0x07, 0x20, 0x93, 0x07, 0x9c, 0x0c, + 0x1f, 0x28, 0x81, 0x12, 0x64, 0xe4, 0xf2, 0x7c, 0x47, 0xe2, 0x3f, 0x88, + 0xfc, 0x67, 0xc6, 0x78, 0x43, 0x84, 0x3f, 0x10, 0x32, 0x33, 0x08, 0x70, + 0x87, 0x84, 0x3e, 0x18, 0xfc, 0x10, 0x7f, 0x05, 0x1f, 0x81, 0x03, 0xff, + 0xff, 0xca, 0x14, 0x11, 0x26, 0x4e, 0x4f, 0x11, 0xf1, 0x1f, 0x88, 0xfe, + 0x33, 0xf0, 0x87, 0xc2, 0x9f, 0xff, 0xc2, 0x81, 0x08, 0x43, 0x0a, 0x70, + 0xc7, 0x85, 0x04, 0x78, 0x20, 0xfc, 0x10, 0x7f, 0x06, 0x9f, 0xff, 0xff, + 0xfc, 0xa2, 0x08, 0x49, 0x32, 0x72, 0x79, 0x3e, 0x23, 0xf1, 0x1f, 0xc4, + 0x7e, 0x33, 0xe3, 0x3c, 0x21, 0xc2, 0x1f, 0x58, 0x50, 0x41, 0x22, 0x31, + 0x1c, 0x67, 0x8c, 0xf8, 0xcf, 0xc6, 0x7f, 0x08, 0x7f, 0xff, 0xff, 0xf5, + 0x54, 0x80}; + std::vector<uint8_t> first_frame_idr{ + 0x00, 0x00, 0x00, 0x01, 0x28, 0x01, 0xac, 0x6d, 0xa0, + 0x7c, 0x96, 0x84, 0xdb, 0xcc, 0xf7, 0x4f, 0x9d, 0xf4, + 0x94, 0x85, 0x37, 0x06, 0x66, 0xf8 + // Encoded data omitted here, it's not important for NALU parsing + }; + + std::vector<uint8_t> first_chunk; + first_chunk.insert(first_chunk.end(), vps.begin(), vps.end()); + first_chunk.insert(first_chunk.end(), sps.begin(), sps.end()); + first_chunk.insert(first_chunk.end(), pps1.begin(), pps1.end()); + first_chunk.insert(first_chunk.end(), pps2.begin(), pps2.end()); + first_chunk.insert(first_chunk.end(), first_frame_idr.begin(), + first_frame_idr.end()); + + std::vector<uint8_t> second_non_idr_chunk{ + 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xa4, 0x04, 0x55, 0xa2, 0x6d, 0xc3, + 0xc0, 0xc3, 0x3d, 0x0b, 0xac, 0xbc, 0x00, 0xc4, 0x44, 0x2e, 0xf7, 0x55, + 0xfd, 0x05, 0x86, 0x92, 0x19, 0xdf, 0x58, 0xec, 0x38, 0x36, 0xb7, 0x7c, + 0x00, 0x15, 0x33, 0x78, 0x03, 0x67, 0x26, 0x0f + // Encoded data omitted here, it's not important for NALU parsing + }; + + H265AnnexBToHevcBitstreamConverter converter; + std::vector<uint8_t> output(10000); + bool config_changed = false; + + auto status = + converter.ConvertChunk(first_chunk, output, &config_changed, nullptr); + EXPECT_TRUE(status.is_ok()) << status.message(); + EXPECT_TRUE(config_changed); + + auto& config = converter.GetCurrentConfig(); + EXPECT_EQ(config.numOfArrays, 3); + EXPECT_EQ((config.arrays[0].first_byte & 0x3f), 32); + EXPECT_EQ(config.arrays[0].units.size(), 1ul); + EXPECT_EQ((config.arrays[1].first_byte & 0x3f), 33); + EXPECT_EQ(config.arrays[1].units.size(), 1ul); + EXPECT_EQ((config.arrays[2].first_byte & 0x3f), 34); + EXPECT_EQ(config.arrays[2].units.size(), 2ul); + status = converter.ConvertChunk(second_non_idr_chunk, output, &config_changed, + nullptr); + EXPECT_TRUE(status.is_ok()) << status.message(); + EXPECT_FALSE(config_changed); +} + +TEST(H265AnnexBToHevcBitstreamConverterTest, Failure) { + H265AnnexBToHevcBitstreamConverter converter; + + std::vector<uint8_t> input{0x0, 0x0, 0x0, 0x1, 0x40, 0x01, + 0x0c, 0x0, 0x0, 0x1, 0x67, 0x42}; + std::vector<uint8_t> output(input.size()); + + auto status = converter.ConvertChunk(input, output, nullptr, nullptr); + + ASSERT_EQ(status.code(), MP4Status::Codes::kInvalidVPS); +} + +} // namespace media
diff --git a/media/formats/mp4/hevc.cc b/media/formats/mp4/hevc.cc index 20cd87c..be6f4aa 100644 --- a/media/formats/mp4/hevc.cc +++ b/media/formats/mp4/hevc.cc
@@ -9,6 +9,7 @@ #include <utility> #include <vector> +#include "base/big_endian.h" #include "base/logging.h" #include "media/base/decrypt_config.h" #include "media/base/media_util.h" @@ -56,6 +57,92 @@ return ParseInternal(reader, reader->media_log()); } +bool HEVCDecoderConfigurationRecord::Serialize( + std::vector<uint8_t>& output) const { + // See ISO/IEC 14496-15, section 8.3.3.1 for the format description. + if (lengthSizeMinusOne > 3) { + return false; + } + + // Calculating total size needed for the serialization buffer + size_t expected_size = 1 + // configurationVersion + 1 + // profile_indication: + // general_profile_space(2)/general_tier_flag(1) + // /general_profile_idc(5) + 4 + // general_profile_compatibility_flags + 6 + // general_constraint_indicator_flags + 1 + // general_level_idc + 2 + // reserved1s(4)/min_spatial_segmentation_idc(12) + 1 + // reserved1s(6)/parallelismType(2) + 1 + // reserved1s(6)/chromaFormat(2) + 1 + // reserved1s(5)bitDepthLumaMinus8(3) + 1 + // reserved1s(5)/bitDepthChromaMinus8(3) + 2 + // avgFrameRate + 1 + // constantFrameRate(2)/numTemporalLayers(3) + // /temporalIdNested(1)/lengthSizeMinusOne(2) + 1; // numOfArrays + + // Adds up size required for the arrays + for (auto& array : arrays) { + expected_size += 1 + // array_completeness(1)/reserved0(1)/NAL_unit_type + 2; // numNalus + for (auto& nalu : array.units) { + expected_size += 2 + // nalUnitLength + nalu.size(); + } + } + + bool result = true; + output.clear(); + output.resize(expected_size); + base::BigEndianWriter writer(reinterpret_cast<char*>(output.data()), + output.size()); + + // configurationVersion + result &= writer.WriteU8(configurationVersion); + // profile_indication + result &= writer.WriteU8((general_profile_space << 6) + + (general_tier_flag << 5) + general_profile_idc); + // general_profile_compatibility_flag + result &= writer.WriteU32(general_profile_compatibility_flags); + // general_constraint_indicator_flags + result &= writer.WriteU32(general_constraint_indicator_flags >> 16); + result &= writer.WriteU16(general_constraint_indicator_flags & 0xffff); + // genral_level_idc + result &= writer.WriteU8(general_level_idc); + // min_spatial_segmentation_idc + result &= writer.WriteU16(min_spatial_segmentation_idc | (0xf << 12)); + // parallelismType + result &= writer.WriteU8(parallelismType | (0x3f << 2)); + // chromaFormat + result &= writer.WriteU8(chromaFormat | (0x3f << 2)); + // bitDepthLumaMinus8 + result &= writer.WriteU8(bitDepthLumaMinus8 | (0x1f << 3)); + // bitDepthChromaMinus8 + result &= writer.WriteU8(bitDepthChromaMinus8 | (0x1f << 3)); + // avgFrameRate + result &= writer.WriteU16(avgFrameRate); + // miscs + result &= writer.WriteU8((constantFrameRate << 6) + (numTemporalLayers << 3) + + (temporalIdNested << 2) + lengthSizeMinusOne); + // numOfArrays + result &= writer.WriteU8(numOfArrays); + for (auto& array : arrays) { + // array_completeness and nalu type, etc. + result &= writer.WriteU8(array.first_byte); + // num_nalus + result &= writer.WriteU16(array.units.size()); + for (auto& nalu : array.units) { + // nalUnitLength + result &= writer.WriteU16(nalu.size()); + // NAL unit data + result &= writer.WriteBytes(nalu.data(), nalu.size()); + } + } + + return result; +} + bool HEVCDecoderConfigurationRecord::Parse(const uint8_t* data, int data_size) { BufferReader reader(data, data_size); // TODO(wolenetz): Questionable MediaLog usage, http://crbug.com/712310 @@ -63,8 +150,7 @@ return ParseInternal(&reader, &media_log); } -HEVCDecoderConfigurationRecord::HVCCNALArray::HVCCNALArray() - : first_byte(0) {} +HEVCDecoderConfigurationRecord::HVCCNALArray::HVCCNALArray() = default; HEVCDecoderConfigurationRecord::HVCCNALArray::HVCCNALArray( const HVCCNALArray& other) = default;
diff --git a/media/formats/mp4/hevc.h b/media/formats/mp4/hevc.h index a09e02f..f286f89d 100644 --- a/media/formats/mp4/hevc.h +++ b/media/formats/mp4/hevc.h
@@ -26,12 +26,21 @@ struct MEDIA_EXPORT HEVCDecoderConfigurationRecord : Box { DECLARE_BOX_METHODS(HEVCDecoderConfigurationRecord); + // Parallel processing tools used by decoder. + enum { + kMixedParallel = 0, // mixed mode of slice-based/tile-based/wavefront + kSliceParallel, // slices can be decoded independently + kTileParallel, // tiles can be decoded independently + kWaveFrontParallel, // first row of CTUs decoded normally and rest + // parallelized + }; // Parses HEVCDecoderConfigurationRecord data encoded in |data|. // Note: This method is intended to parse data outside the MP4StreamParser // context and therefore the box header is not expected to be present // in |data|. // Returns true if |data| was successfully parsed. bool Parse(const uint8_t* data, int data_size); + bool Serialize(std::vector<uint8_t>& output) const; uint8_t configurationVersion; uint8_t general_profile_space; @@ -57,7 +66,8 @@ HVCCNALArray(); HVCCNALArray(const HVCCNALArray& other); ~HVCCNALArray(); - uint8_t first_byte; + uint8_t first_byte = + 0; // array_completeness(1)/reserved0(1)/NAL_unit_type(6) std::vector<HVCCNALUnit> units; }; std::vector<HVCCNALArray> arrays;
diff --git a/media/formats/mp4/hevc_unittest.cc b/media/formats/mp4/hevc_unittest.cc index 995cbe9..6e82702 100644 --- a/media/formats/mp4/hevc_unittest.cc +++ b/media/formats/mp4/hevc_unittest.cc
@@ -77,5 +77,23 @@ } } +TEST(HEVCAnalyzeAnnexBTest, HEVCDecoderConfigurationRecordTakenFromStream) { + std::vector<uint8_t> test_data{ + 0x01, 0x01, 0x60, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0xf0, 0x00, 0xfc, 0xfd, 0xf8, 0xf8, 0x00, 0x00, 0x0f, 0x03, 0x20, + 0x00, 0x01, 0x00, 0x18, 0x40, 0x01, 0x0c, 0x01, 0xff, 0xff, 0x01, 0x60, + 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x00, + 0x3c, 0x95, 0xc0, 0x90, 0x21, 0x00, 0x01, 0x00, 0x27, 0x42, 0x01, 0x01, + 0x01, 0x60, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x00, + 0x03, 0x00, 0x3c, 0xa0, 0x0a, 0x08, 0x0b, 0x9f, 0x79, 0x65, 0x79, 0x24, + 0xca, 0xe0, 0x10, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0xbb, 0x50, 0x80, + 0x22, 0x00, 0x01, 0x00, 0x06, 0x44, 0x01, 0xc1, 0x73, 0xd1, 0x89}; + HEVCDecoderConfigurationRecord record; + EXPECT_TRUE(record.Parse(test_data.data(), test_data.size())); + std::vector<uint8_t> output; + EXPECT_TRUE(record.Serialize(output)); + EXPECT_TRUE(test_data == output); +} + } // namespace mp4 } // namespace media
diff --git a/media/formats/mp4/mp4_status.h b/media/formats/mp4/mp4_status.h index 8238b46..3d9a8e4 100644 --- a/media/formats/mp4/mp4_status.h +++ b/media/formats/mp4/mp4_status.h
@@ -25,6 +25,10 @@ kInvalidSliceHeader = 7, kBufferTooSmall = 8, + + // H265 specific + kInvalidVPS = 9, + kFailedToLookupVPS = 10, }; static constexpr StatusGroupType Group() { return "MP4Status"; } static constexpr Codes DefaultEnumValue() { return Codes::kOk; }
diff --git a/media/gpu/gpu_video_encode_accelerator_factory.cc b/media/gpu/gpu_video_encode_accelerator_factory.cc index 03dd1e8..430f26f8 100644 --- a/media/gpu/gpu_video_encode_accelerator_factory.cc +++ b/media/gpu/gpu_video_encode_accelerator_factory.cc
@@ -235,11 +235,6 @@ }); } - base::EraseIf(profiles, [](const auto& vea_profile) { - return vea_profile.profile >= HEVCPROFILE_MIN && - vea_profile.profile <= HEVCPROFILE_MAX; - }); - return profiles; }
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc index fab1ff9..018b3d87 100644 --- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc +++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
@@ -115,6 +115,16 @@ } } +// Only eAVEncH265Vprofile_Main_420_8 is supported. +eAVEncH265VProfile GetHEVCProfile(VideoCodecProfile profile) { + switch (profile) { + case HEVCPROFILE_MAIN: + return eAVEncH265VProfile_Main_420_8; + default: + return eAVEncH265VProfile_unknown; + } +} + bool IsSvcSupported(IMFActivate* activate) { #if defined(ARCH_CPU_X86) // x86 systems sometimes crash in video drivers here. @@ -203,7 +213,11 @@ } if (codec != VideoCodec::kH264 && codec != VideoCodec::kVP9 && - codec != VideoCodec::kAV1) { + codec != VideoCodec::kAV1 +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) + && codec != VideoCodec::kHEVC +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) + ) { DVLOG(ERROR) << "Enumerating unsupported hardware encoders."; return 0; } @@ -346,7 +360,8 @@ SupportedProfiles profiles; - for (auto codec : {VideoCodec::kH264, VideoCodec::kVP9, VideoCodec::kAV1}) { + for (auto codec : {VideoCodec::kH264, VideoCodec::kVP9, VideoCodec::kAV1, + VideoCodec::kHEVC}) { auto codec_profiles = GetSupportedProfilesForCodec(codec); profiles.insert(profiles.end(), codec_profiles.begin(), codec_profiles.end()); @@ -360,10 +375,19 @@ MediaFoundationVideoEncodeAccelerator::GetSupportedProfilesForCodec( VideoCodec codec) { SupportedProfiles profiles; - if ((codec == VideoCodec::kVP9 && - !base::FeatureList::IsEnabled(kMediaFoundationVP9Encoding)) || - (codec == VideoCodec::kAV1 && - !base::FeatureList::IsEnabled(kMediaFoundationAV1Encoding))) { + + if (codec == VideoCodec::kHEVC) { +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) + if (!base::FeatureList::IsEnabled(kMediaFoundationHEVCEncoding)) { + return profiles; + } +#else + return profiles; +#endif // BULIDFLAG(ENABLE_PLATFORM_HEVC) + } else if ((codec == VideoCodec::kVP9 && + !base::FeatureList::IsEnabled(kMediaFoundationVP9Encoding)) || + (codec == VideoCodec::kAV1 && + !base::FeatureList::IsEnabled(kMediaFoundationAV1Encoding))) { return profiles; } @@ -421,6 +445,9 @@ } else if (codec == VideoCodec::kAV1) { profile.profile = AV1PROFILE_PROFILE_MAIN; profiles.push_back(profile); + } else if (codec == VideoCodec::kHEVC) { + profile.profile = HEVCPROFILE_MAIN; + profiles.push_back(profile); } return profiles; } @@ -459,6 +486,8 @@ codec_ = VideoCodec::kVP9; } else if (config.output_profile == AV1PROFILE_PROFILE_MAIN) { codec_ = VideoCodec::kAV1; + } else if (config.output_profile == HEVCPROFILE_MAIN) { + codec_ = VideoCodec::kHEVC; } if (codec_ == VideoCodec::kUnknown) { @@ -838,6 +867,9 @@ } else if (codec_ == VideoCodec::kVP9) { hr = imf_output_media_type_->SetUINT32(MF_MT_MPEG2_PROFILE, GetVP9VProfile(output_profile)); + } else if (codec_ == VideoCodec::kHEVC) { + hr = imf_output_media_type_->SetUINT32(MF_MT_MPEG2_PROFILE, + GetHEVCProfile(output_profile)); } RETURN_ON_HR_FAILURE(hr, "Couldn't set codec profile", false); hr = encoder_->SetOutputType(output_stream_id_, imf_output_media_type_.Get(), @@ -893,11 +925,12 @@ RETURN_ON_HR_FAILURE(hr, "Couldn't set CommonRateControlMode", false); } - // Intel drivers want the layer count to be set explicitly for H.264, even if - // it's one. + // Intel drivers want the layer count to be set explicitly for H.264/HEVC, + // even if it's one. const bool set_svc_layer_count = (num_temporal_layers_ > 1) || - (vendor_ == DriverVendor::kIntel && codec_ == VideoCodec::kH264); + (vendor_ == DriverVendor::kIntel && + (codec_ == VideoCodec::kH264 || codec_ == VideoCodec::kHEVC)); if (set_svc_layer_count) { var.ulVal = num_temporal_layers_; hr = codec_api_->SetValue(&CODECAPI_AVEncVideoTemporalLayerCount, &var); @@ -1236,11 +1269,11 @@ bool keyframe) { *temporal_id = 0; - // H264, VP9 and AV1 have hardware SVC support on windows. H264 can parse the - // information from Nalu(7.3.1 NAL unit syntax); AV1 can parse the OBU(5.3.3. - // OBU extension header syntax), it's future work. Unfortunately, VP9 spec - // doesn't provide the temporal information, we can only assign it based on - // spec. + // H264, HEVC, VP9 and AV1 have hardware SVC support on windows. H264 can + // parse the information from Nalu(7.3.1 NAL unit syntax); AV1 can parse the + // OBU(5.3.3. OBU extension header syntax), it's future work. Unfortunately, + // VP9 spec doesn't provide the temporal information, we can only assign it + // based on spec. if (codec_ == VideoCodec::kH264) { // See the 7.3.1 NAL unit syntax in H264 spec. // https://www.itu.int/rec/T-REC-H.264
diff --git a/media/video/h265_parser.cc b/media/video/h265_parser.cc index 23f62e7..db9fc1b1c 100644 --- a/media/video/h265_parser.cc +++ b/media/video/h265_parser.cc
@@ -431,7 +431,7 @@ IN_RANGE_OR_RETURN(sps->sps_video_parameter_set_id, 0, 15); READ_BITS_OR_RETURN(3, &sps->sps_max_sub_layers_minus1); IN_RANGE_OR_RETURN(sps->sps_max_sub_layers_minus1, 0, 6); - SKIP_BITS_OR_RETURN(1); // sps_temporal_id_nesting_flag + READ_BOOL_OR_RETURN(&sps->sps_temporal_id_nesting_flag); res = ParseProfileTierLevel(true, sps->sps_max_sub_layers_minus1, &sps->profile_tier_level); @@ -919,6 +919,28 @@ return it->second.get(); } +H265Parser::Result H265Parser::ParseSliceHeaderForPictureParameterSets( + const H265NALU& nalu, + int* pps_id) { + // 7.4.7 Slice segment header + DVLOG(4) << "Parsing slice header for pps"; + + H265SliceHeader shdr; + READ_BOOL_OR_RETURN(&shdr.first_slice_segment_in_pic_flag); + shdr.irap_pic = (nalu.nal_unit_type >= H265NALU::BLA_W_LP && + nalu.nal_unit_type <= H265NALU::RSV_IRAP_VCL23); + if (shdr.irap_pic) { + READ_BOOL_OR_RETURN(&shdr.no_output_of_prior_pics_flag); + } + READ_UE_OR_RETURN(&shdr.slice_pic_parameter_set_id); + IN_RANGE_OR_RETURN(shdr.slice_pic_parameter_set_id, 0, 63); + if (pps_id) { + *pps_id = shdr.slice_pic_parameter_set_id; + } + + return kOk; +} + H265Parser::Result H265Parser::ParseSliceHeader(const H265NALU& nalu, H265SliceHeader* shdr, H265SliceHeader* prior_shdr) { @@ -1307,21 +1329,28 @@ SKIP_BITS_OR_RETURN(1); // general_tier_flag READ_BITS_OR_RETURN(5, &profile_tier_level->general_profile_idc); IN_RANGE_OR_RETURN(profile_tier_level->general_profile_idc, 0, 11); - bool general_profile_compatibility_flag[32]; - for (int j = 0; j < 32; ++j) { - READ_BOOL_OR_RETURN(&general_profile_compatibility_flag[j]); - } - bool general_progressive_source_flag; - bool general_interlaced_source_flag; - READ_BOOL_OR_RETURN(&general_progressive_source_flag); - READ_BOOL_OR_RETURN(&general_interlaced_source_flag); - if (!general_progressive_source_flag && general_interlaced_source_flag) { + uint16_t general_profile_compatibility_flag_high16; + uint16_t general_profile_compatibility_flag_low16; + READ_BITS_OR_RETURN(16, &general_profile_compatibility_flag_high16); + READ_BITS_OR_RETURN(16, &general_profile_compatibility_flag_low16); + profile_tier_level->general_profile_compatibility_flags = + (general_profile_compatibility_flag_high16 << 16) + + general_profile_compatibility_flag_low16; + READ_BOOL_OR_RETURN(&profile_tier_level->general_progressive_source_flag); + READ_BOOL_OR_RETURN(&profile_tier_level->general_interlaced_source_flag); + if (!profile_tier_level->general_progressive_source_flag && + profile_tier_level->general_interlaced_source_flag) { DVLOG(1) << "Interlaced streams not supported"; return kUnsupportedStream; } - SKIP_BITS_OR_RETURN(2); // general_{non_packed,frame_only}_constraint_flag - // Skip the compatibility flags, they are always 43 bits. - SKIP_BITS_OR_RETURN(43); + READ_BOOL_OR_RETURN( + &profile_tier_level->general_non_packed_constraint_flag); + READ_BOOL_OR_RETURN( + &profile_tier_level->general_frame_only_constraint_flag); + SKIP_BITS_OR_RETURN(7); // general_reserved_zero_7bits + READ_BOOL_OR_RETURN( + &profile_tier_level->general_one_picture_only_constraint_flag); + SKIP_BITS_OR_RETURN(35); // general_reserved_zero_35bits SKIP_BITS_OR_RETURN(1); // general_inbld_flag } READ_BITS_OR_RETURN(8, &profile_tier_level->general_level_idc); @@ -1668,17 +1697,16 @@ return res; } - bool bitstream_restriction_flag; - READ_BOOL_OR_RETURN(&bitstream_restriction_flag); - if (bitstream_restriction_flag) { + READ_BOOL_OR_RETURN(&vui->bitstream_restriction_flag); + if (vui->bitstream_restriction_flag) { // Skip tiles_fixed_structure_flag, motion_vectors_over_pic_boundaries_flag // and restricted_ref_pic_lists_flag. SKIP_BITS_OR_RETURN(3); - READ_UE_OR_RETURN(&data); // min_spatial_segmentation_idc - READ_UE_OR_RETURN(&data); // max_bytes_per_pic_denom - READ_UE_OR_RETURN(&data); // max_bits_per_min_cu_denom - READ_UE_OR_RETURN(&data); // log2_max_mv_length_horizontal - READ_UE_OR_RETURN(&data); // log2_max_mv_length_vertical + READ_UE_OR_RETURN(&vui->min_spatial_segmentation_idc); + READ_UE_OR_RETURN(&vui->max_bytes_per_pic_denom); + READ_UE_OR_RETURN(&vui->max_bits_per_min_cu_denom); + READ_UE_OR_RETURN(&vui->log2_max_mv_length_horizontal); + READ_UE_OR_RETURN(&vui->log2_max_mv_length_vertical); } return kOk;
diff --git a/media/video/h265_parser.h b/media/video/h265_parser.h index 1b6fd01..7f6540e 100644 --- a/media/video/h265_parser.h +++ b/media/video/h265_parser.h
@@ -53,6 +53,12 @@ // Syntax elements. int general_profile_idc; int general_level_idc; // 30x the actual level. + uint32_t general_profile_compatibility_flags; + bool general_progressive_source_flag; + bool general_interlaced_source_flag; + bool general_non_packed_constraint_flag; + bool general_frame_only_constraint_flag; + bool general_one_picture_only_constraint_flag; // From Table A.8 - General tier and level limits. int GetMaxLumaPs() const; @@ -113,6 +119,12 @@ int def_disp_win_right_offset; int def_disp_win_top_offset; int def_disp_win_bottom_offset; + bool bitstream_restriction_flag; + int min_spatial_segmentation_idc; + int max_bytes_per_pic_denom; + int max_bits_per_min_cu_denom; + int log2_max_mv_length_horizontal; + int log2_max_mv_length_vertical; }; struct MEDIA_EXPORT H265VPS { @@ -141,6 +153,7 @@ // Syntax elements. int sps_video_parameter_set_id; int sps_max_sub_layers_minus1; + bool sps_temporal_id_nesting_flag; H265ProfileTierLevel profile_tier_level; int sps_seq_parameter_set_id; int chroma_format_idc; @@ -494,6 +507,10 @@ H265SliceHeader* shdr, H265SliceHeader* prior_shdr); + // Parse a slice header and return the associated picture parameter set ID. + Result ParseSliceHeaderForPictureParameterSets(const H265NALU& nalu, + int* pps_id); + // Parse a SEI message, returning it in |*sei_msg|, provided and managed // by the caller. Result ParseSEI(H265SEIMessage* sei_msg);
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc index b61a9de4..046f069 100644 --- a/media/video/video_encode_accelerator_adapter.cc +++ b/media/video/video_encode_accelerator_adapter.cc
@@ -27,6 +27,11 @@ #include "media/base/video_util.h" #if BUILDFLAG(USE_PROPRIETARY_CODECS) #include "media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h" +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \ + BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) +#include "media/formats/mp4/h265_annex_b_to_hevc_bitstream_converter.h" +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && + // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) #include "media/video/gpu_video_accelerator_factories.h" @@ -409,6 +414,13 @@ !options_.avc.produce_annexb) { h264_converter_ = std::make_unique<H264AnnexBToAvcBitstreamConverter>(); } +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \ + BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + if (profile_ == HEVCPROFILE_MAIN && !options_.hevc.produce_annexb) { + h265_converter_ = std::make_unique<H265AnnexBToHevcBitstreamConverter>(); + } +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && + // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) std::move(done_cb).Run(EncoderStatus::Codes::kOk); @@ -602,6 +614,17 @@ h264_converter_ = std::make_unique<H264AnnexBToAvcBitstreamConverter>(); } } +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \ + BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + if (profile_ == HEVCPROFILE_MAIN) { + if (options.hevc.produce_annexb) { + h265_converter_.reset(); + } else if (!h265_converter_) { + h265_converter_ = std::make_unique<H265AnnexBToHevcBitstreamConverter>(); + } + } +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && + // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) options_ = options; @@ -703,15 +726,16 @@ DCHECK_LE(result.size, mapping.size()); if (result.size > 0) { + bool stream_converted = false; #if BUILDFLAG(USE_PROPRIETARY_CODECS) + uint8_t* src = static_cast<uint8_t*>(mapping.memory()); + size_t dst_size = result.size; + size_t actual_output_size = 0; + auto dst = std::make_unique<uint8_t[]>(dst_size); + bool config_changed = false; + media::MP4Status status; if (h264_converter_) { - uint8_t* src = static_cast<uint8_t*>(mapping.memory()); - size_t dst_size = result.size; - size_t actual_output_size = 0; - bool config_changed = false; - auto dst = std::make_unique<uint8_t[]>(dst_size); - - auto status = h264_converter_->ConvertChunk( + status = h264_converter_->ConvertChunk( base::span<uint8_t>(src, result.size), base::span<uint8_t>(dst.get(), dst_size), &config_changed, &actual_output_size); @@ -735,6 +759,7 @@ } result.size = actual_output_size; result.data = std::move(dst); + stream_converted = true; if (config_changed) { const auto& config = h264_converter_->GetCurrentConfig(); @@ -745,13 +770,50 @@ } } } else { -#endif // BUILDFLAG(USE_PROPRIETARY_CODECS) - result.data = std::make_unique<uint8_t[]>(result.size); - memcpy(result.data.get(), mapping.memory(), result.size); -#if BUILDFLAG(USE_PROPRIETARY_CODECS) +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \ + BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + if (h265_converter_) { + status = h265_converter_->ConvertChunk( + base::span<uint8_t>(src, result.size), + base::span<uint8_t>(dst.get(), dst_size), &config_changed, + &actual_output_size); + if (status.code() == MP4Status::Codes::kBufferTooSmall) { + dst_size = actual_output_size; + dst = std::make_unique<uint8_t[]>(dst_size); + status = h265_converter_->ConvertChunk( + base::span<uint8_t>(src, result.size), + base::span<uint8_t>(dst.get(), dst_size), &config_changed, + &actual_output_size); + } + + if (!status.is_ok()) { + LOG(ERROR) << status.message(); + NotifyError(VideoEncodeAccelerator::kPlatformFailureError); + return; + } + result.size = actual_output_size; + result.data = std::move(dst); + stream_converted = true; + + if (config_changed) { + const auto& config = h265_converter_->GetCurrentConfig(); + desc = CodecDescription(); + if (!config.Serialize(desc.value())) { + NotifyError(VideoEncodeAccelerator::kPlatformFailureError); + return; + } + } + } +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && + // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) } #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) + if (!stream_converted) { + result.data = std::make_unique<uint8_t[]>(result.size); + memcpy(result.data.get(), mapping.memory(), result.size); + } } + // Give the buffer back to |accelerator_| const base::UnsafeSharedMemoryRegion& region = output_handle_holder_->GetRegion();
diff --git a/media/video/video_encode_accelerator_adapter.h b/media/video/video_encode_accelerator_adapter.h index d2aaa14..d47b124 100644 --- a/media/video/video_encode_accelerator_adapter.h +++ b/media/video/video_encode_accelerator_adapter.h
@@ -31,6 +31,11 @@ class GpuVideoAcceleratorFactories; class MediaLog; class H264AnnexBToAvcBitstreamConverter; +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \ + BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) +class H265AnnexBToHevcBitstreamConverter; +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && + // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) // This class is a somewhat complex adapter from VideoEncodeAccelerator // to VideoEncoder, it takes cares of such things as @@ -135,6 +140,13 @@ // If |h264_converter_| is null, we output in annexb format. Otherwise, we // output in avc format. std::unique_ptr<H264AnnexBToAvcBitstreamConverter> h264_converter_; +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) && \ + BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + // If |h265_converter_| is null, we output in annexb format. Otherwise, we + // output in hevc format. + std::unique_ptr<H265AnnexBToHevcBitstreamConverter> h265_converter_; +#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) && + // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) #endif // BUILDFLAG(USE_PROPRIETARY_CODECS) // These are encodes that have been sent to the accelerator but have not yet
diff --git a/media/webrtc/helpers.cc b/media/webrtc/helpers.cc index d24f6d5..92ba22a5 100644 --- a/media/webrtc/helpers.cc +++ b/media/webrtc/helpers.cc
@@ -72,6 +72,11 @@ ::features::kWebRtcAnalogAgcStartupMinVolume, "volume", 0); } +bool DisallowInputVolumeAdjustment() { + return !base::FeatureList::IsEnabled( + ::features::kWebRtcAllowInputVolumeAdjustment); +} + void ConfigAgc2AdaptiveDigitalForHybridExperiment( ::webrtc::AudioProcessing::Config::GainController2::AdaptiveDigital& config) { @@ -192,6 +197,16 @@ agc1_analog_config.enable_digital_adaptive = true; agc2_config.adaptive_digital.enabled = false; } + + if (DisallowInputVolumeAdjustment()) { + if (use_hybrid_agc) { + // Completely disable AGC1, which is only used as input volume controller. + apm_config.gain_controller1.enabled = false; + } else { + LOG(WARNING) << "Cannot disable input volume adjustment when AGC2 is " + "disabled (not implemented)."; + } + } } } // namespace
diff --git a/media/webrtc/webrtc_features.cc b/media/webrtc/webrtc_features.cc index 0df461c..60ce42ff 100644 --- a/media/webrtc/webrtc_features.cc +++ b/media/webrtc/webrtc_features.cc
@@ -55,4 +55,10 @@ "WebRtcAnalogAgcStartupMinVolume", base::FEATURE_DISABLED_BY_DEFAULT); +// When disabled, any WebRTC Audio Processing Module input volume recommendation +// is ignored and no adjustment takes place. +BASE_FEATURE(kWebRtcAllowInputVolumeAdjustment, + "WebRtcAllowInputVolumeAdjustment", + base::FEATURE_ENABLED_BY_DEFAULT); + } // namespace features
diff --git a/media/webrtc/webrtc_features.h b/media/webrtc/webrtc_features.h index 384d9b75..85d57d0 100644 --- a/media/webrtc/webrtc_features.h +++ b/media/webrtc/webrtc_features.h
@@ -26,6 +26,9 @@ COMPONENT_EXPORT(MEDIA_WEBRTC) BASE_DECLARE_FEATURE(kWebRtcAnalogAgcStartupMinVolume); +COMPONENT_EXPORT(MEDIA_WEBRTC) +BASE_DECLARE_FEATURE(kWebRtcAllowInputVolumeAdjustment); + } // namespace features #endif // MEDIA_WEBRTC_WEBRTC_FEATURES_H_
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index e9c1a36..a1b000b 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: 2022-10-16 12:56 UTC +# Last updated: 2022-10-17 12:56 UTC PinsListTimestamp -1665925009 +1666011361 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/services/data_decoder/public/cpp/safe_xml_parser.cc b/services/data_decoder/public/cpp/safe_xml_parser.cc index c42af0b0..454077b 100644 --- a/services/data_decoder/public/cpp/safe_xml_parser.cc +++ b/services/data_decoder/public/cpp/safe_xml_parser.cc
@@ -60,7 +60,7 @@ return false; const base::Value* text_node = nullptr; - for (const base::Value& value : children->GetListDeprecated()) { + for (const base::Value& value : children->GetList()) { if (IsXmlElementOfType(value, mojom::XmlParser::kTextNodeType) || IsXmlElementOfType(value, mojom::XmlParser::kCDataNodeType)) { text_node = &value; @@ -103,7 +103,7 @@ if (!children) return 0; int child_count = 0; - for (const base::Value& value : children->GetListDeprecated()) { + for (const base::Value& value : children->GetList()) { DCHECK(value.is_dict()); std::string tag_name; bool success = GetXmlElementTagName(value, &tag_name); @@ -118,7 +118,7 @@ const base::Value* children = GetXmlElementChildren(element); if (!children) return nullptr; - for (const base::Value& value : children->GetListDeprecated()) { + for (const base::Value& value : children->GetList()) { DCHECK(value.is_dict()); if (IsXmlElementOfType(value, type)) { return &value; @@ -132,7 +132,7 @@ const base::Value* children = GetXmlElementChildren(element); if (!children) return nullptr; - for (const base::Value& value : children->GetListDeprecated()) { + for (const base::Value& value : children->GetList()) { DCHECK(value.is_dict()); if (IsXmlElementNamed(value, tag)) return &value; @@ -148,7 +148,7 @@ if (!children) return false; bool found = false; - for (const base::Value& child : children->GetListDeprecated()) { + for (const base::Value& child : children->GetList()) { DCHECK(child.is_dict()); if (IsXmlElementNamed(child, tag)) { found = true;
diff --git a/services/network/cors/cors_url_loader_private_network_access_unittest.cc b/services/network/cors/cors_url_loader_private_network_access_unittest.cc index daec3a8..9060bc3 100644 --- a/services/network/cors/cors_url_loader_private_network_access_unittest.cc +++ b/services/network/cors/cors_url_loader_private_network_access_unittest.cc
@@ -798,6 +798,74 @@ // This test verifies that when: // +// - the private network request policy is set to `kPreflightBlock` +// - a simple request detects a private network request +// - the following PNA preflight response takes forever to arrive +// +// ... we wait as long as it takes for the response to arrive. +TEST_F(CorsURLLoaderPrivateNetworkAccessTest, PolicyBlockPreflightNoTimeout) { + auto initiator_origin = url::Origin::Create(GURL("https://example.com")); + + ResetFactoryParams factory_params; + factory_params.is_trusted = true; + ResetFactory(initiator_origin, kRendererProcessId, factory_params); + + ResourceRequest request; + request.method = "GET"; + request.mode = mojom::RequestMode::kCors; + request.url = GURL("https://example.com/"); + request.request_initiator = initiator_origin; + request.trusted_params = + RequestTrustedParamsBuilder() + .WithClientSecurityState( + ClientSecurityStateBuilder() + .WithPrivateNetworkRequestPolicy( + mojom::PrivateNetworkRequestPolicy::kPreflightBlock) + .WithIsSecureContext(true) + .WithIPAddressSpace(mojom::IPAddressSpace::kPublic) + .Build()) + .Build(); + + base::HistogramTester histogram_tester; + + CreateLoaderAndStart(request); + RunUntilCreateLoaderAndStartCalled(); + NotifyLoaderClientOnComplete(CorsErrorStatus( + mojom::CorsError::kUnexpectedPrivateNetworkAccess, + mojom::IPAddressSpace::kUnknown, mojom::IPAddressSpace::kPrivate)); + + RunUntilCreateLoaderAndStartCalled(); + + // Simulate a response that takes longer to arrive than the preflight timeout. + // This should still work, because the timeout should not be applied. + base::OneShotTimer timer; + timer.Start(FROM_HERE, base::Milliseconds(500), + base::BindLambdaForTesting([this] { + NotifyLoaderClientOnReceiveResponse({ + {"Access-Control-Allow-Methods", "PUT"}, + {"Access-Control-Allow-Origin", "https://example.com"}, + {"Access-Control-Allow-Credentials", "true"}, + {"Access-Control-Allow-Private-Network", "true"}, + }); + })); + + RunUntilCreateLoaderAndStartCalled(); + NotifyLoaderClientOnReceiveResponse({ + {"Access-Control-Allow-Methods", "PUT"}, + {"Access-Control-Allow-Origin", "https://example.com"}, + {"Access-Control-Allow-Credentials", "true"}, + }); + NotifyLoaderClientOnComplete(net::OK); + RunUntilComplete(); + + EXPECT_EQ(client().completion_status().error_code, net::OK); + + EXPECT_THAT(histogram_tester.GetAllSamples(kPreflightWarningHistogramName), + IsEmpty()); +} + +// This test verifies that when: +// // - the private network request policy is set to `kPreflightWarn` // - a simple request detects a private network request // - the following PNA preflight fails due to a non-PNA CORS error
diff --git a/services/network/cors/preflight_controller_unittest.cc b/services/network/cors/preflight_controller_unittest.cc index a787dbd6..b583e9a 100644 --- a/services/network/cors/preflight_controller_unittest.cc +++ b/services/network/cors/preflight_controller_unittest.cc
@@ -772,7 +772,7 @@ mojom::ClientSecurityStatePtr client_security_state = ClientSecurityStateBuilder() .WithPrivateNetworkRequestPolicy( - mojom::PrivateNetworkRequestPolicy::kPreflightWarn) + mojom::PrivateNetworkRequestPolicy::kPreflightBlock) .Build(); // Set the client security state in the request's trusted params, because the
diff --git a/services/tracing/public/cpp/perfetto/custom_event_recorder.cc b/services/tracing/public/cpp/perfetto/custom_event_recorder.cc index 82618eb9..122e869 100644 --- a/services/tracing/public/cpp/perfetto/custom_event_recorder.cc +++ b/services/tracing/public/cpp/perfetto/custom_event_recorder.cc
@@ -227,6 +227,9 @@ } #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) + // We have to flush explicitly because we're using the asynchronous stop + // mechanism. + perfetto::TrackEvent::Flush(); std::move(stop_complete_callback).Run(); #endif // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) }
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 83d2934..d036633c 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -1338,29 +1338,6 @@ ] } ], - "AutofillRationalizeStreetAddressAndAddressLine": [ - { - "platforms": [ - "android", - "android_webview", - "chromeos", - "chromeos_lacros", - "fuchsia", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillRationalizeStreetAddressAndAddressLine" - ] - } - ] - } - ], "AutofillRefillModifiedCreditCardExpirationDates": [ { "platforms": [ @@ -11763,27 +11740,6 @@ ] } ], - "WebProtectNewEvents": [ - { - "platforms": [ - "chromeos", - "chromeos_lacros", - "fuchsia", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "LoginEventReporting", - "PasswordBreachEventReporting" - ] - } - ] - } - ], "WebProtectReportOnlyUI": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 1dcfe45..296e129 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -1483,10 +1483,6 @@ "WebRtc-ExposeNonStandardStats", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kSubstringSetTreeForAttributeBuckets, - "SubstringSetTreeForAttributeBuckets", - base::FEATURE_DISABLED_BY_DEFAULT); - BASE_FEATURE(kInvalidationSetClassBloomFilter, "InvalidationSetClassBloomFilter", base::FEATURE_DISABLED_BY_DEFAULT); @@ -1617,6 +1613,18 @@ "DocumentEventNodePathCaching", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kNewBaseUrlInheritanceBehavior, + "NewBaseUrlInheritanceBehavior", + base::FEATURE_DISABLED_BY_DEFAULT); + +bool IsNewBaseUrlInheritanceBehaviorEnabled() { + // The kIsolateSandboxedIframes feature depends on the new base URL behavior, + // so it enables the new behavior even if kNewBaseUrlInheritanceBehavior + // isn't enabled. + return base::FeatureList::IsEnabled(kNewBaseUrlInheritanceBehavior) || + base::FeatureList::IsEnabled(kIsolateSandboxedIframes); +} + const base::FeatureParam<int> kDocumentMaxEventNodePathCachedEntries{ &kDocumentEventNodePathCaching, "max-cache-entries", 10};
diff --git a/third_party/blink/common/tokens/multi_token_unittest.cc b/third_party/blink/common/tokens/multi_token_unittest.cc index 294afbc..ec02723 100644 --- a/third_party/blink/common/tokens/multi_token_unittest.cc +++ b/third_party/blink/common/tokens/multi_token_unittest.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/public/common/tokens/multi_token.h" +#include <algorithm> + #include "base/types/token_type.h" #include "base/unguessable_token.h" #include "testing/gtest/include/gtest/gtest.h" @@ -14,12 +16,59 @@ using BarToken = base::TokenType<class BarTokenTag>; using BazToken = base::TokenType<class BazTokenTag>; -static_assert(internal::IsBaseTokenTypeV<FooToken>); -static_assert(!internal::IsBaseTokenTypeV<int>); +// Test MultiTokenVariantCount. +static_assert(internal::MultiTokenVariantCount<FooToken, BarToken>::kValue == 2, + "unexpected count"); +static_assert( + internal::MultiTokenVariantCount<FooToken, BarToken, BazToken>::kValue == 3, + "unexpected count"); -static_assert(internal::AreAllUnique<int>); -static_assert(!internal::AreAllUnique<int, int>); -static_assert(!internal::AreAllUnique<int, char, int>); +// Test MultiTokenTypeRepeated. +static_assert(!internal::MultiTokenTypeRepeated<FooToken>::kValue, + "unexpected repeated value"); +static_assert(!internal::MultiTokenTypeRepeated<FooToken, FooToken>::kValue, + "unexpected repeated value"); +static_assert( + !internal::MultiTokenTypeRepeated<FooToken, FooToken, BarToken>::kValue, + "unexpected repeated value"); +static_assert( + internal::MultiTokenTypeRepeated<FooToken, FooToken, BarToken, FooToken>:: + kValue, + "unexpected repeated value"); +static_assert( + internal::MultiTokenTypeRepeated<FooToken, BarToken, FooToken, FooToken>:: + kValue, + "unexpected repeated value"); + +// Test MultiTokenAnyTypeRepeated. +static_assert(!internal::MultiTokenAnyTypeRepeated<FooToken>::kValue, + "unexpected any repeated value"); +static_assert(!internal::MultiTokenAnyTypeRepeated<FooToken, BarToken>::kValue, + "unexpected any repeated value"); +static_assert( + !internal::MultiTokenAnyTypeRepeated<FooToken, BarToken, BazToken>::kValue, + "unexpected any repeated value"); +static_assert( + internal::MultiTokenAnyTypeRepeated<FooToken, BarToken, FooToken>::kValue, + "unexpected any repeated value"); +static_assert( + internal::MultiTokenAnyTypeRepeated<FooToken, BarToken, BarToken>::kValue, + "unexpected any repeated value"); + +// Test MultiTokenVariantIsTokenType. +static_assert(internal::MultiTokenVariantIsTokenType<FooToken>::kValue, + "unexpected is token type value"); +static_assert(!internal::MultiTokenVariantIsTokenType<int>::kValue, + "unexpected is token type value"); + +// Test MultiTokenAllVariantsAreTokenType. +static_assert( + internal::MultiTokenAllVariantsAreTokenType<FooToken, BarToken>::kValue, + "unexpected all variants are token type value"); +static_assert(!internal::MultiTokenAllVariantsAreTokenType<FooToken, + BarToken, + int>::kValue, + "unexpected all variants are token type value"); using FooBarToken = MultiToken<FooToken, BarToken>; using FooBarBazToken = MultiToken<FooToken, BarToken, BazToken>; @@ -72,10 +121,4 @@ EXPECT_EQ(token2.GetAs<BarToken>(), token3.GetAs<BarToken>()); } -TEST(MultiTokenTest, IndexOf) { - static_assert(FooBarBazToken::IndexOf<FooToken>() == 0); - static_assert(FooBarBazToken::IndexOf<BarToken>() == 1); - static_assert(FooBarBazToken::IndexOf<BazToken>() == 2); -} - } // namespace blink
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index e739ed13..fb89eed 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -711,10 +711,6 @@ // If enabled, expose non-standard stats in the WebRTC getStats API. BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kWebRtcExposeNonStandardStats); -// If enabled, CSS rulesets with many different rules on the same attribute -// will be attempted accelerated with a substring set tree. -BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kSubstringSetTreeForAttributeBuckets); - // If enabled, style invalidation will use a Bloom filter for storing // CSS classes that need (only) self-invalidation, instead of having them // in the main hash map. @@ -886,6 +882,14 @@ IsolateSandboxedIframesGrouping> kIsolateSandboxedIframesGroupingParam; +// Flag to control whether about:blank and srcdoc iframes use newly proposed +// base url inheritance behavior from https://crbug.com/1356658. +BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kNewBaseUrlInheritanceBehavior); + +// This function checks both kNewBaseUrlInheritanceBehavior and +// kIsolateSandboxedIframes and returns true if either is enabled. +BLINK_COMMON_EXPORT bool IsNewBaseUrlInheritanceBehaviorEnabled(); + } // namespace features } // namespace blink
diff --git a/third_party/blink/public/common/privacy_budget/identifiable_surface.h b/third_party/blink/public/common/privacy_budget/identifiable_surface.h index 4086266..68ddf5e 100644 --- a/third_party/blink/public/common/privacy_budget/identifiable_surface.h +++ b/third_party/blink/public/common/privacy_budget/identifiable_surface.h
@@ -276,7 +276,7 @@ kMax = kWorkerClientAdded_WorkerType }; - enum class WorkerType { + enum class WorkerType : uint64_t { kSharedWorker = 0, kServiceWorker = 1, kMax = kServiceWorker,
diff --git a/third_party/blink/public/common/tokens/multi_token.h b/third_party/blink/public/common/tokens/multi_token.h index d1e7c71..857f648 100644 --- a/third_party/blink/public/common/tokens/multi_token.h +++ b/third_party/blink/public/common/tokens/multi_token.h
@@ -13,111 +13,143 @@ #include <type_traits> #include "base/unguessable_token.h" -#include "third_party/abseil-cpp/absl/types/variant.h" #include "third_party/blink/public/common/tokens/multi_token_internal.h" namespace blink { -// `MultiToken<Tokens...>` is a variant of 2 or more token types. Each token -// type must be an instantiation of `base::TokenType`, and each token type must -// be unique within `Tokens...`. Unlike `base::UnguessableToken`, a `MultiToken` -// is always valid: there is no null state. Default constructing a `MultiToken` -// will create a `MultiToken` containing an instance of the first token type in -// `Tokens`. +// Defines MultiToken, which is effectively a variant over 2 or more +// instances of base::TokenType. // -// Usage: +// A MultiToken<..> emulates a token like interface. When default constructed +// it will construct itself as an instance of |TokenVariant0|. Additionally it +// offers the following functions allowing casting and querying token types at +// runtime: // -// using CowToken = base::TokenType<class CowTokenTag>; -// using GoatToken = base::TokenType<class GoatTokenTag>; -// using UngulateToken = blink::MultiToken<CowToken, GoatToken>; +// // Determines whether this token stores an instance of a TokenType. +// bool Is<TokenType>() const; // -// void TeleportCow(const CowToken&); -// void TeleportGoat(const GoatToken&); +// // Extracts the stored token in its original type. The stored token must +// // be of the provided type otherwise this will explode at runtime. +// const TokenType& GetAs<TokenType>() const; // -// void TeleportUngulate(const UngulateToken& token) { -// if (token.Is<CowToken>()) { -// TeleportCow(token.Get<CowToken>()); -// } else if (token.Is<GoatToken>()) { -// TeleportGoat(token.Get<GoatToken>()); -// } -// CHECK(false); // Not reachable. -// } -template <typename... Tokens> -class MultiToken { - static_assert(sizeof...(Tokens) > 1); - static_assert(std::conjunction_v<internal::IsBaseTokenType<Tokens>...>); - static_assert(internal::AreAllUnique<Tokens...>); - - template <typename T> - using EnableIfIsSupportedToken = - internal::EnableIfIsSupportedToken<T, Tokens...>; - +// A variant must have at least 2 valid input types, but can have arbitrarily +// many. They must all be distinct, and they must all be instances of +// base::TokenType. +template <typename TokenVariant0, + typename TokenVariant1, + typename... TokenVariants> +class MultiToken : public internal::MultiTokenBase<TokenVariant0, + TokenVariant1, + TokenVariants...> { public: - using Storage = absl::variant<Tokens...>; + using Base = + internal::MultiTokenBase<TokenVariant0, TokenVariant1, TokenVariants...>; - // A default constructed token will hold a default-constructed instance (i.e. - // randomly initialised) of the first token type in `Tokens...`. + // The total number of types. + static const uint32_t kVariantCount = Base::VariantCount::kValue; + + // Default constructor. The resulting token will be a valid token of type + // TokenVariant0. MultiToken() = default; - template <typename T, EnableIfIsSupportedToken<T> = 0> + // Copy constructors. + MultiToken(const MultiToken& other) = default; + template <typename InputTokenType, + typename = typename std::enable_if< + Base::template ValidType<InputTokenType>::kValue>::type> // NOLINTNEXTLINE(google-explicit-constructor) - MultiToken(const T& token) : storage_(token) {} - MultiToken(const MultiToken&) = default; - - template <typename T, EnableIfIsSupportedToken<T> = 0> - MultiToken& operator=(const T& token) { - storage_ = token; - return *this; - } - MultiToken& operator=(const MultiToken&) = default; + MultiToken(const InputTokenType& input_token) + : value_(input_token.value()), + variant_index_(Base::template TypeIndex<InputTokenType>::kValue) {} ~MultiToken() = default; - // Returns true iff `this` currently holds a token of type `T`. - template <typename T, EnableIfIsSupportedToken<T> = 0> + // Assignment operators. + MultiToken& operator=(const MultiToken& other) = default; + template <typename InputTokenType, + typename = typename std::enable_if< + Base::template ValidType<InputTokenType>::kValue>::type> + MultiToken& operator=(const InputTokenType& input_token) { + value_ = input_token.value(); + variant_index_ = Base::template TypeIndex<InputTokenType>::kValue; + return *this; + } + + const base::UnguessableToken& value() const { return value_; } + uint32_t variant_index() const { return variant_index_; } + std::string ToString() const { return value().ToString(); } + + // Type checking. + template <typename InputTokenType, + typename = typename std::enable_if< + Base::template ValidType<InputTokenType>::kValue>::type> bool Is() const { - return absl::holds_alternative<T>(storage_); + return variant_index_ == Base::template TypeIndex<InputTokenType>::kValue; } - // Returns `T` if `this` currently holds a token of type `T`; otherwise, - // crashes. - template <typename T, EnableIfIsSupportedToken<T> = 0> - const T& GetAs() const { - return absl::get<T>(storage_); + // Type conversion. Allows extracting the underlying token type. This should + // only be called for the actual type that is stored in this token. This can + // be checked by calling "Is<>" first. + template <typename InputTokenType, + typename = typename std::enable_if< + Base::template ValidType<InputTokenType>::kValue>::type> + InputTokenType GetAs() const { + CHECK(Is<InputTokenType>()) << "invalid token type cast"; + // Type-punning via casting is undefined behaviour, so we return by value. + return InputTokenType(value_); } - // Comparison operators - friend bool operator<(const MultiToken& lhs, const MultiToken& rhs) { - return lhs.storage_ < rhs.storage_; + // Comparison with untyped tokens. Only compares the token value, ignoring the + // type. + int Compare(const base::UnguessableToken& other) const { + return Base::CompareImpl(value_, other); + } + bool operator<(const base::UnguessableToken& other) const { + return Compare(other) == -1; + } + bool operator==(const base::UnguessableToken& other) const { + return Compare(other) == 0; + } + bool operator!=(const base::UnguessableToken& other) const { + return Compare(other) != 0; } - friend bool operator==(const MultiToken& lhs, const MultiToken& rhs) { - return lhs.storage_ == rhs.storage_; + // Comparison with other MultiTokens. Compares by token, then type. + int Compare(const MultiToken& other) const { + return Base::CompareImpl(std::tie(value_, variant_index_), + std::tie(other.value_, other.variant_index_)); } + bool operator<(const MultiToken& other) const { return Compare(other) == -1; } + bool operator==(const MultiToken& other) const { return Compare(other) == 0; } + bool operator!=(const MultiToken& other) const { return Compare(other) != 0; } - friend bool operator!=(const MultiToken& lhs, const MultiToken& rhs) { - return !(lhs == rhs); + // Comparison with individual typed tokens. Compares by token, then type. + template <typename InputTokenType, + typename = typename std::enable_if< + Base::template ValidType<InputTokenType>::kValue>::type> + int Compare(const InputTokenType& other) const { + static constexpr uint32_t kInputTokenTypeIndex = + Base::template TypeIndex<InputTokenType>::kValue; + return Base::CompareImpl(std::tie(value_, variant_index_), + std::tie(other.value(), kInputTokenTypeIndex)); } - - template <typename T, EnableIfIsSupportedToken<T> = 0> - friend bool operator==(const MultiToken& lhs, const T& rhs) { - return absl::holds_alternative<T>(lhs.storage_) && - absl::get<T>(lhs.storage_) == rhs; + template <typename InputTokenType, + typename = typename std::enable_if< + Base::template ValidType<InputTokenType>::kValue>::type> + bool operator<(const InputTokenType& other) const { + return Compare(other) == -1; } - - template <typename T, EnableIfIsSupportedToken<T> = 0> - friend bool operator==(const T& lhs, const MultiToken& rhs) { - return rhs == lhs; + template <typename InputTokenType, + typename = typename std::enable_if< + Base::template ValidType<InputTokenType>::kValue>::type> + bool operator==(const InputTokenType& other) const { + return Compare(other) == 0; } - - template <typename T, EnableIfIsSupportedToken<T> = 0> - friend bool operator!=(const MultiToken& lhs, const T& rhs) { - return !(lhs == rhs); - } - - template <typename T, EnableIfIsSupportedToken<T> = 0> - friend bool operator!=(const T& lhs, const MultiToken& rhs) { - return !(lhs == rhs); + template <typename InputTokenType, + typename = typename std::enable_if< + Base::template ValidType<InputTokenType>::kValue>::type> + bool operator!=(const InputTokenType& other) const { + return Compare(other) != 0; } // Hash functor for use in unordered containers. @@ -125,57 +157,18 @@ using argument_type = MultiToken; using result_type = size_t; result_type operator()(const MultiToken& token) const { - return base::UnguessableTokenHash()(token.value()); + return base::UnguessableTokenHash()(token.value_); } }; - // Prefer the above helpers where possible. These methods are primarily useful - // for serialization/deserialization. - - // Returns the underlying `base::UnguessableToken` of the currently held - // token. - const base::UnguessableToken& value() const; - - // 0-based index of the currently held token's type, based on its position in - // `Tokens...`. - uint32_t variant_index() const { - return static_cast<uint32_t>(storage_.index()); - } - - // Returns the 0-based index that a token of type `T` would have if it were - // currently held. - template <typename T, EnableIfIsSupportedToken<T> = 0> - static constexpr size_t IndexOf() { - return absl::variant<Tag<Tokens>...>(Tag<T>()).index(); - } - - // Equivalent to `value().ToString()`. - std::string ToString() const; - private: - // Helper struct for IndexOf(); a `base::TokenType` is never usable as a - // literal type but a Tag<base::TokenType> is. - template <typename T> - struct Tag {}; + // The underlying untyped token value. This will *never* be null initialized. + base::UnguessableToken value_ = base::UnguessableToken::Create(); - Storage storage_; + // The index of the variant type that is currently stored in this token. + uint32_t variant_index_ = 0; }; -template <typename... Tokens> -const base::UnguessableToken& MultiToken<Tokens...>::value() const { - return absl::visit( - [](const auto& token) -> const base::UnguessableToken& { - return token.value(); - }, - storage_); -} - -template <typename... Tokens> -std::string MultiToken<Tokens...>::ToString() const { - return absl::visit([](const auto& token) { return token.ToString(); }, - storage_); -} - } // namespace blink #endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_TOKENS_MULTI_TOKEN_H_
diff --git a/third_party/blink/public/common/tokens/multi_token_internal.h b/third_party/blink/public/common/tokens/multi_token_internal.h index 8a1a06c..65f05364 100644 --- a/third_party/blink/public/common/tokens/multi_token_internal.h +++ b/third_party/blink/public/common/tokens/multi_token_internal.h
@@ -8,33 +8,223 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_TOKENS_MULTI_TOKEN_INTERNAL_H_ #define THIRD_PARTY_BLINK_PUBLIC_COMMON_TOKENS_MULTI_TOKEN_INTERNAL_H_ +#include <algorithm> +#include <cstring> #include <type_traits> #include "base/types/token_type.h" +#include "base/unguessable_token.h" -namespace blink::internal { +namespace blink { -template <typename T> -struct IsBaseTokenType : std::false_type {}; +namespace internal { -template <typename T> -struct IsBaseTokenType<base::TokenType<T>> : std::true_type {}; +//////////////////////////////////////////////////////////////////////////////// +// MultiTokenVariantCount +// +// Counts the number of token types. -template <typename T> -inline constexpr bool IsBaseTokenTypeV = IsBaseTokenType<T>::value; +template <typename... VariantTypes> +struct MultiTokenVariantCount; -template <typename... Types> -bool AreAllUnique; +// Recursive case. +template <typename FirstVariantType, typename... OtherVariantTypes> +struct MultiTokenVariantCount<FirstVariantType, OtherVariantTypes...> { + // Deliberately use uint32_t here so as not to incur an extra 4 bytes of + // overhead on 64-bit systems, as this is the same type used by the + // |variant_index_|. + static constexpr uint32_t kValue = + 1 + MultiTokenVariantCount<OtherVariantTypes...>::kValue; +}; + +// Base case. template <> -inline constexpr bool AreAllUnique<> = true; -template <typename T, typename... Ts> -inline constexpr bool AreAllUnique<T, Ts...> = - (!std::is_same_v<T, Ts> && ...) && AreAllUnique<Ts...>; +struct MultiTokenVariantCount<> { + static constexpr uint32_t kValue = 0; +}; -template <typename T, typename... Types> -using EnableIfIsSupportedToken = - std::enable_if_t<(std::is_same_v<T, Types> || ...), int>; +//////////////////////////////////////////////////////////////////////////////// +// MultiTokenVariantIsTokenType +// +// Ensures if a QueryType is a a base::TokenType<>. -} // namespace blink::internal +// Default case. +template <typename QueryType> +struct MultiTokenVariantIsTokenType { + static constexpr bool kValue = false; +}; + +// Specialization for base::TokenType<>. +template <typename TokenTypeTag> +struct MultiTokenVariantIsTokenType<::base::TokenType<TokenTypeTag>> { + static constexpr bool kValue = true; + + // We expect an identical layout, which allows us to reinterpret_cast between + // types. The spec does not guarantee this, but sane compilers do. Thankfully + // we can check whether or not the compiler is sane (and if the behaviour is + // safe) at compile-time. + static_assert( + sizeof(::base::TokenType<TokenTypeTag>) == + sizeof(::base::UnguessableToken), + "base::TokenType must have the same sizeof as base::UnguessableToken"); + static_assert( + alignof(::base::TokenType<TokenTypeTag>) == + alignof(::base::UnguessableToken), + "base::TokenType must have the same alignof as base::UnguessableToken"); +}; + +//////////////////////////////////////////////////////////////////////////////// +// MultiTokenAllVariantsAreTokenType +// +// Ensures that all variants are of type base::TokenType. + +template <typename... VariantTypes> +struct MultiTokenAllVariantsAreTokenType; + +// Recursive case. +template <typename FirstVariantType, typename... OtherVariantTypes> +struct MultiTokenAllVariantsAreTokenType<FirstVariantType, + OtherVariantTypes...> { + static constexpr bool kValue = + MultiTokenVariantIsTokenType<FirstVariantType>::kValue && + MultiTokenAllVariantsAreTokenType<OtherVariantTypes...>::kValue; +}; + +// Base case. +template <> +struct MultiTokenAllVariantsAreTokenType<> { + static constexpr bool kValue = true; +}; + +//////////////////////////////////////////////////////////////////////////////// +// MultiTokenTypeRepeated +// +// Determines if a QueryType is repeated in a variadic list of types. + +template <typename QueryType, typename... VariantTypes> +struct MultiTokenTypeRepeated; + +// Recursive case. +template <typename QueryType, + typename FirstVariantType, + typename... OtherVariantTypes> +struct MultiTokenTypeRepeated<QueryType, + FirstVariantType, + OtherVariantTypes...> { + static constexpr size_t kCount = + (std::is_same<QueryType, FirstVariantType>::value ? 1 : 0) + + MultiTokenTypeRepeated<QueryType, OtherVariantTypes...>::kCount; + static constexpr bool kValue = kCount > 1; +}; + +// Base case. +template <typename QueryType> +struct MultiTokenTypeRepeated<QueryType> { + static constexpr size_t kCount = 0; + static constexpr bool kValue = false; +}; + +//////////////////////////////////////////////////////////////////////////////// +// MultiTokenAnyTypeRepeated +// +// Determines if any type is repeated in a variadic list of types. + +template <typename... VariantTypes> +struct MultiTokenAnyTypeRepeated; + +// Recursive case. +template <typename FirstVariantType, typename... OtherVariantTypes> +struct MultiTokenAnyTypeRepeated<FirstVariantType, OtherVariantTypes...> { + static constexpr bool kValue = + MultiTokenTypeRepeated<FirstVariantType, + FirstVariantType, + OtherVariantTypes...>::kValue || + MultiTokenAnyTypeRepeated<OtherVariantTypes...>::kValue; +}; + +// Base case. +template <> +struct MultiTokenAnyTypeRepeated<> { + static constexpr bool kValue = false; +}; + +//////////////////////////////////////////////////////////////////////////////// +// MultiTokenTypeIndex +// +// Returns the index of a QueryType from a variadic list of N types, or N if the +// QueryType is not found in the list. + +template <typename QueryType, typename... VariantTypes> +struct MultiTokenTypeIndex; + +// Recursive case. +template <typename QueryType, + typename FirstVariantType, + typename... OtherVariantTypes> +struct MultiTokenTypeIndex<QueryType, FirstVariantType, OtherVariantTypes...> { + static constexpr size_t kValue = + (std::is_same<QueryType, FirstVariantType>::value + ? 0 + : (1 + + MultiTokenTypeIndex<QueryType, OtherVariantTypes...>::kValue)); +}; + +// Base case. +template <typename QueryType> +struct MultiTokenTypeIndex<QueryType> { + static constexpr size_t kValue = 0; +}; + +//////////////////////////////////////////////////////////////////////////////// +// MultiTokenBase +// +// Base class that brings helper structs into a single namespace for +// convenience. +template <typename... TokenVariants> +class MultiTokenBase { + public: + // Ensures that no types are repeated, as that's non-sensical. + using AnyRepeated = internal::MultiTokenAnyTypeRepeated<TokenVariants...>; + static_assert(!AnyRepeated::kValue, "input types must not be repeated"); + + // Ensures that all variants are instances of base::TokenType. + using AllVariantsAreTokenType = + internal::MultiTokenAllVariantsAreTokenType<TokenVariants...>; + static_assert(AllVariantsAreTokenType::kValue, + "input types must be instances of base::TokenType"); + + // Counts the number of variants. + using VariantCount = internal::MultiTokenVariantCount<TokenVariants...>; + + // For determining the index of a type. Used to assign an integer ID to a + // type, as a kind of untyped enum. + template <typename QueryType> + struct TypeIndex + : public internal::MultiTokenTypeIndex<QueryType, TokenVariants...> {}; + + // For determining if a type is valid for this variant. Useful in enable_if + // statements. + template <typename QueryType> + struct ValidType { + static constexpr bool kValue = + TypeIndex<QueryType>::kValue != VariantCount::kValue; + }; + + // Helper comparator. Compares underlying types using only < and == to + // return -1, 0, or 1 depending on their relative values. + template <typename InputType> + static int CompareImpl(const InputType& lhs, const InputType& rhs) { + if (lhs < rhs) + return -1; + if (lhs == rhs) + return 0; + DCHECK(rhs < lhs); + return 1; + } +}; + +} // namespace internal + +} // namespace blink #endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_TOKENS_MULTI_TOKEN_INTERNAL_H_
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index 3a8459f5..c970bff 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3690,6 +3690,7 @@ kSerivceWorkerFallbackMainResource = 4369, kGetDisplayMediaWithoutUserActivation = 4370, kBackForwardCacheNotRestoredReasons = 4371, + kCSSNesting = 4372, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index 568a63a..9116844 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -515,6 +515,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_handwriting_recognizer_query_result.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_handwriting_segment.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_handwriting_segment.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hevc_encoder_config.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hevc_encoder_config.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hid_collection_info.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hid_collection_info.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hid_connection_event_init.cc", @@ -1216,6 +1218,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_handwriting_recognition_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hardware_preference.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hardware_preference.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hevc_bitstream_format.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hevc_bitstream_format.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hdr_metadata_type.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hdr_metadata_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_hid_unit_system.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni index 6b6f0c0..398a2ee 100644 --- a/third_party/blink/renderer/bindings/idl_in_modules.gni +++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -848,6 +848,7 @@ "//third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_metadata.idl", "//third_party/blink/renderer/modules/webcodecs/encoded_video_chunk_output_callback.idl", "//third_party/blink/renderer/modules/webcodecs/hardware_preference.idl", + "//third_party/blink/renderer/modules/webcodecs/hevc_encoder_config.idl", "//third_party/blink/renderer/modules/webcodecs/image_decode_options.idl", "//third_party/blink/renderer/modules/webcodecs/image_decode_result.idl", "//third_party/blink/renderer/modules/webcodecs/image_decoder.idl",
diff --git a/third_party/blink/renderer/core/css/check_pseudo_has_argument_context_test.cc b/third_party/blink/renderer/core/css/check_pseudo_has_argument_context_test.cc index 002db25..6e5fcbc 100644 --- a/third_party/blink/renderer/core/css/check_pseudo_has_argument_context_test.cc +++ b/third_party/blink/renderer/core/css/check_pseudo_has_argument_context_test.cc
@@ -26,10 +26,10 @@ int expected_adjacent_distance_limit, int expected_depth_limit, CheckPseudoHasArgumentTraversalScope expected_traversal_scope) const { - CSSSelectorList selector_list = + CSSSelectorList* selector_list = css_test_helpers::ParseSelectorList(selector_text); CheckPseudoHasArgumentContext context( - selector_list.First()->SelectorList()->First()); + selector_list->First()->SelectorList()->First()); EXPECT_EQ(expected_leftmost_relation, context.LeftmostRelation()) << "Failed : " << selector_text; @@ -58,10 +58,10 @@ } unsigned i = 0; - CSSSelectorList selector_list = + CSSSelectorList* selector_list = css_test_helpers::ParseSelectorList(selector_text); CheckPseudoHasArgumentContext argument_context( - selector_list.First()->SelectorList()->First()); + selector_list->First()->SelectorList()->First()); for (CheckPseudoHasArgumentTraversalIterator iterator(*has_anchor_element, argument_context); !iterator.AtEnd(); ++iterator, ++i) { @@ -81,13 +81,13 @@ CheckPseudoHasArgumentTraversalType GetTraversalType( const char* selector_text) const { - CSSSelectorList selector_list = + CSSSelectorList* selector_list = css_test_helpers::ParseSelectorList(selector_text); - EXPECT_EQ(selector_list.First()->GetPseudoType(), CSSSelector::kPseudoHas); + EXPECT_EQ(selector_list->First()->GetPseudoType(), CSSSelector::kPseudoHas); CheckPseudoHasArgumentContext context( - selector_list.First()->SelectorList()->First()); + selector_list->First()->SelectorList()->First()); return context.TraversalType(); } @@ -107,10 +107,10 @@ EXPECT_EQ(has_anchor_element->GetIdAttribute(), has_anchor_element_id); unsigned i = 0; - CSSSelectorList selector_list = + CSSSelectorList* selector_list = css_test_helpers::ParseSelectorList(selector_text); CheckPseudoHasArgumentContext argument_context( - selector_list.First()->SelectorList()->First()); + selector_list->First()->SelectorList()->First()); for (CheckPseudoHasArgumentTraversalIterator iterator(*has_anchor_element, argument_context); !iterator.AtEnd(); ++iterator, ++i) {
diff --git a/third_party/blink/renderer/core/css/check_pseudo_has_cache_scope_context_test.cc b/third_party/blink/renderer/core/css/check_pseudo_has_cache_scope_context_test.cc index 33e8dd2a..7b87d10 100644 --- a/third_party/blink/renderer/core/css/check_pseudo_has_cache_scope_context_test.cc +++ b/third_party/blink/renderer/core/css/check_pseudo_has_cache_scope_context_test.cc
@@ -73,16 +73,16 @@ const ExpectedResultCacheEntry (&expected_result_cache_entries)[length], unsigned expected_fast_reject_filter_cache_count, unsigned expected_bloom_filter_allocation_count) const { - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( *document, NullURL(), true /* origin_clean */, Referrer(), WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), - nullptr, selector_text, arena); - CSSSelectorList selector_list = + /*parent_rule_for_nesting=*/nullptr, nullptr, selector_text, arena); + CSSSelectorList* selector_list = CSSSelectorList::AdoptSelectorVector(selector_vector); const CSSSelector* selector = nullptr; - for (selector = selector_list.First(); + for (selector = selector_list->First(); selector && selector->GetPseudoType() != CSSSelector::kPseudoHas; selector = selector->TagHistory()) { }
diff --git a/third_party/blink/renderer/core/css/check_pseudo_has_fast_reject_filter_test.cc b/third_party/blink/renderer/core/css/check_pseudo_has_fast_reject_filter_test.cc index 7cd30ac..b3c0fa64 100644 --- a/third_party/blink/renderer/core/css/check_pseudo_has_fast_reject_filter_test.cc +++ b/third_party/blink/renderer/core/css/check_pseudo_has_fast_reject_filter_test.cc
@@ -43,13 +43,13 @@ bool CheckFastReject(CheckPseudoHasFastRejectFilter& filter, const char* selector_text) { - CSSSelectorList selector_list = + CSSSelectorList* selector_list = css_test_helpers::ParseSelectorList(selector_text); - EXPECT_EQ(selector_list.First()->GetPseudoType(), CSSSelector::kPseudoHas); + EXPECT_EQ(selector_list->First()->GetPseudoType(), CSSSelector::kPseudoHas); CheckPseudoHasArgumentContext context( - selector_list.First()->SelectorList()->First()); + selector_list->First()->SelectorList()->First()); return filter.FastReject(context.GetPseudoHasArgumentHashes()); }
diff --git a/third_party/blink/renderer/core/css/css_page_rule.cc b/third_party/blink/renderer/core/css/css_page_rule.cc index 3bc2501d..40ce868 100644 --- a/third_party/blink/renderer/core/css/css_page_rule.cc +++ b/third_party/blink/renderer/core/css/css_page_rule.cc
@@ -63,15 +63,15 @@ auto* context = MakeGarbageCollected<CSSParserContext>( ParserContext(execution_context->GetSecureContextMode())); DCHECK(context); - CSSSelectorList selector_list = CSSParser::ParsePageSelector( + CSSSelectorList* selector_list = CSSParser::ParsePageSelector( *context, parentStyleSheet() ? parentStyleSheet()->Contents() : nullptr, selector_text); - if (!selector_list.IsValid()) + if (!selector_list || !selector_list->IsValid()) return; CSSStyleSheet::RuleMutationScope mutation_scope(this); - page_rule_->WrapperAdoptSelectorList(std::move(selector_list)); + page_rule_->WrapperAdoptSelectorList(selector_list); } String CSSPageRule::cssText() const {
diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc index d8e3d1ee54..9718bfe 100644 --- a/third_party/blink/renderer/core/css/css_selector.cc +++ b/third_party/blink/renderer/core/css/css_selector.cc
@@ -29,6 +29,7 @@ #include <algorithm> #include <memory> +#include "style_rule.h" #include "third_party/blink/renderer/core/css/css_markup.h" #include "third_party/blink/renderer/core/css/css_selector_list.h" #include "third_party/blink/renderer/core/css/parser/css_parser_context.h" @@ -60,6 +61,15 @@ return list->MaximumSpecificity(); } +unsigned MaximumSpecificity(const CSSSelector* first_selector) { + unsigned specificity = 0; + for (const CSSSelector* s = first_selector; s; + s = CSSSelectorList::Next(*s)) { + specificity = std::max(specificity, s->Specificity()); + } + return specificity; +} + } // namespace struct SameSizeAsCSSSelector { @@ -77,9 +87,9 @@ // to be careful to correctly manage explicitly destruction of |value_| // followed by placement new of |rare_data_|. A straight-assignment will // compile and may kinda work, but will be undefined behavior. - auto rare_data = RareData::Create(data_.value_); + auto* rare_data = MakeGarbageCollected<RareData>(data_.value_); data_.value_.~AtomicString(); - new (&data_.rare_data_) scoped_refptr<RareData>(std::move(rare_data)); + data_.rare_data_ = rare_data; has_rare_data_ = true; } @@ -137,6 +147,12 @@ return MaximumSpecificity(SelectorList()); case kPseudoHas: return MaximumSpecificity(SelectorList()); + case kPseudoParent: + if (data_.parent_rule_ == nullptr) { + // & in a non-nesting context matches nothing. + return 0; + } + return MaximumSpecificity(data_.parent_rule_->FirstSelector()); case kPseudoRelativeAnchor: return 0; // FIXME: PseudoAny should base the specificity on the sub-selectors. @@ -322,6 +338,7 @@ case kPseudoOpen: case kPseudoOptional: case kPseudoOutOfRange: + case kPseudoParent: case kPseudoPart: case kPseudoPastCue: case kPseudoPaused: @@ -774,6 +791,7 @@ case kPseudoOpen: case kPseudoOptional: case kPseudoOutOfRange: + case kPseudoParent: case kPseudoPastCue: case kPseudoPaused: case kPseudoPictureInPicture: @@ -850,7 +868,8 @@ SerializeIdentifier(simple_selector->SerializingValue(), builder); } else if (simple_selector->match_ == kPseudoClass || simple_selector->match_ == kPagePseudoClass) { - if (simple_selector->GetPseudoType() != kPseudoState) { + if (simple_selector->GetPseudoType() != kPseudoState && + simple_selector->GetPseudoType() != kPseudoParent) { builder.Append(':'); builder.Append(simple_selector->SerializingValue()); } @@ -913,6 +932,9 @@ case kPseudoIs: case kPseudoWhere: break; + case kPseudoParent: + builder.Append('&'); + break; case kPseudoRelativeAnchor: NOTREACHED(); return nullptr; @@ -1071,10 +1093,9 @@ data_.rare_data_->argument_ = value; } -void CSSSelector::SetSelectorList( - std::unique_ptr<CSSSelectorList> selector_list) { +void CSSSelector::SetSelectorList(CSSSelectorList* selector_list) { CreateRareData(); - data_.rare_data_->selector_list_ = std::move(selector_list); + data_.rare_data_->selector_list_ = selector_list; } void CSSSelector::SetToggle(const AtomicString& name, @@ -1113,6 +1134,8 @@ case CSSSelector::kPagePseudoClass: case CSSSelector::kPseudoClass: break; + case CSSSelector::kInvalidList: + NOTREACHED(); } switch (selector->GetPseudoType()) { @@ -1337,4 +1360,30 @@ data_.rare_data_->part_names_ = std::move(part_names); } +void CSSSelector::Trace(Visitor* visitor) const { + if (match_ == kPseudoClass && pseudo_type_ == kPseudoParent) { + visitor->Trace(data_.parent_rule_); + } else if (has_rare_data_) { + visitor->Trace(data_.rare_data_); + } +} + +void CSSSelector::RareData::Trace(Visitor* visitor) const { + visitor->Trace(selector_list_); +} + +const CSSSelector* CSSSelector::SelectorListOrParent() const { + if (match_ == kPseudoClass && pseudo_type_ == kPseudoParent) { + if (ParentRule()) { + return ParentRule()->FirstSelector(); + } else { + return nullptr; + } + } else if (has_rare_data_ && data_.rare_data_->selector_list_) { + return data_.rare_data_->selector_list_->First(); + } else { + return nullptr; + } +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h index f18f62e..b6a1bb2 100644 --- a/third_party/blink/renderer/core/css/css_selector.h +++ b/third_party/blink/renderer/core/css/css_selector.h
@@ -32,13 +32,17 @@ #include "third_party/blink/renderer/core/dom/qualified_name.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/core/style/toggle_root.h" -#include "third_party/blink/renderer/platform/wtf/ref_counted.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/heap/member.h" +#include "third_party/blink/renderer/platform/heap/visitor.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin_ignore.h" namespace blink { class CSSParserContext; class CSSSelectorList; class Document; +class StyleRule; // This class represents a simple selector for a StyleRule. @@ -93,13 +97,21 @@ // [attr="value"]. // class CORE_EXPORT CSSSelector { - USING_FAST_MALLOC_WITH_TYPE_NAME(blink::CSSSelector); + // CSSSelector typically lives on Oilpan; either in StyleRule's + // AdditionalBytes, as part of CSSSelectorList, or (during parsing) + // in a HeapVector. However, it is never really allocated as a separate + // Oilpan object, so it does not inherit from GarbageCollected. + DISALLOW_NEW(); public: CSSSelector(); + + // NOTE: Will not deep-copy the selector list, if any. CSSSelector(const CSSSelector&); + CSSSelector(CSSSelector&&); explicit CSSSelector(const QualifiedName&, bool tag_is_implicit = false); + explicit CSSSelector(const StyleRule* parent_rule); ~CSSSelector(); @@ -121,6 +133,7 @@ /* how the attribute value has to match.... Default is Exact */ enum MatchType { kUnknown, + kInvalidList, // Used as a marker in CSSSelectorList. kTag, // Example: div kId, // Example: #id kClass, // example: .class @@ -228,6 +241,7 @@ kPseudoOnlyChild, kPseudoOnlyOfType, kPseudoOptional, + kPseudoParent, // Written as & (in nested rules). kPseudoPart, kPseudoPlaceholder, kPseudoPlaceholderShown, @@ -333,6 +347,12 @@ const Document* document); static PseudoId GetPseudoId(PseudoType); + // See StyleRule::Reparent(). + void Reparent(StyleRule* old_parent, StyleRule* new_parent) { + DCHECK_EQ(old_parent, ParentRule()); + data_.parent_rule_ = new_parent; + } + // Selectors are kept in an array by CSSSelectorList. The next component of // the selector is the next item in the array. const CSSSelector* TagHistory() const { @@ -341,6 +361,7 @@ static const AtomicString& UniversalSelectorAtom() { return g_null_atom; } const QualifiedName& TagQName() const; + const StyleRule* ParentRule() const; // Only valid for kPseudoParent. const AtomicString& Value() const; const AtomicString& SerializingValue() const; @@ -360,8 +381,14 @@ return has_rare_data_ ? data_.rare_data_->argument_ : g_null_atom; } const CSSSelectorList* SelectorList() const { - return has_rare_data_ ? data_.rare_data_->selector_list_.get() : nullptr; + return has_rare_data_ ? data_.rare_data_->selector_list_.Get() : nullptr; } + // Similar to SelectorList(), but also works for kPseudoParent + // (i.e., nested selectors); on &, will give the parent's selector list. + // Will return nullptr if no such list exists (e.g. if we are not a + // pseudo selector at all), or if we are a & rule that's in a non-nesting + // context (which is valid, but won't match anything). + const CSSSelector* SelectorListOrParent() const; const Vector<AtomicString>* PartNames() const { return has_rare_data_ ? data_.rare_data_->part_names_.get() : nullptr; } @@ -387,7 +414,7 @@ void SetValue(const AtomicString&, bool match_lower_case); void SetAttribute(const QualifiedName&, AttributeMatchType); void SetArgument(const AtomicString&); - void SetSelectorList(std::unique_ptr<CSSSelectorList>); + void SetSelectorList(CSSSelectorList*); void SetPartNames(std::unique_ptr<Vector<AtomicString>>); void SetToggle(const AtomicString& name, std::unique_ptr<ToggleRoot::State>&& value); @@ -455,6 +482,8 @@ // Returns true if the immediately preceeding simple selector is ::slotted. bool FollowsSlotted() const; + void Trace(Visitor* visitor) const; + static String FormatPseudoTypeForDebugging(PseudoType); private: @@ -477,10 +506,8 @@ unsigned SpecificityForPage() const; const CSSSelector* SerializeCompound(StringBuilder&) const; - struct RareData : public RefCounted<RareData> { - static scoped_refptr<RareData> Create(const AtomicString& value) { - return base::AdoptRef(new RareData(value)); - } + struct RareData : public GarbageCollected<RareData> { + explicit RareData(const AtomicString& value); ~RareData(); bool MatchNth(unsigned count); @@ -512,14 +539,13 @@ } bits_; QualifiedName attribute_; // used for attribute selector AtomicString argument_; // Used for :contains, :lang, :nth-*, :toggle() - std::unique_ptr<CSSSelectorList> - selector_list_; // Used for :-webkit-any and :not + Member<CSSSelectorList> + selector_list_; // Used :is, :not, :-webkit-any, etc. std::unique_ptr<Vector<AtomicString>> part_names_; // Used for ::part() selectors. std::unique_ptr<ToggleRoot::State> toggle_value_; // used for :toggle() - private: - RareData(const AtomicString& value); + void Trace(Visitor* visitor) const; }; void CreateRareData(); @@ -528,6 +554,8 @@ // // if (match_ == kTag) { // /* data_.tag_q_name_ is valid */ + // } else if (match_ == kPseudoClass && pseudo_type_ == kPseudoParent) { + // /* data_.parent_rule_ is valid */ // } else if (has_rare_data_) { // /* data_.rare_data_ is valid */ // } else { @@ -538,6 +566,7 @@ // fields when shifting between types tags for a DataUnion! Otherwise there // will be undefined behavior! This luckily only happens when transitioning // from a normal |value_| to a |rare_data_|. + GC_PLUGIN_IGNORE("crbug.com/1146383") union DataUnion { enum ConstructUninitializedTag { kConstructUninitialized }; explicit DataUnion(ConstructUninitializedTag) {} @@ -548,11 +577,15 @@ explicit DataUnion(const QualifiedName& tag_q_name) : tag_q_name_(tag_q_name) {} + explicit DataUnion(const StyleRule* parent_rule) + : parent_rule_(parent_rule) {} + ~DataUnion() {} AtomicString value_; QualifiedName tag_q_name_; - scoped_refptr<RareData> rare_data_; + Member<RareData> rare_data_; + Member<const StyleRule> parent_rule_; // For & (parent in nest). } data_; }; @@ -585,6 +618,7 @@ inline void CSSSelector::SetValue(const AtomicString& value, bool match_lower_case = false) { DCHECK_NE(match_, static_cast<unsigned>(kTag)); + DCHECK(!(match_ == kPseudoClass && pseudo_type_ == kPseudoParent)); if (match_lower_case && !has_rare_data_ && !IsASCIILower(value)) { CreateRareData(); } @@ -621,6 +655,16 @@ tag_is_implicit_(tag_is_implicit), data_(tag_q_name) {} +inline CSSSelector::CSSSelector(const StyleRule* parent_rule) + : relation_(kSubSelector), + match_(kPseudoClass), + pseudo_type_(kPseudoParent), + is_last_in_selector_list_(false), + is_last_in_tag_history_(false), + has_rare_data_(false), + is_for_page_(false), + data_(parent_rule) {} + inline CSSSelector::CSSSelector(const CSSSelector& o) : relation_(o.relation_), match_(o.match_), @@ -633,38 +677,32 @@ data_(DataUnion::kConstructUninitialized) { if (o.match_ == kTag) { new (&data_.tag_q_name_) QualifiedName(o.data_.tag_q_name_); + } else if (o.match_ == kPseudoClass && o.pseudo_type_ == kPseudoParent) { + data_.parent_rule_ = o.data_.parent_rule_; } else if (o.has_rare_data_) { - new (&data_.rare_data_) scoped_refptr<RareData>(o.data_.rare_data_); + data_.rare_data_ = o.data_.rare_data_; // Oilpan-managed. } else { new (&data_.value_) AtomicString(o.data_.value_); } } inline CSSSelector::CSSSelector(CSSSelector&& o) - : relation_(o.relation_), - match_(o.match_), - pseudo_type_(o.pseudo_type_), - is_last_in_selector_list_(o.is_last_in_selector_list_), - is_last_in_tag_history_(o.is_last_in_tag_history_), - has_rare_data_(o.has_rare_data_), - is_for_page_(o.is_for_page_), - tag_is_implicit_(o.tag_is_implicit_), - data_(DataUnion::kConstructUninitialized) { - if (o.match_ == kTag) { - new (&data_.tag_q_name_) QualifiedName(std::move(o.data_.tag_q_name_)); - } else if (o.has_rare_data_) { - new (&data_.rare_data_) - scoped_refptr<RareData>(std::move(o.data_.rare_data_)); - } else { - new (&data_.value_) AtomicString(std::move(o.data_.value_)); - } + : data_(DataUnion::kConstructUninitialized) { + // Seemingly Clang started generating terrible code for the obvious move + // constructor (i.e., using similar code as in the copy constructor above) + // after moving to Oilpan, copying the bits one by one. We already allow + // memcpy + memset by traits, so we can do it by ourselves, too. + memcpy(this, &o, sizeof(*this)); + memset(&o, 0, sizeof(o)); } inline CSSSelector::~CSSSelector() { if (match_ == kTag) data_.tag_q_name_.~QualifiedName(); + else if (match_ == kPseudoClass && pseudo_type_ == kPseudoParent) + ; // Nothing to do. else if (has_rare_data_) - data_.rare_data_.~scoped_refptr<RareData>(); + ; // Nothing to do. else data_.value_.~AtomicString(); } @@ -680,6 +718,12 @@ return data_.tag_q_name_; } +inline const StyleRule* CSSSelector::ParentRule() const { + DCHECK_EQ(match_, static_cast<unsigned>(kPseudoClass)); + DCHECK_EQ(pseudo_type_, static_cast<unsigned>(kPseudoParent)); + return data_.parent_rule_; +} + inline const AtomicString& CSSSelector::Value() const { DCHECK_NE(match_, static_cast<unsigned>(kTag)); if (has_rare_data_)
diff --git a/third_party/blink/renderer/core/css/css_selector_list.cc b/third_party/blink/renderer/core/css/css_selector_list.cc index 68554a8..627fe71 100644 --- a/third_party/blink/renderer/core/css/css_selector_list.cc +++ b/third_party/blink/renderer/core/css/css_selector_list.cc
@@ -32,19 +32,27 @@ namespace blink { -CSSSelectorList CSSSelectorList::Copy() const { - CSSSelectorList list; +CSSSelectorList* CSSSelectorList::Empty() { + CSSSelectorList* list = + MakeGarbageCollected<CSSSelectorList>(base::PassKey<CSSSelectorList>()); + new (list->first_selector_) CSSSelector(); + list->first_selector_[0].SetMatch(CSSSelector::kInvalidList); + DCHECK(!list->IsValid()); + return list; +} +CSSSelectorList* CSSSelectorList::Copy() const { if (!IsValid()) { - DCHECK(!list.IsValid()); - return list; + return CSSSelectorList::Empty(); } unsigned length = ComputeLength(); DCHECK(length); - list.selector_array_ = std::make_unique<CSSSelector[]>(length); + CSSSelectorList* list = MakeGarbageCollected<CSSSelectorList>( + AdditionalBytes(sizeof(CSSSelector) * (length - 1)), + base::PassKey<CSSSelectorList>()); for (unsigned i = 0; i < length; ++i) - new (&list.selector_array_[i]) CSSSelector(selector_array_[i]); + new (&list->first_selector_[i]) CSSSelector(first_selector_[i]); return list; } @@ -57,21 +65,21 @@ selector_array[selector_vector.size() - 1].SetLastInSelectorList(true); } -CSSSelectorList CSSSelectorList::AdoptSelectorVector( +CSSSelectorList* CSSSelectorList::AdoptSelectorVector( base::span<CSSSelector> selector_vector) { if (selector_vector.empty()) { - return {}; + return CSSSelectorList::Empty(); } - CSSSelectorList list; - list.selector_array_ = - std::make_unique<CSSSelector[]>(selector_vector.size()); - AdoptSelectorVector(selector_vector, list.selector_array_.get()); + CSSSelectorList* list = MakeGarbageCollected<CSSSelectorList>( + AdditionalBytes(sizeof(CSSSelector) * (selector_vector.size() - 1)), + base::PassKey<CSSSelectorList>()); + AdoptSelectorVector(selector_vector, list->first_selector_); return list; } unsigned CSSSelectorList::ComputeLength() const { - if (!selector_array_) + if (!IsValid()) return 0; const CSSSelector* current = First(); while (!current->IsLastInSelectorList()) @@ -100,4 +108,14 @@ return result.ReleaseString(); } +void CSSSelectorList::Trace(Visitor* visitor) const { + if (!IsValid()) { + return; + } + const CSSSelector* current = First(); + do { + visitor->Trace(*current); + } while (!(current++)->IsLastInSelectorList()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_selector_list.h b/third_party/blink/renderer/core/css/css_selector_list.h index c9300c1..8163a100 100644 --- a/third_party/blink/renderer/core/css/css_selector_list.h +++ b/third_party/blink/renderer/core/css/css_selector_list.h
@@ -26,9 +26,10 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SELECTOR_LIST_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_SELECTOR_LIST_H_ -#include <memory> +#include "base/types/pass_key.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_selector.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -64,44 +65,46 @@ // but not as part of a CSSSelectorList (see its class comments). // It reuses many of the exposed static member functions from CSSSelectorList // to provide a subset of its API. -class CORE_EXPORT CSSSelectorList { - USING_FAST_MALLOC(CSSSelectorList); - +class CORE_EXPORT CSSSelectorList : public GarbageCollected<CSSSelectorList> { public: - CSSSelectorList() = default; + // Constructs an empty selector list, for which IsValid() returns false. + // TODO(sesse): Consider making this a singleton. + static CSSSelectorList* Empty(); - CSSSelectorList(CSSSelectorList&& o) - : selector_array_(std::move(o.selector_array_)) {} + // Do not call; for Empty() and AdoptSelectorVector() only. + explicit CSSSelectorList(base::PassKey<CSSSelectorList>) {} - CSSSelectorList& operator=(CSSSelectorList&& o) { - DCHECK(this != &o); - selector_array_ = std::move(o.selector_array_); - return *this; + CSSSelectorList(CSSSelectorList&& o) { + memcpy(this, o.first_selector_, ComputeLength() * sizeof(CSSSelector)); } - ~CSSSelectorList() = default; - static CSSSelectorList AdoptSelectorVector( + static CSSSelectorList* AdoptSelectorVector( base::span<CSSSelector> selector_vector); static void AdoptSelectorVector(base::span<CSSSelector> selector_vector, CSSSelector* selector_array); - CSSSelectorList Copy() const; + CSSSelectorList* Copy() const; - bool IsValid() const { return !!selector_array_; } - const CSSSelector* First() const { return selector_array_.get(); } + bool IsValid() const { + return first_selector_[0].Match() != CSSSelector::kInvalidList; + } + const CSSSelector* First() const { + return IsValid() ? first_selector_ : nullptr; + } static const CSSSelector* Next(const CSSSelector&); + static CSSSelector* Next(CSSSelector&); // The CSS selector represents a single sequence of simple selectors. - bool HasOneSelector() const { return selector_array_ && !Next(*First()); } + bool HasOneSelector() const { return IsValid() && !Next(*first_selector_); } const CSSSelector& SelectorAt(wtf_size_t index) const { - DCHECK(selector_array_); - return selector_array_[index]; + DCHECK(IsValid()); + return first_selector_[index]; } wtf_size_t SelectorIndex(const CSSSelector& selector) const { - DCHECK(First()); - return static_cast<wtf_size_t>(&selector - First()); + DCHECK(IsValid()); + return static_cast<wtf_size_t>(&selector - first_selector_); } wtf_size_t IndexOfNextSelectorAfter(wtf_size_t index) const { @@ -125,16 +128,24 @@ CSSSelectorList(const CSSSelectorList&) = delete; CSSSelectorList& operator=(const CSSSelectorList&) = delete; + void Trace(Visitor* visitor) const; + private: - // End of a multipart selector is indicated by is_last_in_tag_history_ bit in - // the last item. End of the array is indicated by is_last_in_selector_list_ - // bit in the last item. - std::unique_ptr<CSSSelector[]> selector_array_; + // All of the remaining CSSSelector objects are allocated on + // AdditionalBytes, and thus live immediately after this object. The length + // is not stored explicitly anywhere: End of a multipart selector is + // indicated by is_last_in_tag_history_ bit in the last item. End of the + // array is indicated by is_last_in_selector_list_ bit in the last item. + CSSSelector first_selector_[1]; }; inline const CSSSelector* CSSSelectorList::Next(const CSSSelector& current) { + return Next(const_cast<CSSSelector&>(current)); +} + +inline CSSSelector* CSSSelectorList::Next(CSSSelector& current) { // Skip subparts of compound selectors. - const CSSSelector* last = ¤t; + CSSSelector* last = ¤t; while (!last->IsLastInTagHistory()) last++; return last->IsLastInSelectorList() ? nullptr : last + 1;
diff --git a/third_party/blink/renderer/core/css/css_selector_test.cc b/third_party/blink/renderer/core/css/css_selector_test.cc index f9bb0dfc..d1c936c 100644 --- a/third_party/blink/renderer/core/css/css_selector_test.cc +++ b/third_party/blink/renderer/core/css/css_selector_test.cc
@@ -16,15 +16,15 @@ namespace { unsigned Specificity(const String& selector_text) { - CSSSelectorList selector_list = + CSSSelectorList* selector_list = css_test_helpers::ParseSelectorList(selector_text); - return selector_list.First()->Specificity(); + return selector_list->First()->Specificity(); } bool HasLinkOrVisited(const String& selector_text) { - CSSSelectorList selector_list = + CSSSelectorList* selector_list = css_test_helpers::ParseSelectorList(selector_text); - return selector_list.First()->HasLinkOrVisited(); + return selector_list->First()->HasLinkOrVisited(); } } // namespace @@ -217,21 +217,21 @@ } TEST(CSSSelector, CopyInvalidList) { - CSSSelectorList list; - EXPECT_FALSE(list.IsValid()); - EXPECT_FALSE(list.Copy().IsValid()); + CSSSelectorList* list = CSSSelectorList::Empty(); + EXPECT_FALSE(list->IsValid()); + EXPECT_FALSE(list->Copy()->IsValid()); } TEST(CSSSelector, CopyValidList) { - CSSSelectorList list = css_test_helpers::ParseSelectorList(".a"); - EXPECT_TRUE(list.IsValid()); - EXPECT_TRUE(list.Copy().IsValid()); + CSSSelectorList* list = css_test_helpers::ParseSelectorList(".a"); + EXPECT_TRUE(list->IsValid()); + EXPECT_TRUE(list->Copy()->IsValid()); } TEST(CSSSelector, FirstInInvalidList) { - CSSSelectorList list; - EXPECT_FALSE(list.IsValid()); - EXPECT_FALSE(list.First()); + CSSSelectorList* list = CSSSelectorList::Empty(); + EXPECT_FALSE(list->IsValid()); + EXPECT_FALSE(list->First()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_selector_watch.cc b/third_party/blink/renderer/core/css/css_selector_watch.cc index 95a2ebd..9d46476f 100644 --- a/third_party/blink/renderer/core/css/css_selector_watch.cc +++ b/third_party/blink/renderer/core/css/css_selector_watch.cc
@@ -154,10 +154,10 @@ // UA stylesheets always parse in the insecure context mode. auto* context = MakeGarbageCollected<CSSParserContext>( kUASheetMode, SecureContextMode::kInsecureContext); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (const auto& selector : selectors) { - base::span<CSSSelector> selector_vector = - CSSParser::ParseSelector(context, nullptr, selector, arena); + base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( + context, /*parent_rule_for_nesting=*/nullptr, nullptr, selector, arena); if (selector_vector.empty()) continue;
diff --git a/third_party/blink/renderer/core/css/css_style_rule.cc b/third_party/blink/renderer/core/css/css_style_rule.cc index a4b8466..eb89c74 100644 --- a/third_party/blink/renderer/core/css/css_style_rule.cc +++ b/third_party/blink/renderer/core/css/css_style_rule.cc
@@ -26,7 +26,6 @@ #include "third_party/blink/renderer/core/css/css_style_sheet.h" #include "third_party/blink/renderer/core/css/cssom/declared_style_property_map.h" #include "third_party/blink/renderer/core/css/parser/css_parser.h" -#include "third_party/blink/renderer/core/css/parser/css_selector_parser.h" #include "third_party/blink/renderer/core/css/style_rule.h" #include "third_party/blink/renderer/core/css/style_rule_css_style_declaration.h" #include "third_party/blink/renderer/core/css/style_sheet_contents.h" @@ -84,9 +83,11 @@ ParserContext(execution_context->GetSecureContextMode())); StyleSheetContents* parent_contents = parentStyleSheet() ? parentStyleSheet()->Contents() : nullptr; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = - CSSParser::ParseSelector(context, parent_contents, selector_text, arena); + CSSParser::ParseSelector(context, + /*parent_rule_for_nesting=*/nullptr, + parent_contents, selector_text, arena); if (selector_vector.empty()) return; @@ -96,6 +97,15 @@ position_hint_ = parent_contents->ReplaceRuleIfExists( style_rule_, new_style_rule, position_hint_); } + + // If we have any nested rules, update their parent selector(s) to point to + // our newly created StyleRule instead of the old one. + if (style_rule_->ChildRules()) { + for (StyleRule* child_rule : *style_rule_->ChildRules()) { + child_rule->Reparent(style_rule_, new_style_rule); + } + } + style_rule_ = new_style_rule; if (HasCachedSelectorText()) {
diff --git a/third_party/blink/renderer/core/css/css_style_sheet.cc b/third_party/blink/renderer/core/css/css_style_sheet.cc index 6b94d36..703f2f4 100644 --- a/third_party/blink/renderer/core/css/css_style_sheet.cc +++ b/third_party/blink/renderer/core/css/css_style_sheet.cc
@@ -369,6 +369,8 @@ } const auto* context = MakeGarbageCollected<CSSParserContext>(contents_->ParserContext(), this); + + // TODO(sesse): Add CSSOM support for nested rules. StyleRuleBase* rule = CSSParser::ParseRule(context, contents_.Get(), rule_string);
diff --git a/third_party/blink/renderer/core/css/css_test_helpers.cc b/third_party/blink/renderer/core/css/css_test_helpers.cc index 19864fc9..49c591d1 100644 --- a/third_party/blink/renderer/core/css/css_test_helpers.cc +++ b/third_party/blink/renderer/core/css/css_test_helpers.cc
@@ -215,16 +215,16 @@ /* is_animation_tainted */ false); } -CSSSelectorList ParseSelectorList(const String& string) { +CSSSelectorList* ParseSelectorList(const String& string) { auto* context = MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext); auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); CSSTokenizer tokenizer(string); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - Vector<CSSSelector> arena; - base::span<CSSSelector> vector = - CSSSelectorParser::ParseSelector(range, context, sheet, arena); + HeapVector<CSSSelector> arena; + base::span<CSSSelector> vector = CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); return CSSSelectorList::AdoptSelectorVector(vector); }
diff --git a/third_party/blink/renderer/core/css/css_test_helpers.h b/third_party/blink/renderer/core/css/css_test_helpers.h index 04b050e..835fce0 100644 --- a/third_party/blink/renderer/core/css/css_test_helpers.h +++ b/third_party/blink/renderer/core/css/css_test_helpers.h
@@ -91,7 +91,7 @@ // https://drafts.css-houdini.org/css-properties-values-api-1/#syntax-strings const CSSValue* ParseValue(Document&, String syntax, String value); -CSSSelectorList ParseSelectorList(const String&); +CSSSelectorList* ParseSelectorList(const String&); } // namespace css_test_helpers } // namespace blink
diff --git a/third_party/blink/renderer/core/css/element_rule_collector.h b/third_party/blink/renderer/core/css/element_rule_collector.h index f8109b32..c247d7e 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector.h +++ b/third_party/blink/renderer/core/css/element_rule_collector.h
@@ -98,6 +98,8 @@ Member<const CSSStyleSheet> parent_style_sheet_; friend class ElementRuleCollector; + FRIEND_TEST_ALL_PREFIXES(ElementRuleCollectorTest, DirectNesting); + FRIEND_TEST_ALL_PREFIXES(ElementRuleCollectorTest, AtNest); }; } // namespace blink @@ -180,6 +182,10 @@ // aggregated per-rule for the entire style recalc pass. static void DumpAndClearRulesPerfMap(); + const HeapVector<MatchedRule, 32>& MatchedRulesForTest() const { + return matched_rules_; + } + // Temporarily swap the StyleRecalcContext with one which points to the // closest query container for matching ::slotted rules for a given slot. class SlottedRulesScope {
diff --git a/third_party/blink/renderer/core/css/element_rule_collector_test.cc b/third_party/blink/renderer/core/css/element_rule_collector_test.cc index 3ab86b9..54d1aa9c 100644 --- a/third_party/blink/renderer/core/css/element_rule_collector_test.cc +++ b/third_party/blink/renderer/core/css/element_rule_collector_test.cc
@@ -22,6 +22,17 @@ namespace blink { +static RuleSet* RuleSetFromSingleRule(Document& document, const String& text) { + auto* style_rule = + DynamicTo<StyleRule>(css_test_helpers::ParseRule(document, text)); + if (style_rule == nullptr) { + return nullptr; + } + RuleSet* rule_set = MakeGarbageCollected<RuleSet>(); + rule_set->AddStyleRule(style_rule, kRuleHasNoSpecialState); + return rule_set; +} + class ElementRuleCollectorTest : public PageTestBase { public: EInsideLink InsideLink(Element* element) { @@ -49,12 +60,9 @@ result, style.get(), InsideLink(element)); String rule = selector + " { color: green }"; - auto* style_rule = - DynamicTo<StyleRule>(css_test_helpers::ParseRule(GetDocument(), rule)); - if (!style_rule) + RuleSet* rule_set = RuleSetFromSingleRule(GetDocument(), rule); + if (!rule_set) return absl::nullopt; - RuleSet* rule_set = MakeGarbageCollected<RuleSet>(); - rule_set->AddStyleRule(style_rule, kRuleHasNoSpecialState); MatchRequest request(rule_set, scope); @@ -74,6 +82,20 @@ link_match_type |= matched_propeties.types_.link_match_type; return link_match_type; } + + Vector<MatchedRule> GetAllMatchedRules(Element* element, RuleSet* rule_set) { + ElementResolveContext context(*element); + SelectorFilter filter; + MatchResult result; + auto style = GetDocument().GetStyleResolver().CreateComputedStyle(); + ElementRuleCollector collector(context, StyleRecalcContext(), filter, + result, style.get(), InsideLink(element)); + + MatchRequest request(rule_set, {}); + + collector.CollectMatchingRules(request); + return Vector<MatchedRule>{collector.MatchedRulesForTest()}; + } }; TEST_F(ElementRuleCollectorTest, LinkMatchType) { @@ -337,4 +359,91 @@ } } +TEST_F(ElementRuleCollectorTest, DirectNesting) { + SetBodyInnerHTML(R"HTML( + <div id="foo" class="a"> + <div id="bar" class="b"> + <div id="baz" class="b"> + </div> + </div> + </div> + )HTML"); + String rule = R"CSS( + #foo { + color: green; + &.a { color: red; } + & > .b { color: navy; } + } + )CSS"; + RuleSet* rule_set = RuleSetFromSingleRule(GetDocument(), rule); + ASSERT_NE(nullptr, rule_set); + + Element* foo = GetDocument().getElementById("foo"); + Element* bar = GetDocument().getElementById("bar"); + Element* baz = GetDocument().getElementById("baz"); + ASSERT_NE(nullptr, foo); + ASSERT_NE(nullptr, bar); + ASSERT_NE(nullptr, baz); + + Vector<MatchedRule> foo_rules = GetAllMatchedRules(foo, rule_set); + ASSERT_EQ(2u, foo_rules.size()); + EXPECT_EQ("#foo", foo_rules[0].GetRuleData()->Selector().SelectorText()); + EXPECT_EQ("&.a", foo_rules[1].GetRuleData()->Selector().SelectorText()); + + Vector<MatchedRule> bar_rules = GetAllMatchedRules(bar, rule_set); + ASSERT_EQ(1u, bar_rules.size()); + EXPECT_EQ("& > .b", bar_rules[0].GetRuleData()->Selector().SelectorText()); + + Vector<MatchedRule> baz_rules = GetAllMatchedRules(baz, rule_set); + ASSERT_EQ(0u, baz_rules.size()); +} + +TEST_F(ElementRuleCollectorTest, AtNest) { + SetBodyInnerHTML(R"HTML( + <div id="foo"></div> + <div id="bar"></div> + )HTML"); + String rule = R"CSS( + #foo { + color: green; + @nest :not(&) { color: red; } + } + )CSS"; + RuleSet* rule_set = RuleSetFromSingleRule(GetDocument(), rule); + ASSERT_NE(nullptr, rule_set); + + Element* foo = GetDocument().getElementById("foo"); + Element* bar = GetDocument().getElementById("bar"); + ASSERT_NE(nullptr, foo); + ASSERT_NE(nullptr, bar); + + Vector<MatchedRule> foo_rules = GetAllMatchedRules(foo, rule_set); + ASSERT_EQ(1u, foo_rules.size()); + EXPECT_EQ("#foo", foo_rules[0].GetRuleData()->Selector().SelectorText()); + + Vector<MatchedRule> bar_rules = GetAllMatchedRules(bar, rule_set); + ASSERT_EQ(1u, bar_rules.size()); + // FIXME(sesse): In the current spec, this should have been @nest :not(&), + // but we don't serialize the @nest yet. This part of the spec is somewhat + // in flux, so update when it settles. + EXPECT_EQ(":not(&)", bar_rules[0].GetRuleData()->Selector().SelectorText()); +} + +TEST_F(ElementRuleCollectorTest, NestingAtToplevelMatchesNothing) { + SetBodyInnerHTML(R"HTML( + <div id="foo"></div> + )HTML"); + String rule = R"CSS( + & { color: red; } + )CSS"; + RuleSet* rule_set = RuleSetFromSingleRule(GetDocument(), rule); + ASSERT_NE(nullptr, rule_set); + + Element* foo = GetDocument().getElementById("foo"); + ASSERT_NE(nullptr, foo); + + Vector<MatchedRule> foo_rules = GetAllMatchedRules(foo, rule_set); + EXPECT_EQ(0u, foo_rules.size()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/parser/css_at_rule_id.cc b/third_party/blink/renderer/core/css/parser/css_at_rule_id.cc index a32b0f0..420565a 100644 --- a/third_party/blink/renderer/core/css/parser/css_at_rule_id.cc +++ b/third_party/blink/renderer/core/css/parser/css_at_rule_id.cc
@@ -68,6 +68,8 @@ } if (EqualIgnoringASCIICase(name, "-webkit-keyframes")) return CSSAtRuleID::kCSSAtRuleWebkitKeyframes; + if (EqualIgnoringASCIICase(name, "nest")) + return CSSAtRuleID::kCSSAtRuleNest; return CSSAtRuleID::kCSSAtRuleInvalid; } @@ -111,6 +113,8 @@ return absl::nullopt; case CSSAtRuleID::kCSSAtRuleWebkitKeyframes: return WebFeature::kCSSAtRuleWebkitKeyframes; + case CSSAtRuleID::kCSSAtRuleNest: + return WebFeature::kCSSNesting; case CSSAtRuleID::kCSSAtRuleInvalid: NOTREACHED(); return absl::nullopt;
diff --git a/third_party/blink/renderer/core/css/parser/css_at_rule_id.h b/third_party/blink/renderer/core/css/parser/css_at_rule_id.h index f1aafe6..d18aab6 100644 --- a/third_party/blink/renderer/core/css/parser/css_at_rule_id.h +++ b/third_party/blink/renderer/core/css/parser/css_at_rule_id.h
@@ -31,6 +31,7 @@ kCSSAtRuleSupports, kCSSAtRuleTry, kCSSAtRuleWebkitKeyframes, + kCSSAtRuleNest, }; CSSAtRuleID CssAtRuleID(StringView name);
diff --git a/third_party/blink/renderer/core/css/parser/css_lazy_parsing_test.cc b/third_party/blink/renderer/core/css/parser/css_lazy_parsing_test.cc index 7f763b2..1b6341c 100644 --- a/third_party/blink/renderer/core/css/parser/css_lazy_parsing_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_lazy_parsing_test.cc
@@ -130,4 +130,18 @@ UseCounterImpl::CSSPropertyType::kDefault)); } +TEST_F(CSSLazyParsingTest, NoLazyParsingForNestedRules) { + auto* context = MakeGarbageCollected<CSSParserContext>( + kHTMLStandardMode, SecureContextMode::kInsecureContext); + auto* style_sheet = MakeGarbageCollected<StyleSheetContents>(context); + + String sheet_text = "body { & div { color: red; } }"; + CSSParser::ParseSheet(context, style_sheet, sheet_text, + CSSDeferPropertyParsing::kYes); + StyleRule* rule = RuleAt(style_sheet, 0); + EXPECT_TRUE(HasParsedProperties(rule)); + rule->Properties(); + EXPECT_TRUE(HasParsedProperties(rule)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.cc b/third_party/blink/renderer/core/css/parser/css_parser.cc index 6549a9d..5f59feb 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser.cc
@@ -45,16 +45,18 @@ base::span<CSSSelector> CSSParser::ParseSelector( const CSSParserContext* context, + StyleRule* parent_rule_for_nesting, StyleSheetContents* style_sheet_contents, const String& selector, - Vector<CSSSelector>& arena) { + HeapVector<CSSSelector>& arena) { CSSTokenizer tokenizer(selector); const auto tokens = tokenizer.TokenizeToEOF(); return CSSSelectorParser::ParseSelector(CSSParserTokenRange(tokens), context, + parent_rule_for_nesting, style_sheet_contents, arena); } -CSSSelectorList CSSParser::ParsePageSelector( +CSSSelectorList* CSSParser::ParsePageSelector( const CSSParserContext& context, StyleSheetContents* style_sheet_contents, const String& selector) {
diff --git a/third_party/blink/renderer/core/css/parser/css_parser.h b/third_party/blink/renderer/core/css/parser/css_parser.h index 46a66c8a7..8b60838 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser.h +++ b/third_party/blink/renderer/core/css/parser/css_parser.h
@@ -22,6 +22,7 @@ class Element; class ExecutionContext; class ImmutableCSSPropertyValueSet; +class StyleRule; class StyleRuleBase; class StyleRuleKeyframe; class StyleSheetContents; @@ -50,13 +51,14 @@ std::unique_ptr<CachedCSSTokenizer> tokenizer = nullptr); // See CSSSelectorParser for lifetime of the returned value. static base::span<CSSSelector> ParseSelector( - const CSSParserContext* context, - StyleSheetContents* style_sheet_contents, - const String& selector, - Vector<CSSSelector>& arena); - static CSSSelectorList ParsePageSelector(const CSSParserContext&, - StyleSheetContents*, - const String&); + const CSSParserContext*, + StyleRule* parent_rule_for_nesting, + StyleSheetContents*, + const String&, + HeapVector<CSSSelector>& arena); + static CSSSelectorList* ParsePageSelector(const CSSParserContext&, + StyleSheetContents*, + const String&); static bool ParseDeclarationList(const CSSParserContext*, MutableCSSPropertyValueSet*, const String&);
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc index 19ab9b3..7e1679d3 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -44,6 +44,8 @@ #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" +using std::swap; + namespace blink { namespace { @@ -217,7 +219,8 @@ CSSParserImpl parser(context, document.ElementSheet().Contents()); CSSTokenizer tokenizer(string); CSSParserTokenStream stream(tokenizer); - parser.ConsumeDeclarationList(stream, StyleRule::kStyle); + parser.ConsumeDeclarationList(stream, StyleRule::kStyle, + /*parent_rule_for_nesting=*/nullptr); return CreateCSSPropertyValueSet(parser.parsed_properties_, mode); } @@ -230,7 +233,8 @@ CSSParserImpl parser(context); CSSTokenizer tokenizer(string); CSSParserTokenStream stream(tokenizer); - parser.ConsumeDeclarationList(stream, StyleRule::kStyle); + parser.ConsumeDeclarationList(stream, StyleRule::kStyle, + /*parent_rule_for_nesting=*/nullptr); return CreateCSSPropertyValueSet(parser.parsed_properties_, parser_mode); } @@ -242,7 +246,9 @@ StyleRule::RuleType rule_type = RuleTypeForMutableDeclaration(declaration); CSSTokenizer tokenizer(string); CSSParserTokenStream stream(tokenizer); - parser.ConsumeDeclarationList(stream, rule_type); + // See class comment for why parent_rule_for_nesting == nullptr. + parser.ConsumeDeclarationList(stream, rule_type, + /*parent_rule_for_nesting=*/nullptr); if (parser.parsed_properties_.empty()) return false; @@ -340,7 +346,7 @@ } // static -CSSSelectorList CSSParserImpl::ParsePageSelector( +CSSSelectorList* CSSParserImpl::ParsePageSelector( CSSParserTokenRange range, StyleSheetContents* style_sheet, const CSSParserContext& context) { @@ -354,15 +360,15 @@ if (range.Peek().GetType() == kColonToken) { range.Consume(); if (range.Peek().GetType() != kIdentToken) - return CSSSelectorList(); + return nullptr; pseudo = range.Consume().Value().ToAtomicString(); } range.ConsumeWhitespace(); if (!range.AtEnd()) - return CSSSelectorList(); // Parse error; extra tokens in @page selector + return nullptr; // Parse error; extra tokens in @page selector - Vector<CSSSelector> selectors; + HeapVector<CSSSelector> selectors; if (!type_selector.IsNull()) { selectors.push_back( CSSSelector(QualifiedName(g_null_atom, type_selector, g_star_atom))); @@ -372,7 +378,7 @@ selector.SetMatch(CSSSelector::kPagePseudoClass); selector.UpdatePseudoPage(pseudo.LowerASCII(), context.GetDocument()); if (selector.GetPseudoType() == CSSSelector::kPseudoUnknown) - return CSSSelectorList(); + return nullptr; if (selectors.size() != 0) { selectors[0].SetLastInTagHistory(false); } @@ -418,7 +424,8 @@ observer.StartRuleHeader(StyleRule::kStyle, 0); observer.EndRuleHeader(1); CSSParserTokenStream stream(tokenizer); - parser.ConsumeDeclarationList(stream, StyleRule::kStyle); + parser.ConsumeDeclarationList(stream, StyleRule::kStyle, + /*parent_rule_for_nesting=*/nullptr); } void CSSParserImpl::ParseStyleSheetForInspector(const String& string, @@ -442,11 +449,18 @@ const String& string, wtf_size_t offset, const CSSParserContext* context) { + // NOTE: Lazy parsing does not support nested rules (it happens + // only after matching, which means that we cannot insert child rules + // we encounter during parsing -- we never match against them), + // so parent_rule_for_nesting is always nullptr here. The parser + // explicitly makes sure we do not invoke lazy parsing for rules + // with child rules in them. CSSTokenizer tokenizer(string, offset); CSSParserTokenStream stream(tokenizer); CSSParserTokenStream::BlockGuard guard(stream); CSSParserImpl parser(context); - parser.ConsumeDeclarationList(stream, StyleRule::kStyle); + parser.ConsumeDeclarationList(stream, StyleRule::kStyle, + /*parent_rule_for_nesting=*/nullptr); return CreateCSSPropertyValueSet(parser.parsed_properties_, context->Mode()); } @@ -651,6 +665,7 @@ case CSSAtRuleID::kCSSAtRuleNamespace: case CSSAtRuleID::kCSSAtRuleScrollTimeline: case CSSAtRuleID::kCSSAtRuleTry: + case CSSAtRuleID::kCSSAtRuleNest: ConsumeErroneousAtRule(stream); return nullptr; // Parse error, unrecognised or not-allowed at-rule } @@ -661,7 +676,7 @@ CSSParserTokenStream& stream, AllowedRulesType allowed_rules) { if (allowed_rules <= kRegularRules) { - return ConsumeStyleRule(stream); + return ConsumeStyleRule(stream, /*parent_rule_for_nesting=*/nullptr); } if (allowed_rules == kKeyframeRules) { @@ -700,7 +715,8 @@ CSSParserTokenStream::BlockGuard guard(stream); if (prelude_invalid) return nullptr; - ConsumeDeclarationList(stream, StyleRule::kFontFace); + ConsumeDeclarationList(stream, StyleRule::kFontFace, + /*parent_rule_for_nesting=*/nullptr); return MakeGarbageCollected<StyleRuleFontFace>( CreateCSSPropertyValueSet(parsed_properties_, kCSSFontFaceRuleMode)); } @@ -917,7 +933,8 @@ if (style_sheet_) style_sheet_->SetHasFontFaceRule(); - ConsumeDeclarationList(stream, StyleRule::kFontFace); + ConsumeDeclarationList(stream, StyleRule::kFontFace, + /*parent_rule_for_nesting=*/nullptr); return MakeGarbageCollected<StyleRuleFontFace>( CreateCSSPropertyValueSet(parsed_properties_, kCSSFontFaceRuleMode)); } @@ -975,9 +992,9 @@ return nullptr; CSSParserTokenStream::BlockGuard guard(stream); - CSSSelectorList selector_list = + CSSSelectorList* selector_list = ParsePageSelector(prelude, style_sheet_, *context_); - if (!selector_list.IsValid()) + if (!selector_list || !selector_list->IsValid()) return nullptr; // Parse error, invalid @page selector if (observer_) { @@ -985,10 +1002,11 @@ observer_->EndRuleHeader(prelude_offset_end); } - ConsumeDeclarationList(stream, StyleRule::kStyle); + ConsumeDeclarationList(stream, StyleRule::kStyle, + /*parent_rule_for_nesting=*/nullptr); return MakeGarbageCollected<StyleRulePage>( - std::move(selector_list), + selector_list, CreateCSSPropertyValueSet(parsed_properties_, context_->Mode())); } @@ -1013,7 +1031,8 @@ observer_->EndRuleHeader(prelude_offset_end); } - ConsumeDeclarationList(stream, StyleRule::kProperty); + ConsumeDeclarationList(stream, StyleRule::kProperty, + /*parent_rule_for_nesting=*/nullptr); return MakeGarbageCollected<StyleRuleProperty>( name, CreateCSSPropertyValueSet(parsed_properties_, context_->Mode())); } @@ -1037,7 +1056,8 @@ observer_->EndRuleHeader(prelude_offset_end); } - ConsumeDeclarationList(stream, StyleRule::kCounterStyle); + ConsumeDeclarationList(stream, StyleRule::kCounterStyle, + /*parent_rule_for_nesting=*/nullptr); return MakeGarbageCollected<StyleRuleCounterStyle>( name, CreateCSSPropertyValueSet(parsed_properties_, context_->Mode())); } @@ -1069,7 +1089,8 @@ observer_->EndRuleHeader(prelude_offset_end); } - ConsumeDeclarationList(stream, StyleRule::kFontPaletteValues); + ConsumeDeclarationList(stream, StyleRule::kFontPaletteValues, + /*parent_rule_for_nesting=*/nullptr); return MakeGarbageCollected<StyleRuleFontPaletteValues>( name, CreateCSSPropertyValueSet(parsed_properties_, context_->Mode())); } @@ -1276,7 +1297,8 @@ observer_->EndRuleHeader(prelude_offset_end); } - ConsumeDeclarationList(stream, StyleRule::kTry); + ConsumeDeclarationList(stream, StyleRule::kTry, + /*parent_rule_for_nesting=*/nullptr); return MakeGarbageCollected<StyleRuleTry>( CreateCSSPropertyValueSet(parsed_properties_, context_->Mode())); } @@ -1294,21 +1316,52 @@ observer_->EndRuleHeader(prelude_offset.end); } - ConsumeDeclarationList(block, StyleRule::kKeyframe); + ConsumeDeclarationList(block, StyleRule::kKeyframe, + /*parent_rule_for_nesting=*/nullptr); return MakeGarbageCollected<StyleRuleKeyframe>( std::move(key_list), CreateCSSPropertyValueSet(parsed_properties_, kCSSKeyframeRuleMode)); } -StyleRule* CSSParserImpl::ConsumeStyleRule(CSSParserTokenStream& stream) { - DCHECK_EQ(0u, arena_.size()); +// A (hopefully) fast check for whether the given declaration block could +// contain nested CSS rules. All of these have to involve { in some shape +// or form, so we simply check for the existence of that. (It means we will +// have false positives for e.g. { within comments or strings, but this +// only means we will turn off lazy parsing for that rule, nothing worse.) +// This will work even for UTF-16, although with some more false positives +// with certain Unicode characters such as U+017E (LATIN SMALL LETTER Z +// WITH CARON). This is, again, not a big problem for us. +static bool MayContainNestedRules(const String& text, + wtf_size_t offset, + wtf_size_t length) { + DCHECK_GE(length, 2u); // {} is the shortest possible block. + + size_t char_size = text.Is8Bit() ? sizeof(LChar) : sizeof(UChar); + + // Strip away the outer {} pair (the { would always give us a false positive). + DCHECK_EQ(text[offset], '{'); + DCHECK_EQ(text[offset + length - 1], '}'); + ++offset; + length -= 2; + + return memchr( + reinterpret_cast<const char*>(text.Bytes()) + offset * char_size, + '{', length * char_size) != nullptr; +} + +StyleRule* CSSParserImpl::ConsumeStyleRule(CSSParserTokenStream& stream, + StyleRule* parent_rule_for_nesting) { + if (parent_rule_for_nesting == nullptr) { + DCHECK_EQ(0u, arena_.size()); + } if (observer_) observer_->StartRuleHeader(StyleRule::kStyle, stream.LookAheadOffset()); // Parse the prelude of the style rule base::span<CSSSelector> selector_vector = CSSSelectorParser::ConsumeSelector( - stream, context_, style_sheet_, observer_, arena_); + stream, context_, parent_rule_for_nesting, style_sheet_, observer_, + arena_); if (selector_vector.empty()) { // Read the rest of the prelude if there was an error @@ -1332,30 +1385,62 @@ if (selector_vector.empty()) { // Parse error, invalid selector list. - arena_.resize(0); + if (parent_rule_for_nesting == nullptr) { + arena_.resize(0); + } return nullptr; } // TODO(csharrison): How should we lazily parse css that needs the observer? if (!observer_ && lazy_state_) { DCHECK(style_sheet_); + + wtf_size_t block_start_offset = stream.Offset() - 1; // - 1 for the {. + guard.SkipToEndOfBlock(); + wtf_size_t block_length = stream.Offset() - block_start_offset; + + // Lazy parsing cannot deal with nested rules. We make a very quick check + // to see if there could possibly be any in there; if so, we need to go back + // to normal (non-lazy) parsing. If that happens, we've wasted some work; + // specifically, the SkipToEndOfBlock(), and potentially that we cannot + // use the CachedCSSTokenizer if that would otherwise be in use. + if (RuntimeEnabledFeatures::CSSNestingEnabled() && + MayContainNestedRules(lazy_state_->SheetText(), block_start_offset, + block_length)) { + CSSTokenizer tokenizer(lazy_state_->SheetText(), block_start_offset); + CSSParserTokenStream block_stream(tokenizer); + return ConsumeStyleRuleContents(std::move(selector_vector), block_stream); + } + StyleRule* style_rule = StyleRule::Create( selector_vector, MakeGarbageCollected<CSSLazyPropertyParserImpl>( - stream.Offset() - 1, lazy_state_)); - arena_.resize(0); // See class comment on CSSSelectorParser. + block_start_offset, lazy_state_)); + if (parent_rule_for_nesting == nullptr) { + arena_.resize(0); // See class comment on CSSSelectorParser. + } return style_rule; } - ConsumeDeclarationList(stream, StyleRule::kStyle); + StyleRule* style_rule = + ConsumeStyleRuleContents(std::move(selector_vector), stream); + if (parent_rule_for_nesting == nullptr) { + arena_.resize(0); // See class comment on CSSSelectorParser. + } + return style_rule; +} - StyleRule* style_rule = StyleRule::Create( - selector_vector, +StyleRule* CSSParserImpl::ConsumeStyleRuleContents( + base::span<CSSSelector> selector_vector, + CSSParserTokenStream& stream) { + StyleRule* style_rule = StyleRule::Create(selector_vector); + ConsumeDeclarationList(stream, StyleRule::kStyle, style_rule); + style_rule->SetProperties( CreateCSSPropertyValueSet(parsed_properties_, context_->Mode())); - arena_.resize(0); // See class comment on CSSSelectorParser. return style_rule; } void CSSParserImpl::ConsumeDeclarationList(CSSParserTokenStream& stream, - StyleRule::RuleType rule_type) { + StyleRule::RuleType rule_type, + StyleRule* parent_rule_for_nesting) { DCHECK(parsed_properties_.empty()); bool is_observer_rule_type = @@ -1391,9 +1476,6 @@ case kSemicolonToken: stream.UncheckedConsume(); break; - case kAtKeywordToken: - ConsumeErroneousAtRule(stream); - break; case kIdentToken: { { CSSParserTokenStream::Boundary boundary(stream, kSemicolonToken); @@ -1408,6 +1490,32 @@ break; } + case kAtKeywordToken: + if (RuntimeEnabledFeatures::CSSNestingEnabled()) { + // TODO(sesse): The current spec allows nested conditional groups + // (such as @media, @supports, @container) here. We don't support + // them yet. See https://github.com/w3c/csswg-drafts/issues/7830. + CSSParserToken name_token = stream.ConsumeIncludingWhitespace(); + const StringView name = name_token.Value(); + const CSSAtRuleID id = CssAtRuleID(name); + if (id == CSSAtRuleID::kCSSAtRuleNest) { + ConsumeNestedRule(stream, parent_rule_for_nesting); + break; + } + } + // Consume the remainder of the declaration (if any) for error + // recovery. + // TODO(sesse): This is largely untested; we need WPT tests + // for error recovery, once the syntax has settled. + ConsumeErroneousAtRule(stream); + break; + case kDelimiterToken: + if (RuntimeEnabledFeatures::CSSNestingEnabled() && + stream.UncheckedPeek().Delimiter() == '&') { + ConsumeNestedRule(stream, parent_rule_for_nesting); + break; + } + [[fallthrough]]; default: while (!stream.UncheckedAtEnd() && stream.UncheckedPeek().GetType() != kSemicolonToken) { @@ -1425,6 +1533,26 @@ observer_->EndRuleBody(stream.LookAheadOffset()); } +void CSSParserImpl::ConsumeNestedRule(CSSParserTokenStream& stream, + StyleRule* parent_rule_for_nesting) { + DCHECK(RuntimeEnabledFeatures::CSSNestingEnabled()); + + // A nested style rule. Recurse into the parser; + // we need to move the parsed properties out of the way + // while we're parsing the child rule, though. + // TODO(sesse): The spec says that any properties after + // a nested rule should be ignored. We don't support this + // yet. See https://github.com/w3c/csswg-drafts/issues/7501. + HeapVector<CSSPropertyValue, 64> outer_parsed_properties; + swap(parsed_properties_, outer_parsed_properties); + StyleRule* child = ConsumeStyleRule(stream, parent_rule_for_nesting); + if (child && parent_rule_for_nesting) { + parent_rule_for_nesting->AddChildRule(child); + } + parsed_properties_ = std::move(outer_parsed_properties); + context_->Count(WebFeature::kCSSNesting); +} + void CSSParserImpl::ConsumeDeclaration(CSSParserTokenStream& stream, StyleRule::RuleType rule_type) { const wtf_size_t decl_offset_start = stream.Offset();
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.h b/third_party/blink/renderer/core/css/parser/css_parser_impl.h index e28ff21..c6e5444d 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_impl.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.h
@@ -108,6 +108,9 @@ Element*); static ImmutableCSSPropertyValueSet* ParseInlineStyleDeclaration(const String&, CSSParserMode, SecureContextMode); + // NOTE: This function can currently only be used to parse a + // declaration list with no nested rules, not a full style rule + // (it is only used for things like inline style). static bool ParseDeclarationList(MutableCSSPropertyValueSet*, const String&, const CSSParserContext*); @@ -122,9 +125,9 @@ CSSDeferPropertyParsing = CSSDeferPropertyParsing::kNo, bool allow_import_rules = true, std::unique_ptr<CachedCSSTokenizer> tokenizer = nullptr); - static CSSSelectorList ParsePageSelector(CSSParserTokenRange, - StyleSheetContents*, - const CSSParserContext& context); + static CSSSelectorList* ParsePageSelector(CSSParserTokenRange, + StyleSheetContents*, + const CSSParserContext& context); static std::unique_ptr<Vector<double>> ParseKeyframeKeyList(const String&); @@ -192,9 +195,16 @@ StyleRuleKeyframe* ConsumeKeyframeStyleRule(CSSParserTokenRange prelude, const RangeOffset& prelude_offset, CSSParserTokenStream& block); - StyleRule* ConsumeStyleRule(CSSParserTokenStream&); + StyleRule* ConsumeStyleRule(CSSParserTokenStream&, + StyleRule* parent_rule_for_nesting); + StyleRule* ConsumeStyleRuleContents(base::span<CSSSelector> selector_vector, + CSSParserTokenStream& stream); - void ConsumeDeclarationList(CSSParserTokenStream&, StyleRule::RuleType); + void ConsumeDeclarationList(CSSParserTokenStream&, + StyleRule::RuleType, + StyleRule* parent_rule_for_nesting); + void ConsumeNestedRule(CSSParserTokenStream& stream, + StyleRule* parent_rule_for_nesting); void ConsumeDeclaration(CSSParserTokenStream&, StyleRule::RuleType); void ConsumeDeclarationValue(const CSSTokenizedValue&, CSSPropertyID, @@ -227,7 +237,7 @@ // Used for temporary allocations of CSSParserSelector (we send it down // to CSSSelectorParser, which temporarily holds on to a reference to it). - Vector<CSSSelector> arena_; + HeapVector<CSSSelector> arena_; HeapHashMap<String, Member<const MediaQuerySet>> media_query_cache_; };
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc index 646dfc3f..3e0f3c0 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_parser_impl_test.cc
@@ -213,6 +213,73 @@ } } +TEST(CSSParserImplTest, DirectNesting) { + ScopedCSSNestingForTest enabled(true); + String sheet_text = + ".element { color: green; &.other { color: red; margin-left: 10px; }}"; + + auto* context = MakeGarbageCollected<CSSParserContext>( + kHTMLStandardMode, SecureContextMode::kInsecureContext); + auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); + TestCSSParserObserver test_css_parser_observer; + CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, sheet, + test_css_parser_observer); + + ASSERT_EQ(1u, sheet->ChildRules().size()); + StyleRule* parent = DynamicTo<StyleRule>(sheet->ChildRules()[0].Get()); + ASSERT_NE(nullptr, parent); + EXPECT_EQ("color: green;", parent->Properties().AsText()); + EXPECT_EQ(".element", parent->SelectorsText()); + + ASSERT_EQ(1u, parent->ChildRules()->size()); + const StyleRule* child = (*parent->ChildRules())[0].Get(); + EXPECT_EQ("color: red; margin-left: 10px;", child->Properties().AsText()); + EXPECT_EQ("&.other", child->SelectorsText()); +} + +TEST(CSSParserImplTest, AtNest) { + ScopedCSSNestingForTest enabled(true); + String sheet_text = + ".element { color: green; @nest .outer & { color: red; }}"; + + auto* context = MakeGarbageCollected<CSSParserContext>( + kHTMLStandardMode, SecureContextMode::kInsecureContext); + auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); + TestCSSParserObserver test_css_parser_observer; + CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, sheet, + test_css_parser_observer); + + ASSERT_EQ(1u, sheet->ChildRules().size()); + StyleRule* parent = DynamicTo<StyleRule>(sheet->ChildRules()[0].Get()); + ASSERT_NE(nullptr, parent); + EXPECT_EQ("color: green;", parent->Properties().AsText()); + EXPECT_EQ(".element", parent->SelectorsText()); + + ASSERT_EQ(1u, parent->ChildRules()->size()); + const StyleRule* child = (*parent->ChildRules())[0].Get(); + EXPECT_EQ("color: red;", child->Properties().AsText()); + // FIXME(sesse): In the current spec, this should have been @nest .outer &, + // but we don't serialize the @nest yet. This part of the spec is somewhat + // in flux, so update when it settles. + EXPECT_EQ(".outer &", child->SelectorsText()); +} + +TEST(CSSParserImplTest, NestingAtTopLevelIsLegalThoughIsMatchesNothing) { + String sheet_text = "&.element { color: orchid; }"; + + auto* context = MakeGarbageCollected<CSSParserContext>( + kHTMLStandardMode, SecureContextMode::kInsecureContext); + auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); + TestCSSParserObserver test_css_parser_observer; + CSSParserImpl::ParseStyleSheetForInspector(sheet_text, context, sheet, + test_css_parser_observer); + + ASSERT_EQ(1u, sheet->ChildRules().size()); + const StyleRule* rule = DynamicTo<StyleRule>(sheet->ChildRules()[0].Get()); + EXPECT_EQ("color: orchid;", rule->Properties().AsText()); + EXPECT_EQ("&.element", rule->SelectorsText()); +} + TEST(CSSParserImplTest, RemoveImportantAnnotationIfPresent) { struct TestCase { String input;
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h b/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h index 78e1c08..b30e65944 100644 --- a/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h +++ b/third_party/blink/renderer/core/css/parser/css_parser_token_stream.h
@@ -51,13 +51,22 @@ DCHECK_EQ(next.GetBlockType(), CSSParserToken::kBlockStart); } - ~BlockGuard() { + void SkipToEndOfBlock() { + DCHECK(!skipped_to_end_of_block_); stream_.EnsureLookAhead(); stream_.UncheckedSkipToEndOfBlock(); + skipped_to_end_of_block_ = true; + } + + ~BlockGuard() { + if (!skipped_to_end_of_block_) { + SkipToEndOfBlock(); + } } private: CSSParserTokenStream& stream_; + bool skipped_to_end_of_block_ = false; }; static constexpr uint64_t FlagForTokenType(CSSParserTokenType token_type) {
diff --git a/third_party/blink/renderer/core/css/parser/css_selector_parser.cc b/third_party/blink/renderer/core/css/parser/css_selector_parser.cc index a9d65ed..9f816cef 100644 --- a/third_party/blink/renderer/core/css/parser/css_selector_parser.cc +++ b/third_party/blink/renderer/core/css/parser/css_selector_parser.cc
@@ -96,9 +96,11 @@ base::span<CSSSelector> CSSSelectorParser::ParseSelector( CSSParserTokenRange range, const CSSParserContext* context, + const StyleRule* parent_rule_for_nesting, StyleSheetContents* style_sheet, - Vector<CSSSelector>& arena) { - CSSSelectorParser parser(context, style_sheet, arena); + HeapVector<CSSSelector>& arena) { + CSSSelectorParser parser(context, parent_rule_for_nesting, style_sheet, + arena); range.ConsumeWhitespace(); base::span<CSSSelector> result = parser.ConsumeComplexSelectorList(range); if (!range.AtEnd()) { @@ -113,10 +115,12 @@ base::span<CSSSelector> CSSSelectorParser::ConsumeSelector( CSSParserTokenStream& stream, const CSSParserContext* context, + const StyleRule* parent_rule_for_nesting, StyleSheetContents* style_sheet, CSSParserObserver* observer, - Vector<CSSSelector>& arena) { - CSSSelectorParser parser(context, style_sheet, arena); + HeapVector<CSSSelector>& arena) { + CSSSelectorParser parser(context, parent_rule_for_nesting, style_sheet, + arena); stream.ConsumeWhitespace(); base::span<CSSSelector> result = parser.ConsumeComplexSelectorList(stream, observer); @@ -125,20 +129,20 @@ } // static -absl::optional<CSSSelectorList> CSSSelectorParser::ParseScopeBoundary( +CSSSelectorList* CSSSelectorParser::ParseScopeBoundary( CSSParserTokenRange range, const CSSParserContext* context, StyleSheetContents* style_sheet) { - Vector<CSSSelector> arena; - CSSSelectorParser parser(context, style_sheet, arena); + HeapVector<CSSSelector> arena; + CSSSelectorParser parser(context, /*parent_rule_for_nesting=*/nullptr, + style_sheet, arena); DisallowPseudoElementsScope disallow_pseudo_elements(&parser); range.ConsumeWhitespace(); - absl::optional<CSSSelectorList> result = - parser.ConsumeForgivingComplexSelectorList(range); + CSSSelectorList* result = parser.ConsumeForgivingComplexSelectorList(range); DCHECK(result); if (!range.AtEnd()) - return absl::nullopt; + return nullptr; for (const CSSSelector* current = result->First(); current; current = current->TagHistory()) { RecordUsageAndDeprecationsOneSelector(current, context); @@ -151,8 +155,9 @@ CSSParserTokenRange range, const CSSParserContext* context) { range.ConsumeWhitespace(); - Vector<CSSSelector> arena; - CSSSelectorParser parser(context, nullptr, arena); + HeapVector<CSSSelector> arena; + CSSSelectorParser parser(context, /*parent_rule_for_nesting=*/nullptr, + nullptr, arena); parser.SetInSupportsParsing(); base::span<CSSSelector> selectors = parser.ConsumeComplexSelector(range); if (parser.failed_parsing_ || !range.AtEnd() || selectors.empty()) @@ -163,9 +168,13 @@ } CSSSelectorParser::CSSSelectorParser(const CSSParserContext* context, + const StyleRule* parent_rule_for_nesting, StyleSheetContents* style_sheet, - Vector<CSSSelector>& output) - : context_(context), style_sheet_(style_sheet), output_(output) {} + HeapVector<CSSSelector>& output) + : context_(context), + parent_rule_for_nesting_(parent_rule_for_nesting), + style_sheet_(style_sheet), + output_(output) {} base::span<CSSSelector> CSSSelectorParser::ConsumeComplexSelectorList( CSSParserTokenRange& range) { @@ -218,14 +227,14 @@ return reset_vector.CommitAddedElements(); } -CSSSelectorList CSSSelectorParser::ConsumeCompoundSelectorList( +CSSSelectorList* CSSSelectorParser::ConsumeCompoundSelectorList( CSSParserTokenRange& range) { ResetVectorAfterScope reset_vector(output_); base::span<CSSSelector> selector = ConsumeCompoundSelector(range); range.ConsumeWhitespace(); if (selector.empty()) { - return CSSSelectorList(); + return nullptr; } MarkAsEntireComplexSelector(selector); while (!range.AtEnd() && range.Peek().GetType() == kCommaToken) { @@ -233,19 +242,19 @@ selector = ConsumeCompoundSelector(range); range.ConsumeWhitespace(); if (selector.empty()) { - return CSSSelectorList(); + return nullptr; } MarkAsEntireComplexSelector(selector); } if (failed_parsing_) { - return CSSSelectorList(); + return nullptr; } return CSSSelectorList::AdoptSelectorVector(reset_vector.AddedElements()); } -CSSSelectorList CSSSelectorParser::ConsumeNestedSelectorList( +CSSSelectorList* CSSSelectorParser::ConsumeNestedSelectorList( CSSParserTokenRange& range) { if (inside_compound_pseudo_) return ConsumeCompoundSelectorList(range); @@ -255,7 +264,7 @@ if (result.empty()) { return {}; } else { - CSSSelectorList selector_list = + CSSSelectorList* selector_list = CSSSelectorList::AdoptSelectorVector(result); return selector_list; } @@ -288,16 +297,14 @@ } // namespace -absl::optional<CSSSelectorList> -CSSSelectorParser::ConsumeForgivingNestedSelectorList( +CSSSelectorList* CSSSelectorParser::ConsumeForgivingNestedSelectorList( CSSParserTokenRange& range) { if (inside_compound_pseudo_) return ConsumeForgivingCompoundSelectorList(range); return ConsumeForgivingComplexSelectorList(range); } -absl::optional<CSSSelectorList> -CSSSelectorParser::ConsumeForgivingComplexSelectorList( +CSSSelectorList* CSSSelectorParser::ConsumeForgivingComplexSelectorList( CSSParserTokenRange& range) { ResetVectorAfterScope reset_vector(output_); @@ -305,7 +312,7 @@ in_supports_parsing_) { base::span<CSSSelector> selectors = ConsumeComplexSelectorList(range); if (selectors.empty()) { - return absl::nullopt; + return nullptr; } else { return CSSSelectorList::AdoptSelectorVector(selectors); } @@ -334,20 +341,19 @@ // Parsed nothing that was supported. if (in_supports_parsing_) at_supports_drop_invalid_counter.Count(); - return CSSSelectorList(); + return CSSSelectorList::Empty(); } return CSSSelectorList::AdoptSelectorVector(reset_vector.AddedElements()); } -absl::optional<CSSSelectorList> -CSSSelectorParser::ConsumeForgivingCompoundSelectorList( +CSSSelectorList* CSSSelectorParser::ConsumeForgivingCompoundSelectorList( CSSParserTokenRange& range) { if (RuntimeEnabledFeatures::CSSAtSupportsAlwaysNonForgivingParsingEnabled() && in_supports_parsing_) { - CSSSelectorList selector_list = ConsumeCompoundSelectorList(range); - if (!selector_list.IsValid()) - return absl::nullopt; + CSSSelectorList* selector_list = ConsumeCompoundSelectorList(range); + if (!selector_list || !selector_list->IsValid()) + return nullptr; return selector_list; } @@ -377,20 +383,19 @@ if (reset_vector.AddedElements().empty()) { if (in_supports_parsing_) at_supports_drop_invalid_counter.Count(); - return CSSSelectorList(); + return CSSSelectorList::Empty(); } return CSSSelectorList::AdoptSelectorVector(reset_vector.AddedElements()); } -absl::optional<CSSSelectorList> -CSSSelectorParser::ConsumeForgivingRelativeSelectorList( +CSSSelectorList* CSSSelectorParser::ConsumeForgivingRelativeSelectorList( CSSParserTokenRange& range) { if (RuntimeEnabledFeatures::CSSAtSupportsAlwaysNonForgivingParsingEnabled() && in_supports_parsing_) { - CSSSelectorList selector_list = ConsumeRelativeSelectorList(range); - if (!selector_list.IsValid()) - return absl::nullopt; + CSSSelectorList* selector_list = ConsumeRelativeSelectorList(range); + if (!selector_list || !selector_list->IsValid()) + return nullptr; return selector_list; } @@ -427,26 +432,26 @@ // TODO(blee@igalia.com) Workaround to make :has() unforgiving to avoid // JQuery :has() issue: https://github.com/w3c/csswg-drafts/issues/7676 - // Should return empty CSSSelectorList. (return CSSSelectorList()) - return absl::nullopt; + // Should return empty CSSSelectorList. (return CSSSelectorList::Empty()) + return nullptr; } return CSSSelectorList::AdoptSelectorVector(reset_vector.AddedElements()); } -CSSSelectorList CSSSelectorParser::ConsumeRelativeSelectorList( +CSSSelectorList* CSSSelectorParser::ConsumeRelativeSelectorList( CSSParserTokenRange& range) { ResetVectorAfterScope reset_vector(output_); if (ConsumeRelativeSelector(range).empty()) - return CSSSelectorList(); + return nullptr; while (!range.AtEnd() && range.Peek().GetType() == kCommaToken) { range.ConsumeIncludingWhitespace(); if (ConsumeRelativeSelector(range).empty()) - return CSSSelectorList(); + return nullptr; } if (failed_parsing_) - return CSSSelectorList(); + return CSSSelectorList::Empty(); // :has() is not allowed in the pseudos accepting only compound selectors, or // not allowed after pseudo elements. @@ -454,7 +459,7 @@ if (inside_compound_pseudo_ || restricting_pseudo_element_ != CSSSelector::kPseudoUnknown || reset_vector.AddedElements().empty()) { - return CSSSelectorList(); + return nullptr; } return CSSSelectorList::AdoptSelectorVector(reset_vector.AddedElements()); @@ -943,6 +948,8 @@ ok = ConsumeAttribute(range); else if (token.GetType() == kColonToken) ok = ConsumePseudo(range); + else if (token.GetType() == kDelimiterToken && token.Delimiter() == '&') + ok = ConsumeNestingParent(range); else return false; // TODO(futhark@chromium.org): crbug.com/578131 @@ -1152,12 +1159,11 @@ &is_inside_logical_combination_in_has_argument_, is_inside_has_argument_); - absl::optional<CSSSelectorList> selector_list = + CSSSelectorList* selector_list = ConsumeForgivingNestedSelectorList(block); if (!selector_list || !block.AtEnd()) return false; - selector.SetSelectorList( - std::make_unique<CSSSelectorList>(std::move(*selector_list))); + selector.SetSelectorList(selector_list); output_.push_back(std::move(selector)); return true; } @@ -1168,12 +1174,11 @@ &is_inside_logical_combination_in_has_argument_, is_inside_has_argument_); - absl::optional<CSSSelectorList> selector_list = + CSSSelectorList* selector_list = ConsumeForgivingNestedSelectorList(block); if (!selector_list || !block.AtEnd()) return false; - selector.SetSelectorList( - std::make_unique<CSSSelectorList>(std::move(*selector_list))); + selector.SetSelectorList(selector_list); output_.push_back(std::move(selector)); return true; } @@ -1188,19 +1193,18 @@ ignore_default_namespace_ || selector.GetPseudoType() == CSSSelector::kPseudoCue); - CSSSelectorList selector_list = ConsumeCompoundSelectorList(block); - if (!selector_list.IsValid() || !block.AtEnd()) + CSSSelectorList* selector_list = ConsumeCompoundSelectorList(block); + if (!selector_list || !selector_list->IsValid() || !block.AtEnd()) return false; - if (!selector_list.HasOneSelector()) { + if (!selector_list->HasOneSelector()) { if (selector.GetPseudoType() == CSSSelector::kPseudoHost) return false; if (selector.GetPseudoType() == CSSSelector::kPseudoHostContext) return false; } - selector.SetSelectorList( - std::make_unique<CSSSelectorList>(std::move(selector_list))); + selector.SetSelectorList(selector_list); output_.push_back(std::move(selector)); return true; } @@ -1218,12 +1222,11 @@ base::AutoReset<bool> found_complex_logical_combinations_in_has_argument( &found_complex_logical_combinations_in_has_argument_, false); - absl::optional<CSSSelectorList> selector_list = + CSSSelectorList* selector_list = ConsumeForgivingRelativeSelectorList(block); if (!selector_list || !block.AtEnd()) return false; - selector.SetSelectorList( - std::make_unique<CSSSelectorList>(std::move(*selector_list))); + selector.SetSelectorList(selector_list); if (found_pseudo_in_has_argument_) selector.SetContainsPseudoInsideHasPseudoClass(); if (found_complex_logical_combinations_in_has_argument_) @@ -1238,12 +1241,11 @@ &is_inside_logical_combination_in_has_argument_, is_inside_has_argument_); - CSSSelectorList selector_list = ConsumeNestedSelectorList(block); - if (!selector_list.IsValid() || !block.AtEnd()) + CSSSelectorList* selector_list = ConsumeNestedSelectorList(block); + if (!selector_list || !selector_list->IsValid() || !block.AtEnd()) return false; - selector.SetSelectorList( - std::make_unique<CSSSelectorList>(std::move(selector_list))); + selector.SetSelectorList(selector_list); output_.push_back(std::move(selector)); return true; } @@ -1299,9 +1301,8 @@ if (inner_selector.empty() || !block.AtEnd()) return false; MarkAsEntireComplexSelector(reset_vector.AddedElements()); - selector.SetSelectorList(std::make_unique<CSSSelectorList>( - CSSSelectorList::AdoptSelectorVector( - reset_vector.AddedElements()))); + selector.SetSelectorList( + CSSSelectorList::AdoptSelectorVector(reset_vector.AddedElements())); } output_.push_back(std::move(selector)); return true; @@ -1379,6 +1380,15 @@ return false; } +bool CSSSelectorParser::ConsumeNestingParent(CSSParserTokenRange& range) { + DCHECK_EQ(range.Peek().GetType(), kDelimiterToken); + DCHECK_EQ(range.Peek().Delimiter(), '&'); + range.Consume(); + + output_.push_back(CSSSelector(parent_rule_for_nesting_)); + return true; +} + CSSSelector::RelationType CSSSelectorParser::ConsumeCombinator( CSSParserTokenRange& range) { CSSSelector::RelationType fallback_result = CSSSelector::kSubSelector;
diff --git a/third_party/blink/renderer/core/css/parser/css_selector_parser.h b/third_party/blink/renderer/core/css/parser/css_selector_parser.h index 5ad521c..901e4c44b 100644 --- a/third_party/blink/renderer/core/css/parser/css_selector_parser.h +++ b/third_party/blink/renderer/core/css/parser/css_selector_parser.h
@@ -18,6 +18,7 @@ class CSSParserObserver; class CSSSelectorList; class Node; +class StyleRule; class StyleSheetContents; // CSSSelectorParser parses a CSS selector (or a comma-separated list of them) @@ -29,7 +30,7 @@ // In order to be light on memory allocation, CSSSelectorParser uses a scheme // akin to an arena; as we parse the simple selectors that make up a compound // (and in turn, a full complex selector), they are being pushed onto a -// Vector<CSSSelector>. Then, the required reorderings will be done +// HeapVector<CSSSelector>. Then, the required reorderings will be done // in-place. When we're done parsing, the correct data is pulled out of the // vector (by the caller), whose memory can then be reused with no further // allocations for parsing the next selectors. (When doing so, it is important @@ -54,15 +55,19 @@ // (existing elements on the vector are untouched; the output is // appended to its end). In other words, if you add new elements // to the vector or similar, the span may be invalidated. - static base::span<CSSSelector> ParseSelector(CSSParserTokenRange, - const CSSParserContext*, - StyleSheetContents*, - Vector<CSSSelector>&); - static base::span<CSSSelector> ConsumeSelector(CSSParserTokenStream&, - const CSSParserContext*, - StyleSheetContents*, - CSSParserObserver*, - Vector<CSSSelector>&); + static base::span<CSSSelector> ParseSelector( + CSSParserTokenRange, + const CSSParserContext*, + const StyleRule* parent_rule_for_nesting, + StyleSheetContents*, + HeapVector<CSSSelector>&); + static base::span<CSSSelector> ConsumeSelector( + CSSParserTokenStream&, + const CSSParserContext*, + const StyleRule* parent_rule_for_nesting, + StyleSheetContents*, + CSSParserObserver*, + HeapVector<CSSSelector>&); static bool ConsumeANPlusB(CSSParserTokenRange&, std::pair<int, int>&); @@ -84,37 +89,33 @@ // Therefore empty lists, represented by !CSSSelectorList::IsValid(), are // allowed. // - // Parse errors are signalled by absl::nullopt. - static absl::optional<CSSSelectorList> ParseScopeBoundary( - CSSParserTokenRange, - const CSSParserContext*, - StyleSheetContents*); + // Parse errors are signalled by returning nullptr. + static CSSSelectorList* ParseScopeBoundary(CSSParserTokenRange, + const CSSParserContext*, + StyleSheetContents*); private: CSSSelectorParser(const CSSParserContext*, + const StyleRule* parent_rule_for_nesting, StyleSheetContents*, - Vector<CSSSelector>&); + HeapVector<CSSSelector>&); // These will all consume trailing comments if successful base::span<CSSSelector> ConsumeComplexSelectorList(CSSParserTokenRange&); base::span<CSSSelector> ConsumeComplexSelectorList(CSSParserTokenStream&, CSSParserObserver*); - CSSSelectorList ConsumeCompoundSelectorList(CSSParserTokenRange&); + CSSSelectorList* ConsumeCompoundSelectorList(CSSParserTokenRange&); // Consumes a complex selector list if inside_compound_pseudo_ is false, // otherwise consumes a compound selector list. - CSSSelectorList ConsumeNestedSelectorList(CSSParserTokenRange&); - absl::optional<CSSSelectorList> ConsumeForgivingNestedSelectorList( - CSSParserTokenRange&); + CSSSelectorList* ConsumeNestedSelectorList(CSSParserTokenRange&); + CSSSelectorList* ConsumeForgivingNestedSelectorList(CSSParserTokenRange&); // https://drafts.csswg.org/selectors/#typedef-forgiving-selector-list - absl::optional<CSSSelectorList> ConsumeForgivingComplexSelectorList( - CSSParserTokenRange&); - absl::optional<CSSSelectorList> ConsumeForgivingCompoundSelectorList( - CSSParserTokenRange&); + CSSSelectorList* ConsumeForgivingComplexSelectorList(CSSParserTokenRange&); + CSSSelectorList* ConsumeForgivingCompoundSelectorList(CSSParserTokenRange&); // https://drafts.csswg.org/selectors/#typedef-relative-selector-list - absl::optional<CSSSelectorList> ConsumeForgivingRelativeSelectorList( - CSSParserTokenRange&); - CSSSelectorList ConsumeRelativeSelectorList(CSSParserTokenRange&); + CSSSelectorList* ConsumeForgivingRelativeSelectorList(CSSParserTokenRange&); + CSSSelectorList* ConsumeRelativeSelectorList(CSSParserTokenRange&); base::span<CSSSelector> ConsumeRelativeSelector(CSSParserTokenRange&); base::span<CSSSelector> ConsumeComplexSelector(CSSParserTokenRange&); @@ -146,8 +147,9 @@ // otherwise, the vector will be pushed onto output_. bool ConsumeId(CSSParserTokenRange&); bool ConsumeClass(CSSParserTokenRange&); - bool ConsumePseudo(CSSParserTokenRange&); bool ConsumeAttribute(CSSParserTokenRange&); + bool ConsumePseudo(CSSParserTokenRange&); + bool ConsumeNestingParent(CSSParserTokenRange& range); // This doesn't include element names, since they're handled specially bool ConsumeSimpleSelector(CSSParserTokenRange&); @@ -173,6 +175,7 @@ void SetInSupportsParsing() { in_supports_parsing_ = true; } const CSSParserContext* context_; + const StyleRule* parent_rule_for_nesting_; const StyleSheetContents* style_sheet_; bool failed_parsing_ = false; @@ -214,7 +217,7 @@ // See the comment on ParseSelector(); when we allocate a CSSSelector, // it is on this vector (which we effectively use as an arena). - Vector<CSSSelector>& output_; + HeapVector<CSSSelector>& output_; class DisallowPseudoElementsScope { STACK_ALLOCATED(); @@ -250,7 +253,7 @@ STACK_ALLOCATED(); public: - explicit ResetVectorAfterScope(Vector<CSSSelector>& vector) + explicit ResetVectorAfterScope(HeapVector<CSSSelector>& vector) : vector_(vector), initial_size_(vector.size()) {} ~ResetVectorAfterScope() { @@ -275,7 +278,7 @@ } private: - Vector<CSSSelector>& vector_; + HeapVector<CSSSelector>& vector_; const wtf_size_t initial_size_; bool committed_ = false; };
diff --git a/third_party/blink/renderer/core/css/parser/css_selector_parser_test.cc b/third_party/blink/renderer/core/css/parser/css_selector_parser_test.cc index 1e863b1..3ddc0f72 100644 --- a/third_party/blink/renderer/core/css/parser/css_selector_parser_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_selector_parser_test.cc
@@ -42,9 +42,9 @@ TEST_P(SelectorParseTest, Parse) { auto param = GetParam(); SCOPED_TRACE(param.input); - CSSSelectorList list = css_test_helpers::ParseSelectorList(param.input); + CSSSelectorList* list = css_test_helpers::ParseSelectorList(param.input); const char* expected = param.expected ? param.expected : param.input; - EXPECT_EQ(String(expected), list.SelectorsText()); + EXPECT_EQ(String(expected), list->SelectorsText()); } TEST(CSSSelectorParserTest, ValidANPlusB) { @@ -151,7 +151,7 @@ ":-webkit-any(::after, ::before)", ":-webkit-any(::content, span)"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { CSSTokenizer tokenizer(test_case); const auto tokens = tokenizer.TokenizeToEOF(); @@ -160,7 +160,7 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_EQ(vector.size(), 0u); } } @@ -174,7 +174,7 @@ "::slotted(span)::before", "::slotted(div)::after"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { CSSTokenizer tokenizer(test_case); const auto tokens = tokenizer.TokenizeToEOF(); @@ -183,7 +183,7 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_GT(vector.size(), 0u); } } @@ -209,7 +209,7 @@ "::slotted(.class)::first-line", "::slotted([attr])::-webkit-scrollbar"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { CSSTokenizer tokenizer(test_case); const auto tokens = tokenizer.TokenizeToEOF(); @@ -218,7 +218,7 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_EQ(vector.size(), 0u); } } @@ -252,7 +252,7 @@ CSSSelector::kPseudoUnknown}, }; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (const auto& test_case : test_cases) { SCOPED_TRACE(test_case.selector); CSSTokenizer tokenizer(test_case.selector); @@ -262,15 +262,15 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_EQ(!vector.empty(), test_case.valid); if (!test_case.valid) continue; - CSSSelectorList list = CSSSelectorList::AdoptSelectorVector(vector); - ASSERT_TRUE(list.HasOneSelector()); + CSSSelectorList* list = CSSSelectorList::AdoptSelectorVector(vector); + ASSERT_TRUE(list->HasOneSelector()); - auto* selector = list.First(); + auto* selector = list->First(); while (selector->TagHistory()) selector = selector->TagHistory(); @@ -285,7 +285,7 @@ "video::-webkit-media-text-track-region-container.scrolling", "input[type=\"range\" i]::-webkit-media-slider-container > div"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { CSSTokenizer tokenizer(test_case); const auto tokens = tokenizer.TokenizeToEOF(); @@ -294,7 +294,7 @@ range, MakeGarbageCollected<CSSParserContext>( kUASheetMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_GT(vector.size(), 0u); } } @@ -304,7 +304,7 @@ "::-webkit-scrollbar *", "::cue *", "::selection *"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { CSSTokenizer tokenizer(test_case); const auto tokens = tokenizer.TokenizeToEOF(); @@ -313,7 +313,7 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_EQ(vector.size(), 0u); } } @@ -325,13 +325,13 @@ kHTMLStandardMode, SecureContextMode::kInsecureContext); auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { CSSTokenizer tokenizer(test_case); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - base::span<CSSSelector> vector = - CSSSelectorParser::ParseSelector(range, context, sheet, arena); + base::span<CSSSelector> vector = CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); EXPECT_EQ(vector.size(), 0u); } } @@ -343,13 +343,13 @@ kHTMLStandardMode, SecureContextMode::kInsecureContext); auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { CSSTokenizer tokenizer(test_case); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - base::span<CSSSelector> vector = - CSSSelectorParser::ParseSelector(range, context, sheet, arena); + base::span<CSSSelector> vector = CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); EXPECT_EQ(vector.size(), 0u); } } @@ -372,17 +372,17 @@ auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); sheet->ParserAddNamespace("ns", "http://ns.org"); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto** test_case : test_cases) { SCOPED_TRACE(test_case[0]); CSSTokenizer tokenizer(test_case[0]); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - base::span<CSSSelector> vector = - CSSSelectorParser::ParseSelector(range, context, sheet, arena); - CSSSelectorList list = CSSSelectorList::AdoptSelectorVector(vector); - EXPECT_TRUE(list.IsValid()); - EXPECT_EQ(test_case[1], list.SelectorsText()); + base::span<CSSSelector> vector = CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); + CSSSelectorList* list = CSSSelectorList::AdoptSelectorVector(vector); + EXPECT_TRUE(list->IsValid()); + EXPECT_EQ(test_case[1], list->SelectorsText()); } } @@ -393,14 +393,14 @@ kHTMLStandardMode, SecureContextMode::kInsecureContext); auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { SCOPED_TRACE(test_case); CSSTokenizer tokenizer(test_case); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - base::span<CSSSelector> vector = - CSSSelectorParser::ParseSelector(range, context, sheet, arena); + base::span<CSSSelector> vector = CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); EXPECT_EQ(vector.size(), 0u); } } @@ -417,7 +417,7 @@ ":-internal-video-persistent", ":-internal-video-persistent-ancestor"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { SCOPED_TRACE(test_case); CSSTokenizer tokenizer(test_case); @@ -428,14 +428,14 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_EQ(author_vector.size(), 0u); base::span<CSSSelector> ua_vector = CSSSelectorParser::ParseSelector( range, MakeGarbageCollected<CSSParserContext>( kUASheetMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_GT(ua_vector.size(), 0u); } } @@ -615,18 +615,18 @@ kHTMLStandardMode, SecureContextMode::kInsecureContext); auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto test_case : test_cases) { SCOPED_TRACE(test_case.input); CSSTokenizer tokenizer(test_case.input); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - base::span<CSSSelector> vector = - CSSSelectorParser::ParseSelector(range, context, sheet, arena); + base::span<CSSSelector> vector = CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); EXPECT_GT(vector.size(), 0u); - CSSSelectorList list = CSSSelectorList::AdoptSelectorVector(vector); - EXPECT_TRUE(list.IsValid()); - const CSSSelector* selector = list.First(); + CSSSelectorList* list = CSSSelectorList::AdoptSelectorVector(vector); + EXPECT_TRUE(list->IsValid()); + const CSSSelector* selector = list->First(); ASSERT_TRUE(selector); EXPECT_EQ(AtomicString(test_case.expected), test_case.getter(selector)); } @@ -643,18 +643,18 @@ kHTMLQuirksMode, SecureContextMode::kInsecureContext); auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto test_case : test_cases) { SCOPED_TRACE(test_case.input); CSSTokenizer tokenizer(test_case.input); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - base::span<CSSSelector> vector = - CSSSelectorParser::ParseSelector(range, context, sheet, arena); + base::span<CSSSelector> vector = CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); EXPECT_GT(vector.size(), 0u); - CSSSelectorList list = CSSSelectorList::AdoptSelectorVector(vector); - EXPECT_TRUE(list.IsValid()); - const CSSSelector* selector = list.First(); + CSSSelectorList* list = CSSSelectorList::AdoptSelectorVector(vector); + EXPECT_TRUE(list->IsValid()); + const CSSSelector* selector = list->First(); ASSERT_TRUE(selector); EXPECT_EQ(AtomicString(test_case.expected), test_case.getter(selector)); } @@ -664,7 +664,7 @@ const char* test_cases[] = {"::part(ident)", "host::part(ident)", "host::part(ident):hover"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { SCOPED_TRACE(test_case); CSSTokenizer tokenizer(test_case); @@ -674,9 +674,9 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); - CSSSelectorList list = CSSSelectorList::AdoptSelectorVector(vector); - EXPECT_EQ(test_case, list.SelectorsText().Utf8()); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); + CSSSelectorList* list = CSSSelectorList::AdoptSelectorVector(vector); + EXPECT_EQ(test_case, list->SelectorsText().Utf8()); } } @@ -686,7 +686,7 @@ "::part(ident)::placeholder", "::part(ident)::first-line", "::part(ident)::first-letter", "::part(ident)::selection"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto* test_case : test_cases) { SCOPED_TRACE(test_case); CSSTokenizer tokenizer(test_case); @@ -696,11 +696,11 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_GT(vector.size(), 0u); - CSSSelectorList list = CSSSelectorList::AdoptSelectorVector(vector); - EXPECT_TRUE(list.IsValid()); - EXPECT_EQ(test_case, list.SelectorsText()); + CSSSelectorList* list = CSSSelectorList::AdoptSelectorVector(vector); + EXPECT_TRUE(list->IsValid()); + EXPECT_EQ(test_case, list->SelectorsText()); } } @@ -720,8 +720,9 @@ CSSTokenizer tokenizer(selector); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - Vector<CSSSelector> arena; - CSSSelectorParser::ParseSelector(range, context, sheet, arena); + HeapVector<CSSSelector> arena; + CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); return doc->IsUseCounted(feature); } @@ -918,17 +919,17 @@ kHTMLStandardMode, SecureContextMode::kInsecureContext); auto* sheet = MakeGarbageCollected<StyleSheetContents>(context); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; for (auto test_case : test_cases) { SCOPED_TRACE(test_case.input); CSSTokenizer tokenizer(test_case.input); const auto tokens = tokenizer.TokenizeToEOF(); CSSParserTokenRange range(tokens); - base::span<CSSSelector> vector = - CSSSelectorParser::ParseSelector(range, context, sheet, arena); - CSSSelectorList list = CSSSelectorList::AdoptSelectorVector(vector); - EXPECT_TRUE(list.IsValid()); - const CSSSelector* selector = list.First(); + base::span<CSSSelector> vector = CSSSelectorParser::ParseSelector( + range, context, /*parent_rule_for_nesting=*/nullptr, sheet, arena); + CSSSelectorList* list = CSSSelectorList::AdoptSelectorVector(vector); + EXPECT_TRUE(list->IsValid()); + const CSSSelector* selector = list->First(); for (auto sub_expectation : test_case.expectation) { ASSERT_TRUE(selector); AtomicString selector_value = selector->Match() == CSSSelector::kTag @@ -951,7 +952,7 @@ "::-webkit-scrollbar-track", "::-webkit-scrollbar-track-piece"}; - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; bool enabled_states[] = {false, true}; for (auto state : enabled_states) { ScopedWebKitScrollbarStylingForTest scoped_feature(state); @@ -963,7 +964,7 @@ range, MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, arena); EXPECT_EQ(vector.size(), state ? 1u : 0u); } }
diff --git a/third_party/blink/renderer/core/css/parser/css_tokenizer_test.cc b/third_party/blink/renderer/core/css/parser/css_tokenizer_test.cc index 9ac9d95..a8c7ca7 100644 --- a/third_party/blink/renderer/core/css/parser/css_tokenizer_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_tokenizer_test.cc
@@ -208,8 +208,8 @@ TEST_TOKENS("*", Delim('*')); TEST_TOKENS("%", Delim('%')); TEST_TOKENS("~", Delim('~')); - TEST_TOKENS("&", Delim('&')); TEST_TOKENS("|", Delim('|')); + TEST_TOKENS("&", Delim('&')); TEST_TOKENS("\x7f", Delim('\x7f')); TEST_TOKENS("\1", Delim('\x1')); TEST_TOKENS("~-", Delim('~'), Delim('-'));
diff --git a/third_party/blink/renderer/core/css/resolver/selector_filter_parent_scope_test.cc b/third_party/blink/renderer/core/css/resolver/selector_filter_parent_scope_test.cc index c0f4f52..503bc53 100644 --- a/third_party/blink/renderer/core/css/resolver/selector_filter_parent_scope_test.cc +++ b/third_party/blink/renderer/core/css/resolver/selector_filter_parent_scope_test.cc
@@ -29,7 +29,7 @@ }; TEST_F(SelectorFilterParentScopeTest, ParentScope) { - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; GetDocument().body()->setAttribute(html_names::kClassAttr, "match"); GetDocument().documentElement()->SetIdAttribute("myId"); auto* div = GetDocument().CreateRawElement(html_names::kDivTag); @@ -49,11 +49,12 @@ base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, "html *, body *, .match *, #myId *", arena); - CSSSelectorList selectors = + /*parent_rule_for_nesting=*/nullptr, nullptr, + "html *, body *, .match *, #myId *", arena); + CSSSelectorList* selectors = CSSSelectorList::AdoptSelectorVector(selector_vector); - for (const CSSSelector* selector = selectors.First(); selector; + for (const CSSSelector* selector = selectors->First(); selector; selector = CSSSelectorList::Next(*selector)) { unsigned selector_hashes[max_identifier_hashes]; filter.CollectIdentifierHashes(*selector, selector_hashes, @@ -78,15 +79,16 @@ SelectorFilterRootScope span_scope(GetDocument().getElementById("y")); SelectorFilterParentScope::EnsureParentStackIsPushed(); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, "html *, body *, div *, span *, .x *, #y *", arena); - CSSSelectorList selectors = + /*parent_rule_for_nesting=*/nullptr, nullptr, + "html *, body *, div *, span *, .x *, #y *", arena); + CSSSelectorList* selectors = CSSSelectorList::AdoptSelectorVector(selector_vector); - for (const CSSSelector* selector = selectors.First(); selector; + for (const CSSSelector* selector = selectors->First(); selector; selector = CSSSelectorList::Next(*selector)) { unsigned selector_hashes[max_identifier_hashes]; filter.CollectIdentifierHashes(*selector, selector_hashes, @@ -134,15 +136,16 @@ SelectorFilterRootScope span_scope(inner); SelectorFilterParentScope::EnsureParentStackIsPushed(); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( kHTMLStandardMode, SecureContextMode::kInsecureContext), - nullptr, "[Attr] *, [attr] *, [viewbox] *, [VIEWBOX] *", arena); - CSSSelectorList selectors = + /*parent_rule_for_nesting=*/nullptr, nullptr, + "[Attr] *, [attr] *, [viewbox] *, [VIEWBOX] *", arena); + CSSSelectorList* selectors = CSSSelectorList::AdoptSelectorVector(selector_vector); - for (const CSSSelector* selector = selectors.First(); selector; + for (const CSSSelector* selector = selectors->First(); selector; selector = CSSSelectorList::Next(*selector)) { unsigned selector_hashes[max_identifier_hashes]; filter.CollectIdentifierHashes(*selector, selector_hashes,
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.cc b/third_party/blink/renderer/core/css/rule_feature_set.cc index ec735628..86bc3ad 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set.cc
@@ -180,6 +180,7 @@ case CSSSelector::kPseudoXrOverlay: case CSSSelector::kPseudoIs: case CSSSelector::kPseudoWhere: + case CSSSelector::kPseudoParent: // Same as kPseudoIs. case CSSSelector::kPseudoTargetText: case CSSSelector::kPseudoHighlight: case CSSSelector::kPseudoSpellingError: @@ -215,7 +216,8 @@ pseudo == CSSSelector::kPseudoIs || pseudo == CSSSelector::kPseudoNot || pseudo == CSSSelector::kPseudoSlotted || - pseudo == CSSSelector::kPseudoWhere; + pseudo == CSSSelector::kPseudoWhere || + pseudo == CSSSelector::kPseudoParent; } bool RequiresSubtreeInvalidation(const CSSSelector& selector) { @@ -835,8 +837,8 @@ AutoRestoreMaxDirectAdjacentSelectors restore_max(&features); AutoRestoreDescendantFeaturesDepth restore_depth(&features); - const CSSSelectorList* selector_list = simple_selector.SelectorList(); - if (!selector_list) + const CSSSelector* sub_selector = simple_selector.SelectorListOrParent(); + if (!sub_selector) return; CSSSelector::PseudoType pseudo_type = simple_selector.GetPseudoType(); @@ -848,8 +850,6 @@ DCHECK(SupportsInvalidationWithSelectorList(pseudo_type)); - const CSSSelector* sub_selector = selector_list->First(); - bool all_sub_selectors_have_features = true; bool all_sub_selectors_have_features_for_ruleset_invalidation = true; InvalidationSetFeatures any_features; @@ -1021,6 +1021,7 @@ case CSSSelector::kPseudoIs: case CSSSelector::kPseudoWhere: case CSSSelector::kPseudoNot: + case CSSSelector::kPseudoParent: // Add features for each method to handle sibling descendant // relationship in the logical combination. // - For '.a:has(:is(.b ~ .c .d))', @@ -1056,6 +1057,7 @@ case CSSSelector::kPseudoIs: case CSSSelector::kPseudoWhere: case CSSSelector::kPseudoNot: + case CSSSelector::kPseudoParent: // Nested logical combinations in righmost compound of a first-depth // logical combination inside :has() // (e.g. '.a:has(.a :is(.b :is(.c .d))) {}') @@ -1091,6 +1093,7 @@ case CSSSelector::kPseudoIs: case CSSSelector::kPseudoWhere: case CSSSelector::kPseudoNot: + case CSSSelector::kPseudoParent: // Nested logical combination inside :has() // (e.g. '.a:has(:is(:is(.a .b) .c)) {}') AddFeaturesToInvalidationSetsForLogicalCombinationInHas( @@ -1215,7 +1218,7 @@ DCHECK(logical_combination.SelectorList()); DCHECK(compound_containing_has); - for (const CSSSelector* complex = logical_combination.SelectorList()->First(); + for (const CSSSelector* complex = logical_combination.SelectorListOrParent(); complex; complex = CSSSelectorList::Next(*complex)) { base::AutoReset<CSSSelector::RelationType> restore_previous_combinator( &previous_combinator, previous_combinator); @@ -1300,9 +1303,9 @@ } void RuleFeatureSet::AddValuesInComplexSelectorInsideIsWhereNot( - const CSSSelectorList* selector_list) { - DCHECK(selector_list); - for (const CSSSelector* complex = selector_list->First(); complex; + const CSSSelector* selector_first) { + DCHECK(selector_first); + for (const CSSSelector* complex = selector_first; complex; complex = CSSSelectorList::Next(*complex)) { DCHECK(complex); @@ -1341,7 +1344,9 @@ [[fallthrough]]; case CSSSelector::kPseudoIs: case CSSSelector::kPseudoWhere: - AddValuesInComplexSelectorInsideIsWhereNot(selector.SelectorList()); + case CSSSelector::kPseudoParent: + AddValuesInComplexSelectorInsideIsWhereNot( + selector.SelectorListOrParent()); break; case CSSSelector::kPseudoVisited: // Ignore :visited to prevent history leakage. @@ -1401,7 +1406,7 @@ const CSSSelector& simple_selector, InvalidationSetFeatures* sibling_features, InvalidationSetFeatures& descendant_features) { - if (!simple_selector.SelectorList()) + if (!simple_selector.SelectorListOrParent()) return; DCHECK(SupportsInvalidationWithSelectorList(simple_selector.GetPseudoType())); @@ -1412,8 +1417,7 @@ simple_selector.GetPseudoType() == CSSSelector::kPseudoNot || simple_selector.GetPseudoType() == CSSSelector::kPseudoHostContext; - for (const CSSSelector* sub_selector = - simple_selector.SelectorList()->First(); + for (const CSSSelector* sub_selector = simple_selector.SelectorListOrParent(); sub_selector; sub_selector = CSSSelectorList::Next(*sub_selector)) { AutoRestoreMaxDirectAdjacentSelectors restore_max(sibling_features); AutoRestoreDescendantFeaturesDepth restore_depth(&descendant_features); @@ -1640,14 +1644,13 @@ return kSelectorNeverMatches; } [[fallthrough]]; + case CSSSelector::kPseudoParent: default: - if (const CSSSelectorList* selector_list = current->SelectorList()) { - for (const CSSSelector* sub_selector = selector_list->First(); - sub_selector; - sub_selector = CSSSelectorList::Next(*sub_selector)) { - CollectMetadataFromSelector( - *sub_selector, max_direct_adjacent_selectors, metadata); - } + for (const CSSSelector* sub_selector = current->SelectorListOrParent(); + sub_selector; + sub_selector = CSSSelectorList::Next(*sub_selector)) { + CollectMetadataFromSelector(*sub_selector, + max_direct_adjacent_selectors, metadata); } break; }
diff --git a/third_party/blink/renderer/core/css/rule_feature_set.h b/third_party/blink/renderer/core/css/rule_feature_set.h index 37bbb8b..3d92fa2c 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set.h +++ b/third_party/blink/renderer/core/css/rule_feature_set.h
@@ -574,7 +574,8 @@ void AddFeaturesToUniversalSiblingInvalidationSet( const InvalidationSetFeatures& sibling_features, const InvalidationSetFeatures& descendant_features); - void AddValuesInComplexSelectorInsideIsWhereNot(const CSSSelectorList*); + void AddValuesInComplexSelectorInsideIsWhereNot( + const CSSSelector* selector_first); bool AddValueOfSimpleSelectorInHasArgument( const CSSSelector& has_pseudo_class);
diff --git a/third_party/blink/renderer/core/css/rule_feature_set_test.cc b/third_party/blink/renderer/core/css/rule_feature_set_test.cc index 869ed50d..6b3df2b 100644 --- a/third_party/blink/renderer/core/css/rule_feature_set_test.cc +++ b/third_party/blink/renderer/core/css/rule_feature_set_test.cc
@@ -44,8 +44,10 @@ } RuleFeatureSet::SelectorPreMatch CollectFeatures( - const String& selector_text) { - return CollectFeaturesTo(selector_text, rule_feature_set_); + const String& selector_text, + StyleRule* parent_rule_for_nesting = nullptr) { + return CollectFeaturesTo(selector_text, rule_feature_set_, + parent_rule_for_nesting); } static RuleFeatureSet::SelectorPreMatch CollectFeaturesTo( @@ -78,11 +80,12 @@ static RuleFeatureSet::SelectorPreMatch CollectFeaturesTo( const String& selector_text, - RuleFeatureSet& set) { - Vector<CSSSelector> arena; + RuleFeatureSet& set, + StyleRule* parent_rule_for_nesting) { + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( - StrictCSSParserContext(SecureContextMode::kInsecureContext), nullptr, - selector_text, arena); + StrictCSSParserContext(SecureContextMode::kInsecureContext), + parent_rule_for_nesting, nullptr, selector_text, arena); return CollectFeaturesTo(selector_vector, nullptr /* style_scope */, set); } @@ -1956,14 +1959,19 @@ Compare(main_set, ref_set); } - virtual void CollectTo(const char*, RuleFeatureSet&) const = 0; + virtual void CollectTo( + const char*, + RuleFeatureSet&, + StyleRule* parent_rule_for_nesting = nullptr) const = 0; virtual void Compare(const RuleFeatureSet&, const RuleFeatureSet&) const = 0; }; class RuleFeatureSetSelectorRefTest : public RuleFeatureSetRefTest { public: - void CollectTo(const char* text, RuleFeatureSet& set) const override { - CollectFeaturesTo(text, set); + void CollectTo(const char* text, + RuleFeatureSet& set, + StyleRule* parent_rule_for_nesting = nullptr) const override { + CollectFeaturesTo(text, set, parent_rule_for_nesting); } }; @@ -2054,7 +2062,9 @@ public: RuleFeatureSetScopeRefTest() : ScopedCSSScopeForTest(true) {} - void CollectTo(const char* text, RuleFeatureSet& set) const override { + void CollectTo(const char* text, + RuleFeatureSet& set, + StyleRule* parent_rule_for_nesting = nullptr) const override { Document* document = Document::CreateForTest(); StyleRuleBase* rule = css_test_helpers::ParseRule(*document, text); ASSERT_TRUE(rule); @@ -2821,6 +2831,36 @@ } } +TEST_F(RuleFeatureSetTest, NestedSelector) { + // Create a parent rule. + HeapVector<CSSSelector> arena; + base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( + StrictCSSParserContext(SecureContextMode::kInsecureContext), + /*parent_rule_for_nesting=*/nullptr, nullptr, ".a, .b", arena); + auto* parent_rule = StyleRule::Create( + selector_vector, + MakeGarbageCollected<MutableCSSPropertyValueSet>(kHTMLStandardMode)); + + EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch, + CollectFeatures("& .c", parent_rule)); + + for (const char* parent_class : {"a", "b"}) { + SCOPED_TRACE(parent_class); + + InvalidationLists invalidation_lists; + CollectInvalidationSetsForClass(invalidation_lists, parent_class); + EXPECT_TRUE(HasClassInvalidation("c", invalidation_lists.descendants)); + EXPECT_TRUE(HasNoInvalidation(invalidation_lists.siblings)); + } + + { + InvalidationLists invalidation_lists; + CollectInvalidationSetsForClass(invalidation_lists, "c"); + EXPECT_TRUE(HasSelfInvalidation(invalidation_lists.descendants)); + EXPECT_TRUE(HasNoInvalidation(invalidation_lists.siblings)); + } +} + TEST_F(RuleFeatureSetTest, BloomFilterForClassSelfInvalidation) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures(
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc index 974fdc4..9a56f47 100644 --- a/third_party/blink/renderer/core/css/rule_set.cc +++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -502,12 +502,8 @@ StyleRuleBase* rule = rules[i].Get(); if (auto* style_rule = DynamicTo<StyleRule>(rule)) { - for (const CSSSelector* selector = style_rule->FirstSelector(); selector; - selector = CSSSelectorList::Next(*selector)) { - wtf_size_t selector_index = style_rule->SelectorIndex(*selector); - AddRule(style_rule, selector_index, add_rule_flags, container_query, - cascade_layer, style_scope); - } + AddStyleRule(style_rule, add_rule_flags, container_query, cascade_layer, + style_scope); } else if (auto* page_rule = DynamicTo<StyleRulePage>(rule)) { page_rule->SetCascadeLayer(cascade_layer); AddPageRule(page_rule); @@ -616,11 +612,24 @@ nullptr /* container_query */, cascade_layer, nullptr); } -void RuleSet::AddStyleRule(StyleRule* rule, AddRuleFlags add_rule_flags) { - for (wtf_size_t selector_index = 0; selector_index != kNotFound; - selector_index = rule->IndexOfNextSelectorAfter(selector_index)) { - AddRule(rule, selector_index, add_rule_flags, nullptr /* container_query */, - nullptr /* cascade_layer */, nullptr /* scope */); +void RuleSet::AddStyleRule(StyleRule* style_rule, + AddRuleFlags add_rule_flags, + const ContainerQuery* container_query, + CascadeLayer* cascade_layer, + const StyleScope* style_scope) { + for (const CSSSelector* selector = style_rule->FirstSelector(); selector; + selector = CSSSelectorList::Next(*selector)) { + wtf_size_t selector_index = style_rule->SelectorIndex(*selector); + AddRule(style_rule, selector_index, add_rule_flags, container_query, + cascade_layer, style_scope); + } + + // Nested rules are taken to be added immediately after their parent rule. + if (style_rule->ChildRules() != nullptr) { + for (StyleRule* child_rule : *style_rule->ChildRules()) { + AddStyleRule(child_rule, add_rule_flags, container_query, cascade_layer, + style_scope); + } } } @@ -729,12 +738,7 @@ // have a match). We add a little bit of margin to compensate for the fact // that we also need to spend time building the tree, and the extra memory // in use. - // - // TODO(sesse): When the Finch experiment finishes, lock this to 50. - return base::FeatureList::IsEnabled( - blink::features::kSubstringSetTreeForAttributeBuckets) - ? 50 - : std::numeric_limits<wtf_size_t>::max(); + return 50; } bool RuleSet::CanIgnoreEntireList(base::span<const RuleData> list,
diff --git a/third_party/blink/renderer/core/css/rule_set.h b/third_party/blink/renderer/core/css/rule_set.h index cc1b09b..2037e830 100644 --- a/third_party/blink/renderer/core/css/rule_set.h +++ b/third_party/blink/renderer/core/css/rule_set.h
@@ -354,7 +354,11 @@ const MediaQueryEvaluator&, AddRuleFlags = kRuleHasNoSpecialState, CascadeLayer* = nullptr); - void AddStyleRule(StyleRule*, AddRuleFlags); + void AddStyleRule(StyleRule* style_rule, + AddRuleFlags add_rule_flags, + const ContainerQuery* container_query = nullptr, + CascadeLayer* cascade_layer = nullptr, + const StyleScope* style_scope = nullptr); const RuleFeatureSet& Features() const { return features_; }
diff --git a/third_party/blink/renderer/core/css/rule_set_test.cc b/third_party/blink/renderer/core/css/rule_set_test.cc index 672c8ddd..0119262 100644 --- a/third_party/blink/renderer/core/css/rule_set_test.cc +++ b/third_party/blink/renderer/core/css/rule_set_test.cc
@@ -329,11 +329,6 @@ static void AddManyAttributeRules(base::test::ScopedFeatureList& feature_list, css_test_helpers::TestStyleSheet& sheet) { - feature_list.InitWithFeatures( - /*enabled_features=*/{blink::features:: - kSubstringSetTreeForAttributeBuckets}, - /*disabled_features=*/{}); - // Create more than 50 rules, in order to trigger building the Aho-Corasick // tree. for (int i = 0; i < 100; ++i) {
diff --git a/third_party/blink/renderer/core/css/selector_checker.cc b/third_party/blink/renderer/core/css/selector_checker.cc index 352380f..9af7e02 100644 --- a/third_party/blink/renderer/core/css/selector_checker.cc +++ b/third_party/blink/renderer/core/css/selector_checker.cc
@@ -30,6 +30,7 @@ #include "third_party/blink/renderer/core/css/selector_checker.h" #include "base/auto_reset.h" +#include "style_rule.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink.h" #include "third_party/blink/renderer/core/css/check_pseudo_has_argument_context.h" #include "third_party/blink/renderer/core/css/check_pseudo_has_cache_scope.h" @@ -1310,21 +1311,21 @@ return element == element.GetDocument().CssTarget(); case CSSSelector::kPseudoIs: case CSSSelector::kPseudoWhere: - case CSSSelector::kPseudoAny: { + case CSSSelector::kPseudoAny: + case CSSSelector::kPseudoParent: { SelectorCheckingContext sub_context(context); sub_context.is_sub_selector = true; sub_context.in_nested_complex_selector = true; sub_context.pseudo_id = kPseudoIdNone; - if (!selector.SelectorList()) - break; - for (sub_context.selector = selector.SelectorList()->First(); + for (sub_context.selector = selector.SelectorListOrParent(); sub_context.selector; sub_context.selector = CSSSelectorList::Next( *sub_context.selector)) { MatchResult sub_result; if (MatchSelector(sub_context, sub_result) == kSelectorMatches) return true; } - } break; + break; + } case CSSSelector::kPseudoAutofill: case CSSSelector::kPseudoWebKitAutofill: { auto* html_form_element = DynamicTo<HTMLFormControlElement>(&element);
diff --git a/third_party/blink/renderer/core/css/selector_query.cc b/third_party/blink/renderer/core/css/selector_query.cc index 29ea6a6..b033240 100644 --- a/third_party/blink/renderer/core/css/selector_query.cc +++ b/third_party/blink/renderer/core/css/selector_query.cc
@@ -418,17 +418,17 @@ } std::unique_ptr<SelectorQuery> SelectorQuery::Adopt( - CSSSelectorList selector_list) { - return base::WrapUnique(new SelectorQuery(std::move(selector_list))); + CSSSelectorList* selector_list) { + return base::WrapUnique(new SelectorQuery(selector_list)); } -SelectorQuery::SelectorQuery(CSSSelectorList selector_list) - : selector_list_(std::move(selector_list)), +SelectorQuery::SelectorQuery(CSSSelectorList* selector_list) + : selector_list_(selector_list), selector_id_is_rightmost_(true), selector_id_affected_by_sibling_combinator_(false), use_slow_scan_(true) { - selectors_.ReserveInitialCapacity(selector_list_.ComputeLength()); - for (const CSSSelector* selector = selector_list_.First(); selector; + selectors_.ReserveInitialCapacity(selector_list_->ComputeLength()); + for (const CSSSelector* selector = selector_list_->First(); selector; selector = CSSSelectorList::Next(*selector)) { if (selector->MatchesPseudoElement()) continue; @@ -476,12 +476,12 @@ if (it != entries_.end()) return it->value.get(); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( document, document.BaseURL(), true /* origin_clean */, Referrer(), WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), - nullptr, selectors, arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, selectors, arena); if (selector_vector.empty()) { exception_state.ThrowDOMException( @@ -490,15 +490,14 @@ return nullptr; } - CSSSelectorList selector_list = + CSSSelectorList* selector_list = CSSSelectorList::AdoptSelectorVector(selector_vector); const unsigned kMaximumSelectorQueryCacheSize = 256; if (entries_.size() == kMaximumSelectorQueryCacheSize) entries_.erase(entries_.begin()); - return entries_ - .insert(selectors, SelectorQuery::Adopt(std::move(selector_list))) + return entries_.insert(selectors, SelectorQuery::Adopt(selector_list)) .stored_value->value.get(); }
diff --git a/third_party/blink/renderer/core/css/selector_query.h b/third_party/blink/renderer/core/css/selector_query.h index 1b51aea9b..7a9fded 100644 --- a/third_party/blink/renderer/core/css/selector_query.h +++ b/third_party/blink/renderer/core/css/selector_query.h
@@ -31,6 +31,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/css/css_selector_list.h" +#include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/hash_map.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string_hash.h" @@ -54,7 +55,7 @@ SelectorQuery(const SelectorQuery&) = delete; SelectorQuery& operator=(const SelectorQuery&) = delete; - static std::unique_ptr<SelectorQuery> Adopt(CSSSelectorList); + static std::unique_ptr<SelectorQuery> Adopt(CSSSelectorList*); // https://dom.spec.whatwg.org/#dom-element-matches bool Matches(Element&) const; @@ -83,7 +84,7 @@ static QueryStats LastQueryStats(); private: - explicit SelectorQuery(CSSSelectorList); + explicit SelectorQuery(CSSSelectorList*); template <typename SelectorQueryTrait> void ExecuteWithId(ContainerNode& root_node, @@ -105,7 +106,8 @@ bool SelectorListMatches(ContainerNode& root_node, Element&) const; - CSSSelectorList selector_list_; + // TODO(sesse): Consider moving SelectorQuery to Oilpan. + Persistent<CSSSelectorList> selector_list_; // Contains the list of CSSSelector's to match, but without ones that could // never match like pseudo elements, div::before. This can be empty, while // |selector_list_| will never be empty as SelectorQueryCache::add would have
diff --git a/third_party/blink/renderer/core/css/selector_query_test.cc b/third_party/blink/renderer/core/css/selector_query_test.cc index f0560cb..a52aac2 100644 --- a/third_party/blink/renderer/core/css/selector_query_test.cc +++ b/third_party/blink/renderer/core/css/selector_query_test.cc
@@ -70,16 +70,15 @@ document->documentElement()->setInnerHTML( "<body><style>span::before { content: 'X' }</style><span></span></body>"); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( *document, NullURL(), true /* origin_clean */, Referrer(), WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), - nullptr, "span::before", arena); - CSSSelectorList selector_list = + /*parent_rule_for_nesting=*/nullptr, nullptr, "span::before", arena); + CSSSelectorList* selector_list = CSSSelectorList::AdoptSelectorVector(selector_vector); - std::unique_ptr<SelectorQuery> query = - SelectorQuery::Adopt(std::move(selector_list)); + std::unique_ptr<SelectorQuery> query = SelectorQuery::Adopt(selector_list); Element* elm = query->QueryFirst(*document); EXPECT_EQ(nullptr, elm); @@ -87,9 +86,9 @@ MakeGarbageCollected<CSSParserContext>( *document, NullURL(), true /* origin_clean */, Referrer(), WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), - nullptr, "span", arena); + /*parent_rule_for_nesting=*/nullptr, nullptr, "span", arena); selector_list = CSSSelectorList::AdoptSelectorVector(selector_vector); - query = SelectorQuery::Adopt(std::move(selector_list)); + query = SelectorQuery::Adopt(selector_list); elm = query->QueryFirst(*document); EXPECT_NE(nullptr, elm); } @@ -103,16 +102,15 @@ document->body()->BeginParsingChildren(); - Vector<CSSSelector> arena; + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( MakeGarbageCollected<CSSParserContext>( *document, NullURL(), true /* origin_clean */, Referrer(), WTF::TextEncoding(), CSSParserContext::kSnapshotProfile), - nullptr, "p:last-of-type", arena); - CSSSelectorList selector_list = + /*parent_rule_for_nesting=*/nullptr, nullptr, "p:last-of-type", arena); + CSSSelectorList* selector_list = CSSSelectorList::AdoptSelectorVector(selector_vector); - std::unique_ptr<SelectorQuery> query = - SelectorQuery::Adopt(std::move(selector_list)); + std::unique_ptr<SelectorQuery> query = SelectorQuery::Adopt(selector_list); Element* elm = query->QueryFirst(*document); ASSERT_TRUE(elm); EXPECT_EQ("last", elm->IdForStyleResolution());
diff --git a/third_party/blink/renderer/core/css/style_engine_test.cc b/third_party/blink/renderer/core/css/style_engine_test.cc index 729c871..5f1aeff 100644 --- a/third_party/blink/renderer/core/css/style_engine_test.cc +++ b/third_party/blink/renderer/core/css/style_engine_test.cc
@@ -347,12 +347,14 @@ ASSERT_TRUE(t4->GetComputedStyle()); // There's only one font and it's bold and normal. - EXPECT_EQ(1u, GetStyleEngine().GetFontSelector()->GetFontFaceCache() - ->GetNumSegmentedFacesForTesting()); + EXPECT_EQ(1u, GetStyleEngine() + .GetFontSelector() + ->GetFontFaceCache() + ->GetNumSegmentedFacesForTesting()); CSSSegmentedFontFace* font_face = - GetStyleEngine().GetFontSelector()->GetFontFaceCache() - ->Get(t4->GetComputedStyle()->GetFontDescription(), - AtomicString("Cool Font")); + GetStyleEngine().GetFontSelector()->GetFontFaceCache()->Get( + t4->GetComputedStyle()->GetFontDescription(), + AtomicString("Cool Font")); EXPECT_TRUE(font_face); FontSelectionCapabilities capabilities = font_face->GetFontSelectionCapabilities(); @@ -377,11 +379,12 @@ // After injecting a more specific font, now there are two and the // bold-italic one is selected. - EXPECT_EQ(2u, GetStyleEngine().GetFontSelector()->GetFontFaceCache() - ->GetNumSegmentedFacesForTesting()); - font_face = GetStyleEngine().GetFontSelector()->GetFontFaceCache() - ->Get(t4->GetComputedStyle()->GetFontDescription(), - AtomicString("Cool Font")); + EXPECT_EQ(2u, GetStyleEngine() + .GetFontSelector() + ->GetFontFaceCache() + ->GetNumSegmentedFacesForTesting()); + font_face = GetStyleEngine().GetFontSelector()->GetFontFaceCache()->Get( + t4->GetComputedStyle()->GetFontDescription(), AtomicString("Cool Font")); EXPECT_TRUE(font_face); capabilities = font_face->GetFontSelectionCapabilities(); ASSERT_EQ(capabilities.weight, @@ -403,11 +406,12 @@ // Now there are three fonts, but the newest one does not override the older, // better matching one. - EXPECT_EQ(3u, GetStyleEngine().GetFontSelector()->GetFontFaceCache() - ->GetNumSegmentedFacesForTesting()); - font_face = GetStyleEngine().GetFontSelector()->GetFontFaceCache() - ->Get(t4->GetComputedStyle()->GetFontDescription(), - AtomicString("Cool Font")); + EXPECT_EQ(3u, GetStyleEngine() + .GetFontSelector() + ->GetFontFaceCache() + ->GetNumSegmentedFacesForTesting()); + font_face = GetStyleEngine().GetFontSelector()->GetFontFaceCache()->Get( + t4->GetComputedStyle()->GetFontDescription(), AtomicString("Cool Font")); EXPECT_TRUE(font_face); capabilities = font_face->GetFontSelectionCapabilities(); ASSERT_EQ(capabilities.weight, @@ -421,11 +425,12 @@ // After removing the injected style sheet we're left with a bold-normal and // a normal-italic font, and the latter is selected by the matching algorithm // as font-style trumps font-weight. - EXPECT_EQ(2u, GetStyleEngine().GetFontSelector()->GetFontFaceCache() - ->GetNumSegmentedFacesForTesting()); - font_face = GetStyleEngine().GetFontSelector()->GetFontFaceCache() - ->Get(t4->GetComputedStyle()->GetFontDescription(), - AtomicString("Cool Font")); + EXPECT_EQ(2u, GetStyleEngine() + .GetFontSelector() + ->GetFontFaceCache() + ->GetNumSegmentedFacesForTesting()); + font_face = GetStyleEngine().GetFontSelector()->GetFontFaceCache()->Get( + t4->GetComputedStyle()->GetFontDescription(), AtomicString("Cool Font")); EXPECT_TRUE(font_face); capabilities = font_face->GetFontSelectionCapabilities(); ASSERT_EQ(capabilities.weight, @@ -4494,6 +4499,46 @@ EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kCSSAtRuleContainer)); } +TEST_F(StyleEngineTest, NestingUseCount) { + GetDocument().body()->setInnerHTML(R"HTML( + <style> + body { --x: No @nest or & rule here; } + </style> + )HTML"); + UpdateAllLifecyclePhases(); + EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kCSSNesting)); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + body { + & .foo { color: fuchsia; } + } + </style> + )HTML"); + UpdateAllLifecyclePhases(); + EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kCSSNesting)); +} + +TEST_F(StyleEngineTest, NestingUseCountAtNest) { + GetDocument().body()->setInnerHTML(R"HTML( + <style> + body { --x: No @nest rule or & here; } + </style> + )HTML"); + UpdateAllLifecyclePhases(); + EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kCSSNesting)); + + GetDocument().body()->setInnerHTML(R"HTML( + <style> + body { + @nest .foo & { color: lemonchiffon; } + } + </style> + )HTML"); + UpdateAllLifecyclePhases(); + EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kCSSNesting)); +} + TEST_F(StyleEngineTest, SystemFontsObeyDefaultFontSize) { // <input> get assigned "font: -webkit-small-control" in the UA sheet. Element* body = GetDocument().body();
diff --git a/third_party/blink/renderer/core/css/style_rule.cc b/third_party/blink/renderer/core/css/style_rule.cc index 179fc19..c42b06e 100644 --- a/third_party/blink/renderer/core/css/style_rule.cc +++ b/third_party/blink/renderer/core/css/style_rule.cc
@@ -347,14 +347,19 @@ CSSSelectorList::AdoptSelectorVector(selector_vector, SelectorArray()); } -// NOTE: Currently, this move constructor leaves the other object fully intact, -// since there's no benefit in not doing so. +StyleRule::StyleRule(base::PassKey<StyleRule>, + base::span<CSSSelector> selector_vector) + : StyleRuleBase(kStyle) { + CSSSelectorList::AdoptSelectorVector(selector_vector, SelectorArray()); +} + StyleRule::StyleRule(base::PassKey<StyleRule>, base::span<CSSSelector> selector_vector, StyleRule&& other) : StyleRuleBase(kStyle), properties_(other.properties_), - lazy_property_parser_(other.lazy_property_parser_) { + lazy_property_parser_(other.lazy_property_parser_), + child_rules_(std::move(other.child_rules_)) { CSSSelectorList::AdoptSelectorVector(selector_vector, SelectorArray()); } @@ -408,19 +413,35 @@ void StyleRule::TraceAfterDispatch(blink::Visitor* visitor) const { visitor->Trace(properties_); visitor->Trace(lazy_property_parser_); + visitor->Trace(child_rules_); + + const CSSSelector* current = SelectorArray(); + do { + visitor->Trace(*current); + } while (!(current++)->IsLastInSelectorList()); + StyleRuleBase::TraceAfterDispatch(visitor); } -StyleRulePage::StyleRulePage(CSSSelectorList selector_list, +void StyleRule::Reparent(StyleRule* old_parent, StyleRule* new_parent) { + for (CSSSelector* s = SelectorArray(); s; s = CSSSelectorList::Next(*s)) { + if (s->Match() == CSSSelector::kPseudoClass && + s->GetPseudoType() == CSSSelector::kPseudoParent) { + s->Reparent(old_parent, new_parent); + } + } +} + +StyleRulePage::StyleRulePage(CSSSelectorList* selector_list, CSSPropertyValueSet* properties) : StyleRuleBase(kPage), properties_(properties), - selector_list_(std::move(selector_list)) {} + selector_list_(selector_list) {} StyleRulePage::StyleRulePage(const StyleRulePage& page_rule) : StyleRuleBase(page_rule), properties_(page_rule.properties_->MutableCopy()), - selector_list_(page_rule.selector_list_.Copy()) {} + selector_list_(page_rule.selector_list_->Copy()) {} MutableCSSPropertyValueSet& StyleRulePage::MutableProperties() { if (!properties_->IsMutable()) @@ -431,6 +452,7 @@ void StyleRulePage::TraceAfterDispatch(blink::Visitor* visitor) const { visitor->Trace(properties_); visitor->Trace(layer_); + visitor->Trace(selector_list_); StyleRuleBase::TraceAfterDispatch(visitor); }
diff --git a/third_party/blink/renderer/core/css/style_rule.h b/third_party/blink/renderer/core/css/style_rule.h index 5433792..4ac74b67 100644 --- a/third_party/blink/renderer/core/css/style_rule.h +++ b/third_party/blink/renderer/core/css/style_rule.h
@@ -160,6 +160,13 @@ base::PassKey<StyleRule>(), selectors, lazy_property_parser); } + // See comment on the corresponding constructor. + static StyleRule* Create(base::span<CSSSelector> selectors) { + return MakeGarbageCollected<StyleRule>( + AdditionalBytesForSelectors(selectors.size()), + base::PassKey<StyleRule>(), selectors); + } + // Creates a StyleRule with the selectors changed (used by setSelectorText()). static StyleRule* Create(base::span<CSSSelector> selectors, StyleRule&& other) { @@ -180,6 +187,9 @@ StyleRule(base::PassKey<StyleRule>, base::span<CSSSelector> selector_vector, CSSLazyPropertyParser*); + // If you use this constructor, the object will not be fully constructed until + // you call SetProperties(). + StyleRule(base::PassKey<StyleRule>, base::span<CSSSelector> selector_vector); StyleRule(base::PassKey<StyleRule>, base::span<CSSSelector> selector_vector, StyleRule&&); @@ -187,6 +197,11 @@ StyleRule(const StyleRule&) = delete; ~StyleRule(); + void SetProperties(CSSPropertyValueSet* properties) { + DCHECK_EQ(properties_, nullptr); + properties_ = properties; + } + // Partial subset of the CSSSelector API. const CSSSelector* FirstSelector() const { return SelectorArray(); } const CSSSelector& SelectorAt(wtf_size_t index) const { @@ -226,6 +241,24 @@ void TraceAfterDispatch(blink::Visitor*) const; + const HeapVector<Member<StyleRule>>* ChildRules() const { + return child_rules_.Get(); + } + void AddChildRule(StyleRule* child) { + // Allocate the child rule vector only when we need it, + // since most rules won't have children (almost by definition). + if (child_rules_ == nullptr) { + child_rules_ = MakeGarbageCollected<HeapVector<Member<StyleRule>>>(); + } + child_rules_->push_back(child); + } + + // Move this rule from being a child of old_parent (which is only given for + // sake of DCHECK) to being a child of new_parent, updating parent pointers + // in the selector. This happens only when we need to reallocate a StyleRule + // because its selector changed. + void Reparent(StyleRule* old_parent, StyleRule* new_parent); + private: friend class CSSLazyParsingTest; bool HasParsedProperties() const; @@ -240,6 +273,7 @@ mutable Member<CSSPropertyValueSet> properties_; mutable Member<CSSLazyPropertyParser> lazy_property_parser_; + Member<HeapVector<Member<StyleRule>>> child_rules_; }; class CORE_EXPORT StyleRuleFontFace : public StyleRuleBase { @@ -266,15 +300,15 @@ class StyleRulePage : public StyleRuleBase { public: - StyleRulePage(CSSSelectorList, CSSPropertyValueSet*); + StyleRulePage(CSSSelectorList*, CSSPropertyValueSet*); StyleRulePage(const StyleRulePage&); - const CSSSelector* Selector() const { return selector_list_.First(); } + const CSSSelector* Selector() const { return selector_list_->First(); } const CSSPropertyValueSet& Properties() const { return *properties_; } MutableCSSPropertyValueSet& MutableProperties(); - void WrapperAdoptSelectorList(CSSSelectorList selectors) { - selector_list_ = std::move(selectors); + void WrapperAdoptSelectorList(CSSSelectorList* selectors) { + selector_list_ = selectors; } StyleRulePage* Copy() const { @@ -289,7 +323,7 @@ private: Member<CSSPropertyValueSet> properties_; // Cannot be null. Member<const CascadeLayer> layer_; - CSSSelectorList selector_list_; + Member<CSSSelectorList> selector_list_; }; class CORE_EXPORT StyleRuleProperty : public StyleRuleBase {
diff --git a/third_party/blink/renderer/core/css/style_scope.cc b/third_party/blink/renderer/core/css/style_scope.cc index 07eab53..a2cf771 100644 --- a/third_party/blink/renderer/core/css/style_scope.cc +++ b/third_party/blink/renderer/core/css/style_scope.cc
@@ -9,12 +9,12 @@ namespace blink { -StyleScope::StyleScope(CSSSelectorList from, absl::optional<CSSSelectorList> to) - : from_(std::move(from)), to_(std::move(to)) {} +StyleScope::StyleScope(CSSSelectorList* from, CSSSelectorList* to) + : from_(from), to_(to) {} StyleScope::StyleScope(const StyleScope& other) - : from_(other.from_.Copy()), - to_(other.to_ ? absl::make_optional(other.to_->Copy()) : absl::nullopt) {} + : from_(other.from_->Copy()), + to_(other.to_.Get() ? other.to_->Copy() : nullptr) {} StyleScope* StyleScope::CopyWithParent(const StyleScope* parent) const { StyleScope* copy = MakeGarbageCollected<StyleScope>(*this); @@ -25,7 +25,7 @@ unsigned StyleScope::Specificity() const { if (!specificity_.has_value()) { specificity_ = - from_.MaximumSpecificity() + (parent_ ? parent_->Specificity() : 0); + from_->MaximumSpecificity() + (parent_ ? parent_->Specificity() : 0); } return *specificity_; } @@ -33,8 +33,8 @@ StyleScope* StyleScope::Parse(CSSParserTokenRange prelude, const CSSParserContext* context, StyleSheetContents* style_sheet) { - absl::optional<CSSSelectorList> from; - absl::optional<CSSSelectorList> to; + CSSSelectorList* from = nullptr; + CSSSelectorList* to = nullptr; prelude.ConsumeWhitespace(); if (prelude.Peek().GetType() != kLeftParenthesisToken) @@ -66,7 +66,7 @@ if (!prelude.AtEnd()) return nullptr; - return MakeGarbageCollected<StyleScope>(std::move(*from), std::move(to)); + return MakeGarbageCollected<StyleScope>(from, to); } } // namespace blink
diff --git a/third_party/blink/renderer/core/css/style_scope.h b/third_party/blink/renderer/core/css/style_scope.h index 42db892f..e67d951 100644 --- a/third_party/blink/renderer/core/css/style_scope.h +++ b/third_party/blink/renderer/core/css/style_scope.h
@@ -18,18 +18,22 @@ class CORE_EXPORT StyleScope final : public GarbageCollected<StyleScope> { public: - StyleScope(CSSSelectorList from, absl::optional<CSSSelectorList> to); + StyleScope(CSSSelectorList* from, CSSSelectorList* to); StyleScope(const StyleScope&); static StyleScope* Parse(CSSParserTokenRange prelude, const CSSParserContext* context, StyleSheetContents* style_sheet); - void Trace(blink::Visitor* visitor) const { visitor->Trace(parent_); } + void Trace(blink::Visitor* visitor) const { + visitor->Trace(from_); + visitor->Trace(to_); + visitor->Trace(parent_); + } StyleScope* CopyWithParent(const StyleScope*) const; - const CSSSelectorList& From() const { return from_; } - const absl::optional<CSSSelectorList>& To() const { return to_; } + const CSSSelectorList& From() const { return *from_; } + const CSSSelectorList* To() const { return to_.Get(); } // May be nullptr. const StyleScope* Parent() const { return parent_.Get(); } // Specificity of the <scope-start> selector (::From()), plus the @@ -37,8 +41,8 @@ unsigned Specificity() const; private: - CSSSelectorList from_; - absl::optional<CSSSelectorList> to_; + Member<CSSSelectorList> from_; + Member<CSSSelectorList> to_; // May be nullptr. Member<const StyleScope> parent_; mutable absl::optional<unsigned> specificity_; };
diff --git a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc index 44e73d2..49e4b14 100644 --- a/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc +++ b/third_party/blink/renderer/core/document_transition/document_transition_style_tracker.cc
@@ -729,6 +729,18 @@ TransformationMatrix snapshot_matrix = layout_object->LocalToAbsoluteTransform(); + if (document_->GetLayoutView() + ->ShouldPlaceBlockDirectionScrollbarOnLogicalLeft()) { + // The SnapshotViewportRect offset below takes points from the fixed + // viewport into the snapshot viewport. However, the transform is + // currently into absolute coordinates; when the scrollbar appears on the + // left, the fixed viewport origin is actually at (15, 0) in absolute + // coordinates (assuming 15px scrollbars). Therefore we must first shift + // by the scrollbar width so we're in fixed viewport coordinates. + ScrollableArea& viewport = *document_->View()->LayoutViewport(); + snapshot_matrix.PostTranslate(-viewport.VerticalScrollbarWidth(), 0); + } + gfx::Vector2d snapshot_to_fixed_offset = -GetSnapshotViewportRect().OffsetFromOrigin(); snapshot_matrix.PostTranslate(snapshot_to_fixed_offset.x(), @@ -986,10 +998,18 @@ // TODO(bokan): Account for virtual-keyboard - // TODO(bokan): Handle left-hand side vertical scrollbars. - + // A left-side scrollbar (i.e. in an RTL writing-mode) should overlay the + // snapshot viewport as well. This cannot currently happen in Chrome but it + // can in other browsers. Handle this case in the event + // https://crbug.com/249860 is ever fixed. LocalFrameView& view = *document.View(); - right += view.LayoutViewport()->VerticalScrollbarWidth(); + if (document.GetLayoutView() + ->ShouldPlaceBlockDirectionScrollbarOnLogicalLeft()) { + left += view.LayoutViewport()->VerticalScrollbarWidth(); + } else { + right += view.LayoutViewport()->VerticalScrollbarWidth(); + } + bottom += view.LayoutViewport()->HorizontalScrollbarHeight(); gfx::Outsets outsets; @@ -1027,6 +1047,13 @@ int left = outsets.left(); int top = outsets.top(); + // Paint already applies an offset for a left-side vertical scrollbar so + // don't offset by it here again. + if (document_->GetLayoutView() + ->ShouldPlaceBlockDirectionScrollbarOnLogicalLeft()) { + left -= document_->View()->LayoutViewport()->VerticalScrollbarWidth(); + } + return gfx::Vector2d(left, top); }
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index 0b4458b..24e5f5b 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -4335,11 +4335,14 @@ // `fallback_base_url_for_srcdoc_` will only be sent from the frame host if // we are process isolating sandboxed srcdoc iframes (although when the // IsolateSandboxedIframes feature is enabled we will send it for all srcdoc - // iframes, not just sandboxed ones). If `fallback_base_url_for_srcdoc_` - // isn't sent, then we must still check that `ParentDocument()` is non-null, - // in case this function is called while the document is detached. + // iframes, not just sandboxed ones). The fallback base url will also be + // sent from the frame host if kNewBaseUrlInheritanceBehavior is enabled. + // If `fallback_base_url_for_srcdoc_` isn't sent, then we must still check + // that `ParentDocument()` is non-null, in case this function is called + // while the document is detached. // TODO(https://crbug.com/751329, https://crbug.com/1336904): Referring to // ParentDocument() is not correct. + DCHECK(!blink::features::IsNewBaseUrlInheritanceBehaviorEnabled()); if (ParentDocument()) return ParentDocument()->BaseURL(); }
diff --git a/third_party/blink/renderer/core/exported/web_selector.cc b/third_party/blink/renderer/core/exported/web_selector.cc index 4cfce73..ad63904 100644 --- a/third_party/blink/renderer/core/exported/web_selector.cc +++ b/third_party/blink/renderer/core/exported/web_selector.cc
@@ -43,26 +43,29 @@ // NOTE: We will always parse the selector in an insecure context mode, if we // have selectors which are only parsed in secure contexts, this will need to // accept a SecureContextMode as an argument. - Vector<CSSSelector> arena; + // + // TODO(crbug.com/1095675): If we get nested rules here, we'd need to make + // sure they don't return a parse error. + HeapVector<CSSSelector> arena; base::span<CSSSelector> selector_vector = CSSParser::ParseSelector( - StrictCSSParserContext(SecureContextMode::kInsecureContext), nullptr, - web_selector, arena); + StrictCSSParserContext(SecureContextMode::kInsecureContext), + /*parent_rule_for_nesting=*/nullptr, nullptr, web_selector, arena); if (selector_vector.empty()) { // Parse error. return {}; } - CSSSelectorList selector_list = + CSSSelectorList* selector_list = CSSSelectorList::AdoptSelectorVector(selector_vector); if (restriction == kWebSelectorTypeCompound) { - for (const CSSSelector* selector = selector_list.First(); selector; - selector = selector_list.Next(*selector)) { + for (const CSSSelector* selector = selector_list->First(); selector; + selector = selector_list->Next(*selector)) { if (!selector->IsCompound()) return {}; } } - return selector_list.SelectorsText(); + return selector_list->SelectorsText(); } } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5 index 63616e567..4f1d961 100644 --- a/third_party/blink/renderer/core/frame/settings.json5 +++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -311,6 +311,11 @@ initial: true, }, { + name: "placeRTLScrollbarsOnLeftSideInMainFrame", + initial: false, + invalidate: ["ScrollbarLayout"], + }, + { name: "webSecurityEnabled", initial: true, },
diff --git a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc index f245fc8..c56b080a 100644 --- a/third_party/blink/renderer/core/inspector/inspector_trace_events.cc +++ b/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
@@ -401,6 +401,7 @@ DEFINE_STRING_MAPPING(PseudoPageTransitionImageWrapper); DEFINE_STRING_MAPPING(PseudoPageTransitionIncomingImage); DEFINE_STRING_MAPPING(PseudoPageTransitionOutgoingImage); + DEFINE_STRING_MAPPING(PseudoParent) #undef DEFINE_STRING_MAPPING }
diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc index 7ddf9a9..c0ec7954 100644 --- a/third_party/blink/renderer/core/layout/layout_view.cc +++ b/third_party/blink/renderer/core/layout/layout_view.cc
@@ -292,8 +292,11 @@ NOT_DESTROYED(); LocalFrame& frame = GetFrameView()->GetFrame(); // See crbug.com/249860 - if (frame.IsOutermostMainFrame()) - return false; + if (frame.IsOutermostMainFrame()) { + Settings* settings = GetDocument().GetSettings(); + if (!settings || !settings->GetPlaceRTLScrollbarsOnLeftSideInMainFrame()) + return false; + } // <body> inherits 'direction' from <html>, so checking style on the body is // sufficient. if (Element* body = GetDocument().body()) {
diff --git a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource_test.cc b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource_test.cc index 20564b34..4c1ed03 100644 --- a/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource_test.cc +++ b/third_party/blink/renderer/core/loader/resource/css_style_sheet_resource_test.cc
@@ -288,23 +288,5 @@ ".foo{a:b}"); } -TEST_F(CSSStyleSheetResourceTest, TokenizerUsed) { - CSSStyleSheetResource* resource = CreateAndSaveTestStyleSheetResource(); - constexpr char kData[] = ".foo{}"; - resource->AppendData(kData, strlen(kData)); - - auto* parser_context = MakeGarbageCollected<CSSParserContext>( - kHTMLStandardMode, SecureContextMode::kInsecureContext); - auto* contents = MakeGarbageCollected<StyleSheetContents>(parser_context); - - resource->SetTokenizerForTesting( - CSSTokenizer::CreateCachedTokenizer(".foo{} .bar{}")); - contents->ParseAuthorStyleSheet(resource); - - // If the cached tokenizer is used, the resulting sheet should have 2 rules - // (.foo and .bar). - EXPECT_EQ(contents->RuleCount(), 2u); -} - } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc index a7d328f..99767cdfc 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc +++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.cc
@@ -856,7 +856,7 @@ } void MediaStreamVideoTrack::GetSettings( - MediaStreamTrackPlatform::Settings& settings) { + MediaStreamTrackPlatform::Settings& settings) const { DCHECK_CALLED_ON_VALID_THREAD(main_render_thread_checker_); if (!source_) return;
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h index 90078393..6abcf82 100644 --- a/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h +++ b/third_party/blink/renderer/modules/mediastream/media_stream_video_track.h
@@ -86,7 +86,7 @@ void SetContentHint( WebMediaStreamTrack::ContentHintType content_hint) override; void StopAndNotify(base::OnceClosure callback) override; - void GetSettings(MediaStreamTrackPlatform::Settings& settings) override; + void GetSettings(MediaStreamTrackPlatform::Settings& settings) const override; MediaStreamTrackPlatform::CaptureHandle GetCaptureHandle() override; void AddCropVersionCallback(uint32_t crop_version, base::OnceClosure callback) override;
diff --git a/third_party/blink/renderer/modules/webcodecs/hevc_encoder_config.idl b/third_party/blink/renderer/modules/webcodecs/hevc_encoder_config.idl new file mode 100644 index 0000000..41500ee --- /dev/null +++ b/third_party/blink/renderer/modules/webcodecs/hevc_encoder_config.idl
@@ -0,0 +1,14 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://github.com/WICG/web-codecs + +enum HevcBitstreamFormat { + "annexb", + "hevc", +}; + +dictionary HevcEncoderConfig { + HevcBitstreamFormat format = "hevc"; +};
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc index b4b08c5d..1f83442 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
@@ -46,6 +46,7 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_dom_exception.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_avc_encoder_config.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_encoded_video_chunk_metadata.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_hevc_encoder_config.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_svc_output_metadata.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_color_space_init.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_video_decoder_config.h" @@ -279,23 +280,43 @@ } // We are done with the parsing. - if (!config->hasAvc()) + if (!config->hasAvc() && !config->hasHevc()) return result; // We should only get here with H264 codecs. - if (result->codec != media::VideoCodec::kH264) { + if (result->codec != media::VideoCodec::kH264 && + result->codec != media::VideoCodec::kHEVC) { exception_state.ThrowTypeError( - "'avc' field can only be used with AVC codecs"); + "'avc/hevc' field can only be used with AVC/HEVC codecs"); return nullptr; } - std::string avc_format = IDLEnumAsString(config->avc()->format()).Utf8(); - if (avc_format == "avc") { - result->options.avc.produce_annexb = false; - } else if (avc_format == "annexb") { - result->options.avc.produce_annexb = true; - } else { - NOTREACHED(); + switch (result->codec) { + case media::VideoCodec::kH264: { + std::string avc_format = IDLEnumAsString(config->avc()->format()).Utf8(); + if (avc_format == "avc") { + result->options.avc.produce_annexb = false; + } else if (avc_format == "annexb") { + result->options.avc.produce_annexb = true; + } else { + NOTREACHED(); + } + break; + } + case media::VideoCodec::kHEVC: { + std::string hevc_format = + IDLEnumAsString(config->hevc()->format()).Utf8(); + if (hevc_format == "hevc") { + result->options.hevc.produce_annexb = false; + } else if (hevc_format == "annexb") { + result->options.hevc.produce_annexb = true; + } else { + NOTREACHED(); + } + break; + } + default: + break; } return result; @@ -328,6 +349,18 @@ return false; } break; +#if BUILDFLAG(ENABLE_PLATFORM_HEVC) + case media::VideoCodec::kHEVC: + if (config->profile != media::VideoCodecProfile::HEVCPROFILE_MAIN) { + if (exception_state) { + exception_state->ThrowDOMException( + DOMExceptionCode::kNotSupportedError, + "Unsupported hevc profile."); + } + return false; + } + break; +#endif case media::VideoCodec::kH264: { if (config->options.frame_size.width() % 2 != 0 || @@ -418,6 +451,12 @@ result->setAvc(avc); } + if (config.hasHevc() && config.hevc()->hasFormat()) { + auto* hevc = HevcEncoderConfig::Create(); + hevc->setFormat(config.hevc()->format()); + result->setHevc(hevc); + } + return result; }
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder_config.idl b/third_party/blink/renderer/modules/webcodecs/video_encoder_config.idl index ad11522..6f64c5b 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_encoder_config.idl +++ b/third_party/blink/renderer/modules/webcodecs/video_encoder_config.idl
@@ -24,6 +24,7 @@ [EnforceRange] unsigned long displayHeight; AvcEncoderConfig avc; + HevcEncoderConfig hevc; // Same as in WebRTC SVC (https://w3c.github.io/webrtc-svc/) DOMString scalabilityMode;
diff --git a/third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h b/third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h index b957c8d5..7f1d9b1 100644 --- a/third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h +++ b/third_party/blink/renderer/platform/mediastream/media_stream_track_platform.h
@@ -84,7 +84,7 @@ void Stop() { StopAndNotify(base::OnceClosure()); } // TODO(hta): Make method pure virtual when all tracks have the method. - virtual void GetSettings(Settings& settings) {} + virtual void GetSettings(Settings& settings) const {} virtual CaptureHandle GetCaptureHandle(); // Adds a one off callback that will be invoked when observing the first frame
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 7f0b5f8..480e6923 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -771,6 +771,13 @@ status: "stable" }, { + // Support for CSS Nesting Level 1. + // + // https://csswg.sesse.net/css-nesting-1/ + name: "CSSNesting", + status: "experimental" + }, + { name: "CSSObjectViewBox", status: "stable", },
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index 7685b34..3ecafd3 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -837,3 +837,5 @@ crbug.com/1361922 virtual/document-transition/wpt_internal/document-transition/old-content-captures-different-size.html [ Slow ] crbug.com/1361922 virtual/document-transition/wpt_internal/document-transition/new-content-captures-different-size.html [ Slow ] crbug.com/1361922 virtual/document-transition/wpt_internal/document-transition/japanese-tag.html [ Slow ] + +crbug.com/1372747 [ Win ] http/tests/uri/css-href.php [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 27852cd..c69e4c0 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -7081,8 +7081,6 @@ crbug.com/1357917 virtual/threaded/external/wpt/scroll-animations/css/scroll-timeline-default.html [ Failure Pass ] crbug.com/1357917 virtual/threaded/external/wpt/scroll-animations/css/scroll-timeline-default-writing-mode-rl.html [ Failure Pass ] -crbug.com/1358051 external/wpt/longtask-timing/containerTypes.html [ Failure Pass ] - # TODO(crbug.com/1358147): Re-enable this test virtual/plz-dedicated-worker/external/wpt/resource-timing/no-entries-for-cross-origin-css-fetched-memory-cache.sub.html [ Skip ] @@ -7185,7 +7183,6 @@ crbug.com/1359788 virtual/orb-v02/external/wpt/fetch/corb/img-svg-doctype-html-mimetype-svg.sub.html [ Failure ] # Sheriff 2022-09-29 -crbug.com/1368855 external/wpt/longtask-timing/containerNames.html [ Failure Pass ] crbug.com/1369642 [ Mac ] external/wpt/encoding/unsupported-labels.window.html [ Failure Timeout ] # Temporarily expect timeouts related to post message blocking
diff --git a/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156.html b/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156.html index be1a0aa9..c919f91 100644 --- a/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156.html +++ b/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156.html
@@ -4,7 +4,7 @@ <title>Syntax and parsing</title> <style type="text/css"> p { background: lime; } - foo & address, p { background: red; } + foo % address, p { background: red; } </style> <link rel="first" href="css3-modsel-1.html" title="Groups of selectors"> <link rel="prev" href="css3-modsel-155d.html" title="Syntax and parsing"> @@ -16,4 +16,4 @@ <body> <p>This line should have a green background.</p> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156b.html b/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156b.html index 625b27a4..32f3ca4 100644 --- a/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156b.html +++ b/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156b.html
@@ -3,7 +3,7 @@ <head> <title>Syntax and parsing</title> <style type="text/css"> - foo & address, p { background: red; } + foo % address, p { background: red; } p { background: lime; } </style> <link rel="first" href="css3-modsel-1.html" title="Groups of selectors">
diff --git a/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156c.html b/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156c.html index c0570ca..96c2ba30 100644 --- a/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156c.html +++ b/third_party/blink/web_tests/css3/selectors3/html/css3-modsel-156c.html
@@ -3,7 +3,7 @@ <head> <title>Syntax and parsing</title> <style type="text/css"> - foo & address, p { background: red ! important; } + foo % address, p { background: red ! important; } p { background: lime; } </style> <link rel="first" href="css3-modsel-1.html" title="Groups of selectors"> @@ -16,4 +16,4 @@ <body> <p>This line should have a green background.</p> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156.xml b/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156.xml index ab82f2a7..d69e0a03 100644 --- a/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156.xml +++ b/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156.xml
@@ -4,7 +4,7 @@ <title>Syntax and parsing</title> <style type="text/css"><![CDATA[ p { background: lime; } - foo & address, p { background: red; } + foo % address, p { background: red; } ]]></style> <link rel="first" href="css3-modsel-1.xml" title="Groups of selectors"/> <link rel="prev" href="css3-modsel-155d.xml" title="Syntax and parsing"/> @@ -16,4 +16,4 @@ <body> <p>This line should have a green background.</p> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156b.xml b/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156b.xml index d29b4a2..e0ff2b21 100644 --- a/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156b.xml +++ b/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156b.xml
@@ -3,7 +3,7 @@ <head> <title>Syntax and parsing</title> <style type="text/css"><![CDATA[ - foo & address, p { background: red; } + foo % address, p { background: red; } p { background: lime; } ]]></style> <link rel="first" href="css3-modsel-1.xml" title="Groups of selectors"/>
diff --git a/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156c.xml b/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156c.xml index 4e30289..69030b0 100644 --- a/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156c.xml +++ b/third_party/blink/web_tests/css3/selectors3/xhtml/css3-modsel-156c.xml
@@ -3,7 +3,7 @@ <head> <title>Syntax and parsing</title> <style type="text/css"><![CDATA[ - foo & address, p { background: red ! important; } + foo % address, p { background: red ! important; } p { background: lime; } ]]></style> <link rel="first" href="css3-modsel-1.xml" title="Groups of selectors"/> @@ -16,4 +16,4 @@ <body> <p>This line should have a green background.</p> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156.css b/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156.css index fcc4633..d7bd7fc4 100644 --- a/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156.css +++ b/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156.css
@@ -1,3 +1,3 @@ p { background: lime; } - foo & address, p { background: red; } + foo % address, p { background: red; }
diff --git a/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156b.css b/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156b.css index f27409e..892d3ff 100644 --- a/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156b.css +++ b/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156b.css
@@ -1,3 +1,3 @@ - foo & address, p { background: red; } + foo % address, p { background: red; } p { background: lime; }
diff --git a/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156c.css b/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156c.css index ca7f7be2..4c83ff3fc 100644 --- a/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156c.css +++ b/third_party/blink/web_tests/css3/selectors3/xml/css3-modsel-156c.css
@@ -1,3 +1,3 @@ - foo & address, p { background: red ! important; } + foo % address, p { background: red ! important; } p { background: lime; }
diff --git a/third_party/blink/web_tests/external/wpt/cookies/samesite/get_all_cookies-default-samesite.html b/third_party/blink/web_tests/external/wpt/cookies/samesite/get_all_cookies-default-samesite.html index 22727e39..099ac511 100644 --- a/third_party/blink/web_tests/external/wpt/cookies/samesite/get_all_cookies-default-samesite.html +++ b/third_party/blink/web_tests/external/wpt/cookies/samesite/get_all_cookies-default-samesite.html
@@ -10,12 +10,9 @@ document.cookie = "test0=0"; const cookies = await test_driver.get_all_cookies(); assert_equals(cookies.length, 1); - let cookieMap = new Map(); - for (const cookie of cookies) { - cookieMap.set(cookie["name"], cookie); - } - assert_equals(cookieMap.get("test0")["name"], "test0"); - assert_equals(cookieMap.get("test0")["value"], "0"); - assert_equals(cookieMap.get("test0")["sameSite"], "Lax"); + const cookie = cookies[0]; + assert_equals(cookie["name"], "test0"); + assert_equals(cookie["value"], "0"); + assert_equals(cookie["sameSite"], "Lax"); }, "Get all cookies w/ default SameSite"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156.xml b/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156.xml index f52b98f8..4717fb8a 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156.xml +++ b/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156.xml
@@ -4,7 +4,7 @@ <title>Syntax and parsing</title> <style type="text/css"><![CDATA[ p { background: lime; } - foo & address, p { background: red; } + foo % address, p { background: red; } ]]></style> <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/> <link rel="help" href="https://www.w3.org/TR/css3-selectors/#selectors"/> <!-- bogus link to make sure it gets found --> @@ -13,4 +13,4 @@ <body> <p>This line should have a green background.</p> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156b.xml b/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156b.xml index 2f8ed88..28a6c985 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156b.xml +++ b/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156b.xml
@@ -3,7 +3,7 @@ <head> <title>Syntax and parsing</title> <style type="text/css"><![CDATA[ - foo & address, p { background: red; } + foo % address, p { background: red; } p { background: lime; } ]]></style> <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156c.xml b/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156c.xml index 3a15c82..cb888e1e 100644 --- a/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156c.xml +++ b/third_party/blink/web_tests/external/wpt/css/selectors/old-tests/css3-modsel-156c.xml
@@ -3,7 +3,7 @@ <head> <title>Syntax and parsing</title> <style type="text/css"><![CDATA[ - foo & address, p { background: red ! important; } + foo % address, p { background: red ! important; } p { background: lime; } ]]></style> <link rel="author" title="Ian Hickson" href="mailto:ian@hixie.ch"/> @@ -13,4 +13,4 @@ <body> <p>This line should have a green background.</p> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/external/wpt/dom/nodes/selectors.js b/third_party/blink/web_tests/external/wpt/dom/nodes/selectors.js index decc983..5e05547c9 100644 --- a/third_party/blink/web_tests/external/wpt/dom/nodes/selectors.js +++ b/third_party/blink/web_tests/external/wpt/dom/nodes/selectors.js
@@ -26,7 +26,7 @@ {name: "Invalid class", selector: "..test"}, {name: "Invalid class", selector: ".foo..quux"}, {name: "Invalid class", selector: ".bar."}, - {name: "Invalid combinator", selector: "div & address, p"}, + {name: "Invalid combinator", selector: "div % address, p"}, {name: "Invalid combinator", selector: "div ++ address, p"}, {name: "Invalid combinator", selector: "div ~~ address, p"}, {name: "Invalid [att=value] selector", selector: "[*=test]"},
diff --git a/third_party/blink/web_tests/external/wpt/longtask-timing/containerNames.html b/third_party/blink/web_tests/external/wpt/longtask-timing/containerNames.html index 90dcd6d..e6a9335 100644 --- a/third_party/blink/web_tests/external/wpt/longtask-timing/containerNames.html +++ b/third_party/blink/web_tests/external/wpt/longtask-timing/containerNames.html
@@ -11,19 +11,17 @@ const longContainerName = 'iframeWithLongNameMoreThan100CharactersSpaceHolderSpaceHolderSpaceHolderSpaceHolderSpaceHolderSpaceHolder'; promise_test(async t => { -assert_implements(window.PerformanceLongTaskTiming, 'Longtasks are not supported.'); -const initialTime = performance.now(); -return new Promise(resolve => { + assert_implements(window.PerformanceLongTaskTiming, 'Longtasks are not supported.'); + const initialTime = performance.now(); + const performanceObserverTimeout = 5 * 1000; + const longTasksPromise = new Promise(resolve => { const observer = new PerformanceObserver(t.step_func(entryList => { - const entries = entryList.getEntries(); - assert_equals(entries.length, 1, - 'Exactly one entry is expected.'); - const longtask = entries[0]; + const entries = entryList.getEntries(); + entries.forEach(longtask => { assert_equals(longtask.entryType, 'longtask'); - if (longtask.name == 'self' || - longtask.name == 'multiple-contexts' || - longtask.name == 'unknown') + if (hasUnrelatedTaskName(longtask.name, 'same-origin-descendant')) { return; + } checkLongTaskEntry(longtask, 'same-origin-descendant'); // Assert the TaskAttributionTiming entry in attribution. assert_equals(longtask.attribution.length, 1, @@ -38,6 +36,7 @@ assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html'); observer.disconnect(); resolve(); + }) })); observer.observe({entryTypes: ['longtask']}); const iframe = document.createElement('iframe'); @@ -45,7 +44,13 @@ iframe.name = longContainerName + '-name'; iframe.src = 'resources/subframe-with-longtask.html'; document.body.appendChild(iframe); -}); + }); + const timeout = new Promise( + (resolve, reject) => t.step_timeout( + () => { reject(new Error('observer failed to find any entries')) }, + performanceObserverTimeout) + ) + return Promise.race([longTasksPromise, timeout]); }, `Performance longtask entries in ${longContainerName} are observable in parent.`); </script> </body>
diff --git a/third_party/blink/web_tests/external/wpt/longtask-timing/containerTypes.html b/third_party/blink/web_tests/external/wpt/longtask-timing/containerTypes.html index 2d48bf7..0e25805 100644 --- a/third_party/blink/web_tests/external/wpt/longtask-timing/containerTypes.html +++ b/third_party/blink/web_tests/external/wpt/longtask-timing/containerTypes.html
@@ -12,6 +12,7 @@ this.name = name; this.src = src; } + const Containers = [ new Container('iframe', 'src'), new Container('frame', 'src'), @@ -22,39 +23,44 @@ promise_test(async t => { assert_implements(window.PerformanceLongTaskTiming, 'Longtasks are not supported.'); const initialTime = performance.now(); - return new Promise(resolve => { + const performanceObserverTimeout = 5 * 1000; + const testLongTaskEntry = new Promise(resolve => { const observer = new PerformanceObserver(t.step_func(entryList => { const entries = entryList.getEntries(); - assert_equals(entries.length, 1, - 'Exactly one entry is expected.'); - const longtask = entries[0]; - assert_equals(longtask.entryType, 'longtask'); - if (longtask.name == 'self' || - longtask.name == 'multiple-contexts' || - longtask.name == 'unknown') - return; - checkLongTaskEntry(longtask, 'same-origin-descendant'); - // Assert the TaskAttributionTiming entry in attribution. - assert_equals(longtask.attribution.length, 1, - 'Exactly one attribution entry is expected'); - const attribution = longtask.attribution[0]; - assert_equals(attribution.entryType, 'taskattribution'); - assert_equals(attribution.name, 'unknown'); - assert_equals(attribution.duration, 0); - assert_equals(attribution.startTime, 0); - assert_equals(attribution.containerId, container.name + '-id'); - assert_equals(attribution.containerName, container.name + '-name'); - assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html'); - observer.disconnect(); - resolve(); + entries.forEach(longtask => { + assert_equals(longtask.entryType, 'longtask'); + if (hasUnrelatedTaskName(longtask.name, 'same-origin-descendant')) { + return; + } + checkLongTaskEntry(longtask, 'same-origin-descendant'); + // Assert the TaskAttributionTiming entry in attribution. + assert_equals(longtask.attribution.length, 1, + 'Exactly one attribution entry is expected'); + const attribution = longtask.attribution[0]; + assert_equals(attribution.entryType, 'taskattribution'); + assert_equals(attribution.name, 'unknown'); + assert_equals(attribution.duration, 0); + assert_equals(attribution.startTime, 0); + assert_equals(attribution.containerId, container.name + '-id'); + assert_equals(attribution.containerName, container.name + '-name'); + assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html'); + observer.disconnect(); + resolve(); + }); })); - observer.observe({entryTypes: ['longtask']}); + observer.observe({ entryTypes: ['longtask'], buffered: false }); const containerObject = document.createElement(container.name); containerObject.id = container.name + '-id'; containerObject.name = container.name + '-name'; containerObject[container.src] = 'resources/subframe-with-longtask.html'; document.body.appendChild(containerObject); }); + const timeout = new Promise( + (resolve, reject) => t.step_timeout( + () => { reject(new Error('observer failed to find any entries')) }, + performanceObserverTimeout) + ); + return Promise.race([testLongTaskEntry, timeout]); }, `Performance longtask entries in ${container.name} are observable in parent.`); }); </script>
diff --git a/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-childiframe.html b/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-childiframe.html index bc7d69c6..6618a88 100644 --- a/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-childiframe.html +++ b/third_party/blink/web_tests/external/wpt/longtask-timing/longtask-in-childiframe.html
@@ -10,45 +10,54 @@ <h1>Long Task in Nested Child Iframe</h1> <div id="log"></div> <script> - const initialTime = performance.now(); - async_test(function (t) { + promise_test(async (t) => { assert_implements(window.PerformanceLongTaskTiming, 'Longtasks are not supported.'); + const initialTime = performance.now(); + const performanceObserverTimeout = 5 * 1000; + const longTasksPromise = new Promise(resolve => { const observer = new PerformanceObserver( - t.step_func(function (entryList) { - const entries = entryList.getEntries(); - assert_equals(entries.length, 1, - 'Exactly one entry is expected.'); - const longtask = entries[0]; - assert_equals(longtask.entryType, 'longtask'); - if (longtask.name == 'self' || - longtask.name == 'multiple-contexts' || - longtask.name == 'unknown') - return; - checkLongTaskEntry(longtask, 'same-origin-descendant'); - // Assert the TaskAttributionTiming entry in attribution. - assert_equals(longtask.attribution.length, 1, - 'Exactly one attribution entry is expected'); - const attribution = longtask.attribution[0]; - assert_equals(attribution.entryType, 'taskattribution'); - assert_equals(attribution.name, 'unknown'); - assert_equals(attribution.duration, 0); - assert_equals(attribution.startTime, 0); - assert_equals(attribution.containerType, 'iframe'); - assert_equals(attribution.containerId, 'child-iframe-id'); - assert_equals(attribution.containerName, 'child-iframe-name'); - assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html'); - observer.disconnect(); - t.done(); + t.step_func(function (entryList) { + const entries = entryList.getEntries(); + entries.forEach(longtask => { + assert_equals(longtask.entryType, 'longtask'); + if (hasUnrelatedTaskName(longtask.name, 'same-origin-descendant')) { + return; + } + checkLongTaskEntry(longtask, 'same-origin-descendant'); + // Assert the TaskAttributionTiming entry in attribution. + assert_equals(longtask.attribution.length, 1, + 'Exactly one attribution entry is expected'); + const attribution = longtask.attribution[0]; + assert_equals(attribution.entryType, 'taskattribution'); + assert_equals(attribution.name, 'unknown'); + assert_equals(attribution.duration, 0); + assert_equals(attribution.startTime, 0); + assert_equals(attribution.containerType, 'iframe'); + assert_equals(attribution.containerId, 'child-iframe-id'); + assert_equals(attribution.containerName, 'child-iframe-name'); + assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html'); + observer.disconnect(); + resolve(); }) + }) ); - observer.observe({entryTypes: ['longtask']}); - window.onload = () => { - const iframe = document.createElement('iframe'); - iframe.id = 'child-iframe-id'; - iframe.name = 'child-iframe-name'; - document.body.appendChild(iframe); - iframe.src = 'resources/subframe-with-longtask.html'; - }; + observer.observe({ + entryTypes: ['longtask'] + }); + const iframe = document.createElement('iframe'); + iframe.id = 'child-iframe-id'; + iframe.name = 'child-iframe-name'; + document.body.appendChild(iframe); + iframe.src = 'resources/subframe-with-longtask.html'; + }); + const timeout = new Promise( + (resolve, reject) => t.step_timeout( + () => { + reject(new Error('observer failed to find any entries')) + }, + performanceObserverTimeout) + ) + return Promise.race([longTasksPromise, timeout]); }, 'Performance longtask entries in child iframe are observable in parent.'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/longtask-timing/resources/utils.js b/third_party/blink/web_tests/external/wpt/longtask-timing/resources/utils.js index c022f1a5..36bd6c7b 100644 --- a/third_party/blink/web_tests/external/wpt/longtask-timing/resources/utils.js +++ b/third_party/blink/web_tests/external/wpt/longtask-timing/resources/utils.js
@@ -6,4 +6,8 @@ assert_greater_than_equal(longtask.startTime, 0); const currentTime = performance.now(); assert_less_than_equal(longtask.startTime, currentTime); -} \ No newline at end of file +} + +function hasUnrelatedTaskName(taskName, expectedTaskName) { + return (taskName !== expectedTaskName); +}
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/navigation-id-initial-load.tentative.html b/third_party/blink/web_tests/external/wpt/performance-timeline/navigation-id-initial-load.tentative.html new file mode 100644 index 0000000..3228e127 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/performance-timeline/navigation-id-initial-load.tentative.html
@@ -0,0 +1,43 @@ +<!DOCTYPE HTML> +<meta name="timeout" content="long"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<!-- +Navigation timing, LCP and paint timing entries are only emitted during initial +load, not after a bfcache navigation. Therefore we only verify the existence of +navigation id, not the increment. +--> + +<body> + <p>This text is to trigger a LCP entry emission.</p> + <script> + async function NavigationIdsFromLCP() { + return new Promise(resolve => { + new PerformanceObserver((entryList) => { + resolve(entryList.getEntries()); + }).observe({ type: 'largest-contentful-paint', buffered: true }); + }) + } + + promise_test(async t => { + // Assert navigation id exists in LCP entries and is the default value 1. + const navigationIds = await NavigationIdsFromLCP(); + assert_true(navigationIds.every(e => e.navigationId == 1), 'Navigation Id\ + of LCP entries should be default value 1 at initial navigations'); + + // Assert navigation id exists in a NavigationTiming entry and is the + // default value 1. + const navigationId = performance.getEntriesByType('navigation')[0].navigationId; + assert_equals(navigationId, 1, 'Navigation Id of an navigation timing\ + entry should be default value 1 at initial navigations'); + + // Assert navigation id exists in PaintTiming entries and is the default + // value 1. + assert_true(performance.getEntriesByType('paint').every(e => + e.navigationId == 1), + 'Navigation Id of PaintTiming entries should be default value 1 at\ + initial navigations.'); + + }, 'Navigation Id should be 1 at initial navigations.'); + </script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-in-data-url-context.window.js b/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-in-data-url-context.window.js index 1b1ce23..1249140 100644 --- a/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-in-data-url-context.window.js +++ b/third_party/blink/web_tests/external/wpt/workers/dedicated-worker-in-data-url-context.window.js
@@ -29,8 +29,9 @@ </script> `; + const p = new Promise(r => window.onmessage = e => r(e.data)); const frame = await with_iframe(`data:text/html;base64,${btoa(frameCode)}`); - const result = await new Promise(r => window.onmessage = e => r(e.data)); + const result = await p; assert_equals(result, 'PASS'); }, 'Create a dedicated worker in a data url frame'); @@ -82,8 +83,9 @@ </script> `; + const p = new Promise(r => window.onmessage = e => r(e.data)); const frame = await with_iframe(`data:text/html;base64,${btoa(frameCode)}`); - const result = await new Promise(r => window.onmessage = e => r(e.data)); + const result = await p; assert_equals(result, 'PASS'); }, 'Create a data url dedicated worker in a data url frame');
diff --git a/third_party/blink/web_tests/external/wpt/workers/shared-worker-in-data-url-context.window.js b/third_party/blink/web_tests/external/wpt/workers/shared-worker-in-data-url-context.window.js index f0cc98b..b768c81 100644 --- a/third_party/blink/web_tests/external/wpt/workers/shared-worker-in-data-url-context.window.js +++ b/third_party/blink/web_tests/external/wpt/workers/shared-worker-in-data-url-context.window.js
@@ -29,8 +29,9 @@ </script> `; + const p = new Promise(r => window.onmessage = e => r(e.data)); const frame = await with_iframe(`data:text/html;base64,${btoa(frameCode)}`); - const result = await new Promise(r => window.onmessage = e => r(e.data)); + const result = await p; assert_equals(result, 'PASS'); }, 'Create a shared worker in a data url frame'); @@ -57,7 +58,8 @@ </script> `; + const p = new Promise(r => window.onmessage = e => r(e.data)); const frame = await with_iframe(`data:text/html;base64,${btoa(frameCode)}`); - const result = await new Promise(r => window.onmessage = e => r(e.data)); + const result = await p; assert_equals(result, 'PASS'); }, 'Create a data url shared worker in a data url frame');
diff --git a/third_party/blink/web_tests/fast/selectors/156b.html b/third_party/blink/web_tests/fast/selectors/156b.html index 5a5c0c5..fb296cfa 100644 --- a/third_party/blink/web_tests/fast/selectors/156b.html +++ b/third_party/blink/web_tests/fast/selectors/156b.html
@@ -3,7 +3,7 @@ <head> <title>Syntax and parsing</title> <style type="text/css"> - foo & address, p { background: red; } + foo % address, p { background: red; } p { background: lime; } </style> <link rel="first" href="css3-modsel-1.html" title="Groups of selectors">
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/rtl-vertical-scrollbar-ref.html b/third_party/blink/web_tests/wpt_internal/document-transition/rtl-vertical-scrollbar-ref.html new file mode 100644 index 0000000..f4f731f --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/rtl-vertical-scrollbar-ref.html
@@ -0,0 +1,41 @@ +<!DOCTYPE html> +<html dir="rtl"> +<title>Shared transitions: outgoing viewport has scrollbars (ref)</title> +<link rel="help" href="https://github.com/WICG/shared-element-transitions"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7859"> +<link rel="author" href="mailto:bokan@chromium.org"> +<style> + html { + background-color: lightpink; + } + + .root { + background-image: + linear-gradient(45deg, #000 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, #000 75%), + linear-gradient(45deg, transparent 75%, #000 75%), + linear-gradient(45deg, #000 25%, lightgreen 25%); + background-size: 200px 200px; + background-position: 0 0, 0 0, -100px -100px, 100px 100px; + width: 700px; + height: 1000px; + } + + .shared { + position: fixed; + /* 15 px offset from the test since we hide the scrollbar. */ + left: 85px; + top: 20px; + height: 500px; + width: 100px; + background-color: deepskyblue; + } +</style> +<script> + if (window.internals) { + window.internals.settings.setPlaceRTLScrollbarsOnLeftSideInMainFrame(true); + } +</script> +<div class="root"></div> +<div class="shared"></div> +</html>
diff --git a/third_party/blink/web_tests/wpt_internal/document-transition/rtl-vertical-scrollbar.html b/third_party/blink/web_tests/wpt_internal/document-transition/rtl-vertical-scrollbar.html new file mode 100644 index 0000000..d91e6ed2 --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/document-transition/rtl-vertical-scrollbar.html
@@ -0,0 +1,77 @@ +<!DOCTYPE html> +<meta name="timeout" content="long"> +<html dir="rtl" class=reftest-wait> +<title>Shared transitions: outgoing viewport has a left side vertucal scrollbar</title> +<link rel="help" href="https://github.com/WICG/shared-element-transitions"> +<link rel="help" href="https://github.com/w3c/csswg-drafts/issues/7859"> +<link rel="author" href="mailto:bokan@chromium.org"> +<link rel="match" href="rtl-vertical-scrollbar-ref.html"> +<script src="/common/reftest-wait.js"></script> +<meta name=fuzzy content="0-40;0-20000"> +<style> + html { + background-color: lightpink; + overflow: hidden; + } + + .root { + /* Draw a checkerboard pattern to make sure the snapshot is captured at the + * full size, rather than scaled. */ + background-image: + linear-gradient(45deg, #000 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, #000 75%), + linear-gradient(45deg, transparent 75%, #000 75%), + linear-gradient(45deg, #000 25%, lightgreen 25%); + background-size: 200px 200px; + background-position: 0 0, 0 0, -100px -100px, 100px 100px; + width: 700px; + height: 1000px; + } + + .shared { + position: fixed; + left: 100px; + top: 20px; + height: 500px; + width: 100px; + background-color: deepskyblue; + contain: paint; + page-transition-tag: sharedelement; + } + + /* We're verifying what we capture, so just display the old contents for 5 minutes. */ + html::page-transition-incoming-image(*) { animation: unset; opacity: 0; } + html::page-transition-outgoing-image(*) { + animation-duration: 300s; + animation-timing-function: steps(1, end); + } + html::page-transition-container(*) { + animation-duration: 300s; + animation-timing-function: steps(1, end); + } +</style> + +<div class="root"></div> +<div class="shared"></div> +<script> +// Ensure a root snapshot captured on a page with scrollbars uses the full +// viewport size (including scrollbars). Areas obscured by scrollbars should be +// filled with background and content; the snapshot should not be scaled-to-fit. +async function runTest() { + let t = document.createDocumentTransition(); + t.start(() => { + document.documentElement.style.overflow = "unset"; + requestAnimationFrame( + () => requestAnimationFrame( + () => requestAnimationFrame(takeScreenshot))); + }); +} +onload = () => { + if (window.internals) { + window.internals.settings.setPlaceRTLScrollbarsOnLeftSideInMainFrame(true); + } + requestAnimationFrame(() => requestAnimationFrame(runTest)); +} + +</script> +
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium index 0e7ef589..6a5d50c 100644 --- a/third_party/freetype/README.chromium +++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@ Name: FreeType URL: http://www.freetype.org/ -Version: VER-2-12-1-105-g5182264a4 -Revision: 5182264a40e70ff31be0a0ec8a0d5ffb5f65582e +Version: VER-2-12-1-108-g8493877e7 +Revision: 8493877e78596cf7fe8eb008708070e3852d104a CPEPrefix: cpe:/a:freetype:freetype:2.11.1 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent JPEG Group) licenses"
diff --git a/tools/binary_size/generate_milestone_reports.py b/tools/binary_size/generate_milestone_reports.py index a30bfa6b..53defe2 100755 --- a/tools/binary_size/generate_milestone_reports.py +++ b/tools/binary_size/generate_milestone_reports.py
@@ -95,6 +95,7 @@ '104.0.5112.9', '105.0.5195.7', '106.0.5249.7', + '107.0.5304.14', ]
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 6a93dc0e..5ca67b9 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -9236,6 +9236,21 @@ <int value="762" label="CREDIT_CARD_STANDALONE_VERIFICATION_CODE - Predictions different - Value agrees with both predictions"/> + <int value="769" label="NUMERIC_QUANTITY - Predictions equal - Value agrees"/> + <int value="770" + label="NUMERIC_QUANTITY - Predictions equal - Value disagrees"/> + <int value="771" + label="NUMERIC_QUANTITY - Predictions different - Value agrees with old + prediction"/> + <int value="772" + label="NUMERIC_QUANTITY - Predictions different - Value agrees with new + prediction"/> + <int value="773" + label="NUMERIC_QUANTITY - Predictions different - Value agrees with + neither prediction"/> + <int value="774" + label="NUMERIC_QUANTITY - Predictions different - Value agrees with + both predictions"/> </enum> <enum name="AutofillPredictionSource"> @@ -9516,6 +9531,7 @@ <int value="125" label="IBAN_VALUE"/> <int value="126" label="CREDIT_CARD_STANDALONE_VERIFICATION_CODE"/> <int value="127" label="RESERVED"/> + <int value="128" label="NUMERIC_QUANTITY"/> </enum> <enum name="AutofillServerPredictionAvailability"> @@ -20984,6 +21000,18 @@ <int value="2" label="HFP_CODEC_ID_MSBC"/> </enum> +<enum name="CrasHfpMicSuperResolutionStatus"> + <summary> + List of status types of Super Resolution for the bluetooth microphone audio. + This list should be aligned with CRAS: + https://chromium.googlesource.com/chromiumos/third_party/adhd/+/main/cras/src/server/cras_server_metrics.h + </summary> + <int value="0" label="CRAS_METRICS_HFP_MIC_SR_ENABLE_SUCCESS"/> + <int value="1" label="CRAS_METRICS_HFP_MIC_SR_ENABLE_FAILED"/> + <int value="2" label="CRAS_METRICS_HFP_MIC_SR_FEATURE_DISABLED"/> + <int value="3" label="CRAS_METRICS_HFP_MIC_SR_DLC_UNAVAILABLE"/> +</enum> + <enum name="CrasHfpScoError"> <summary> List of results(success or error code) of setting up a SCO connection for @@ -41639,6 +41667,7 @@ <int value="4369" label="SerivceWorkerFallbackMainResource"/> <int value="4370" label="GetDisplayMediaWithoutUserActivation"/> <int value="4371" label="BackForwardCacheNotRestoredReasons"/> + <int value="4372" label="CSSNesting"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -58175,6 +58204,7 @@ <int value="-1282992935" label="AutofillLocalCardMigrationShowFeedback:disabled"/> <int value="-1282488703" label="LocationBarModelOptimizations:enabled"/> + <int value="-1282433319" label="WebRtcAllowInputVolumeAdjustment:enabled"/> <int value="-1281465357" label="MacV2GPUSandbox:disabled"/> <int value="-1280673966" label="PluginVmFullscreen:disabled"/> <int value="-1280274244" label="OmniboxClosePopupWithEscape:disabled"/> @@ -58908,6 +58938,7 @@ label="disable_idle_sockets_close_on_memory_pressure:disabled"/> <int value="-856016114" label="NTPOfflinePages:disabled"/> <int value="-855513281" label="SyncRequiresPoliciesLoaded:disabled"/> + <int value="-855433657" label="WebRtcAllowInputVolumeAdjustment:disabled"/> <int value="-855277252" label="CookiesWithoutSameSiteMustBeSecure:disabled"/> <int value="-855130893" label="enable-touch-calibration-setting"/> <int value="-854716639" label="TranslateAndroidManualTrigger:enabled"/> @@ -63115,6 +63146,7 @@ <int value="1712697097" label="QuickAnswersV2:disabled"/> <int value="1712880335" label="FiltersInRecents:enabled"/> <int value="1713230497" label="ColorCorrectRendering:disabled"/> + <int value="1713509078" label="NewBaseUrlInheritanceBehavior:enabled"/> <int value="1714016217" label="EnableHeuristicPalmDetectionFilter:enabled"/> <int value="1714520147" label="MBIMode:disabled"/> <int value="1714746366" label="BookmarksImprovedSaveFlow:disabled"/> @@ -63547,6 +63579,7 @@ <int value="1973376634" label="WebXRMultiGpu:enabled"/> <int value="1974565950" label="enable-experimental-accessibility-labels"/> <int value="1974776131" label="MediaFeeds:disabled"/> + <int value="1975327115" label="NewBaseUrlInheritanceBehavior:disabled"/> <int value="1975657253" label="ScalableAppList:disabled"/> <int value="1976644015" label="enable-forbid-sync-xhr-in-page-dismissal"/> <int value="1976885976" label="DefaultChatWebApp:disabled"/> @@ -82252,6 +82285,8 @@ <int value="26" label="kCommanderFrontend"/> <int value="27" label="kDiceWebSigninInterceptionBubble"/> <int value="28" label="kHistoryMenuBridge"/> + <int value="29" label="kLacrosMainProfile"/> + <int value="30" label="kProfileCreationSamlFlow"/> </enum> <enum name="ProfileMenuActionableItem">
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index 67b7d5f1..60c0d30 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -280,6 +280,18 @@ <token key="Group" variants="Autofill.Ablation.Group"/> </histogram> +<histogram + name="Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction" + enum="Boolean" expires_after="M112"> + <owner>koerber@google.com</owner> + <owner>chrome-autofill-alerts@google.com</owner> + <summary> + Logs if the filling of a field was accepted even though it had a + NUMERIC_QUANTITY prediction. This metric is only emitted if the feature to + grant the heuristic precedence is disabled. Emitted on submission time. + </summary> +</histogram> + <histogram name="Autofill.Address.IsEnabled.PageLoad" enum="BooleanEnabled" expires_after="2023-02-12"> <owner>jsaul@google.com</owner> @@ -2332,6 +2344,16 @@ </summary> </histogram> +<histogram name="Autofill.NumericQuantityCollidesWithServerPrediction" + enum="Boolean" expires_after="M112"> + <owner>koerber@google.com</owner> + <owner>chrome-autofill-alerts@google.com</owner> + <summary> + Logs that a field with a heuristic prediction for an NUMERIC_QUANTITY + collides with a server prediction. The metric is emitted on form submission. + </summary> +</histogram> + <histogram name="Autofill.Offer.SelectedCardHasOffer" enum="AutofillCreditCardOfferSelection" expires_after="2023-08-01"> <owner>siyua@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/cras/histograms.xml b/tools/metrics/histograms/metadata/cras/histograms.xml index 53b9a84..db6476d 100644 --- a/tools/metrics/histograms/metadata/cras/histograms.xml +++ b/tools/metrics/histograms/metadata/cras/histograms.xml
@@ -290,6 +290,20 @@ </summary> </histogram> +<histogram name="Cras.HfpMicSuperResolutionStatus.{Device}" + enum="CrasHfpMicSuperResolutionStatus" expires_after="2023-09-30"> + <owner>cranelw@google.com</owner> + <owner>chromeos-audio@google.com</owner> + <summary> + Record the status of Super Resolution for the bluetooth microphone audio. It + is recorded when the device is opened. + </summary> + <token key="Device"> + <variant name="BluetoothNarrowBandMic"/> + <variant name="BluetoothWideBandMic"/> + </token> +</histogram> + <histogram name="Cras.HfpScoConnectionError" enum="CrasHfpScoError" expires_after="2022-12-01"> <owner>enshuo@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index caac814..1b000b7 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -837,7 +837,7 @@ </histogram> <histogram name="IOS.IncognitoInterstitial" - enum="IncognitoInterstitialActionType" expires_after="2022-11-08"> + enum="IncognitoInterstitialActionType" expires_after="2023-10-17"> <owner>qpubert@google.com</owner> <owner>djean@chromium.org</owner> <summary> @@ -847,7 +847,7 @@ </histogram> <histogram name="IOS.IncognitoInterstitial.Settings" - enum="IncognitoInterstitialSettingsActionType" expires_after="2022-11-08"> + enum="IncognitoInterstitialSettingsActionType" expires_after="2023-10-17"> <owner>qpubert@google.com</owner> <owner>djean@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 60e7909..4ff8dbb 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -206,6 +206,16 @@ </token> </histogram> +<histogram name="PasswordBubble.BiometricAuthenticationPromo.AcceptClicked" + enum="BooleanSuccess" expires_after="2023-02-12"> + <owner>vsemeniuk@google.com</owner> + <owner>vasilii@chromium.org</owner> + <summary> + Records whether user clicked accept button on the Biometric Authentication + before filling promo dialog. Recorded when the dialog is closed. + </summary> +</histogram> + <histogram name="PasswordBubble.CompromisedBubble.CheckClicked" enum="BooleanClicked" expires_after="2023-04-09"> <owner>vasilii@chromium.org</owner> @@ -2842,17 +2852,6 @@ </summary> </histogram> -<histogram name="PasswordManager.Settings.AuthenticationTime" units="ms" - expires_after="M111"> - <owner>vsemeniuk@google.com</owner> - <owner>kazinova@google.com</owner> - <owner>sygiet@google.com</owner> - <summary> - Records the time it takes user to authenticate in settings when trying to - show/copy/edit/export passwords. - </summary> -</histogram> - <histogram name="PasswordManager.Settings.ToggleAutoSignIn" enum="BooleanEnabled" expires_after="2023-02-19"> <owner>ioanap@chromium.org</owner> @@ -3281,6 +3280,34 @@ </summary> </histogram> +<histogram name="PasswordManager.{Location}.AuthenticationResult" + enum="BooleanSuccess" expires_after="2023-02-12"> + <owner>vsemeniuk@google.com</owner> + <owner>vasilii@chromium.org</owner> + <summary> + Records the result of the attempt to re-auth the user via biometrics when + {Location}. + </summary> + <token key="Location"> + <variant name="BiometricAuthenticationPromo" + summary="trying to enable the feature from the promo dialog"/> + <variant name="PasswordFilling" summary="filling suggestion on webpage"/> + </token> +</histogram> + +<histogram name="PasswordManager.{Location}.AuthenticationTime" units="ms" + expires_after="M111"> + <owner>vsemeniuk@google.com</owner> + <owner>vasilii@chromium.org</owner> + <summary>Records the time it takes user to authenticate {Location}.</summary> + <token key="Location"> + <variant name="PasswordFilling" + summary="on webpage after selecting a suggestion to fill"/> + <variant name="Settings" + summary="in settings when trying to show/copy/edit/export passwords"/> + </token> +</histogram> + <histogram name="PasswordManager.{Store}BlacklistedSitesHiRes2{CustomPassphraseStatus}" units="sites" expires_after="2023-05-01">
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 6d20903..0859f245 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "2e4fe9b42afe9dcc38c76b2107f691836ea9481c", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/a44f85ffb667c4b69b6717f8b656c27b90d93b05/trace_processor_shell.exe" + "hash": "2848fa01bc7e4ded5498624333b41925e546e28e", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/5796e68068b5b5f822fab257f4d82c61eb0f5af9/trace_processor_shell.exe" }, "linux_arm": { "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893", "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "58726b473deb178638414b602d54d4ecdba678b7", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/a44f85ffb667c4b69b6717f8b656c27b90d93b05/trace_processor_shell" + "hash": "1d812572b02e4418cc49f1442d813d543f2f42dc", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/4a49f938a9f4027bb5585e827365d1785e1e4d3c/trace_processor_shell" }, "mac_arm64": { "hash": "92318bea34f5c9beec69d2d826a9a92ec9d3cdcd", "full_remote_path": "perfetto-luci-artifacts/v30.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "45ee37567a34955ff7c864b2448973dde4a8d78c", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/a44f85ffb667c4b69b6717f8b656c27b90d93b05/trace_processor_shell" + "hash": "22917ad477215e268434b73428d8d66a71949182", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/d905018c08900932c36d228953cf1c0dc8fdf31f/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index 49c105c3..352b010 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -358,7 +358,7 @@ <item id="printing_oauth2_first_token_request" added_in_milestone="102" type="partial" second_id="printing_oauth2_http_exchange" content_hash_code="00850a77" os_list="chromeos" semantics_fields="2,4" file_path="chrome/browser/ash/printing/oauth2/authorization_server_session.cc" /> <item id="printing_oauth2_next_token_request" added_in_milestone="102" type="partial" second_id="printing_oauth2_http_exchange" content_hash_code="002fbbfd" os_list="chromeos" semantics_fields="2,4" file_path="chrome/browser/ash/printing/oauth2/authorization_server_session.cc" /> <item id="help_content_provider" added_in_milestone="102" content_hash_code="0839311f" os_list="chromeos" file_path="ash/webui/os_feedback_ui/backend/help_content_provider.cc" /> - <item id="managed_acccount_signin_restrictions_secure_connect_chromeos" added_in_milestone="102" content_hash_code="068bc93d" os_list="chromeos" file_path="chrome/browser/ui/webui/signin/user_cloud_signin_restriction_policy_fetcher_chromeos.cc" /> + <item id="managed_acccount_signin_restrictions_secure_connect_chromeos" added_in_milestone="102" content_hash_code="068bc93d" os_list="chromeos" file_path="chrome/browser/ui/webui/signin/ash/user_cloud_signin_restriction_policy_fetcher_chromeos.cc" /> <item id="wallpaper_download_google_photo" added_in_milestone="102" content_hash_code="034be7b5" os_list="chromeos" file_path="ash/wallpaper/wallpaper_controller_impl.cc" /> <item id="quick_answers_spellchecker" added_in_milestone="102" content_hash_code="06e81b7f" os_list="chromeos" file_path="chromeos/components/quick_answers/utils/spell_check_language.cc" /> <item id="printing_oauth2_token_exchange_request" added_in_milestone="102" type="partial" second_id="printing_oauth2_http_exchange" content_hash_code="059df373" os_list="chromeos" semantics_fields="2,4" file_path="chrome/browser/ash/printing/oauth2/ipp_endpoint_token_fetcher.cc" />
diff --git a/ui/chromeos/strings/network_element_localized_strings_provider.cc b/ui/chromeos/strings/network_element_localized_strings_provider.cc index 7092c4d..6657fae 100644 --- a/ui/chromeos/strings/network_element_localized_strings_provider.cc +++ b/ui/chromeos/strings/network_element_localized_strings_provider.cc
@@ -443,6 +443,7 @@ html_source->AddBoolean("isSimLockPolicyEnabled", chromeos::features::IsSimLockPolicyEnabled()); + html_source->AddBoolean("apnRevamp", ash::features::IsApnRevampEnabled()); } void AddConfigLocalizedStrings(content::WebUIDataSource* html_source) {
diff --git a/ui/chromeos/translations/ui_chromeos_strings_be.xtb b/ui/chromeos/translations/ui_chromeos_strings_be.xtb index 9005f025..2380c46e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_be.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_be.xtb
@@ -342,7 +342,7 @@ <translation id="3975895378829046965">Бенгальская (фанетычная раскладка)</translation> <translation id="4002066346123236978">Назва</translation> <translation id="4017788180641807848">Англійская (ЗША) з раскладкай Workman</translation> -<translation id="4019998208269143058">Замацаваць у раздзеле "Абраныя файлы"</translation> +<translation id="4019998208269143058">Замацаваць у раздзеле "Хуткія файлы"</translation> <translation id="4040753847560036377">Няправільны PUK-код</translation> <translation id="4057991113334098539">Ідзе актывацыя...</translation> <translation id="4092890906744441904">Ірландская</translation> @@ -633,7 +633,7 @@ <translation id="6320212353742551423">Архіў <ph name="ARCHIVE_TYPE" /></translation> <translation id="6321303798550928047">Маханне</translation> <translation id="6327785803543103246">Аўтаматычная наладка проксі-сервера</translation> -<translation id="6337014272874260727">Выдаліць з раздзела "Абраныя файлы"</translation> +<translation id="6337014272874260727">Выдаліць з раздзела "Хуткія файлы"</translation> <translation id="6339145975392024142">ЗША, міжнародная (PC)</translation> <translation id="6346310558342052870">Доступ абмежаваны</translation> <translation id="6356685157277930264">Акно водгукаў на праграму "Файлы"</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb index 70d58cfe..0e0f1d7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
@@ -202,6 +202,7 @@ <translation id="2771816809568414714">ყველი</translation> <translation id="2781645665747935084">ბელგიური</translation> <translation id="2782104745158847185">შეცდომა Linux აპლიკაციის ინსტალაციისას</translation> +<translation id="2802583107108007218">შეიტყვეთ მეტი ამ შეზღუდვების შესახებ</translation> <translation id="2803375539583399270">შეიყვანეთ PIN-კოდი</translation> <translation id="2820957248982571256">მიმდინარეობს სკანირება...</translation> <translation id="2830077785865012357">ჩინური ბოპომოფო</translation> @@ -920,6 +921,7 @@ <translation id="8656768832129462377">არ შეამოწმოთ</translation> <translation id="8688591111840995413">არასწორი პაროლი</translation> <translation id="8698464937041809063">Google ნახაზი</translation> +<translation id="8698877009525468705">ეს ფაილი კონფიდენციალურია და ექვემდებარე ადმინისტრატორის მიერ დადგენილი წესებით განსაზღვრულ შეზღუდვებს.</translation> <translation id="8712637175834984815">კარგი</translation> <translation id="8713112442029511308">მალტური</translation> <translation id="8714406895390098252">ველოსიპედი</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb index a2fd507..809808a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb
@@ -202,6 +202,7 @@ <translation id="2771816809568414714">Сирење</translation> <translation id="2781645665747935084">Белгиски</translation> <translation id="2782104745158847185">Грешка при инсталирањето на апликацијата за Linux</translation> +<translation id="2802583107108007218">Дознајте повеќе за ограничувањава</translation> <translation id="2803375539583399270">Внесете PIN.</translation> <translation id="2820957248982571256">Се скенира…</translation> <translation id="2830077785865012357">кинески џујин</translation> @@ -920,6 +921,7 @@ <translation id="8656768832129462377">Не проверувај</translation> <translation id="8688591111840995413">Погрешна лозинка</translation> <translation id="8698464937041809063">Google-цртеж</translation> +<translation id="8698877009525468705">Датотекава е доверлива и подлежи на ограничувања според правилата на администраторот.</translation> <translation id="8712637175834984815">Сфатив</translation> <translation id="8713112442029511308">малтешки</translation> <translation id="8714406895390098252">Велосипед</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_si.xtb b/ui/chromeos/translations/ui_chromeos_strings_si.xtb index 94f9023..3693aef 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_si.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
@@ -202,6 +202,7 @@ <translation id="2771816809568414714">චීස්</translation> <translation id="2781645665747935084">බෙල්ජියම</translation> <translation id="2782104745158847185">Linux යෙදුම් ස්ථාපනය කිරීමේ දෝෂයකි</translation> +<translation id="2802583107108007218">මෙම සීමා කිරීම් ගැන තව දැන ගන්න</translation> <translation id="2803375539583399270">PIN අංකය ඇතුළත් කරන්න</translation> <translation id="2820957248982571256">ස්කෑන් කරමින්...</translation> <translation id="2830077785865012357">චීන ෂුයින්</translation> @@ -920,6 +921,7 @@ <translation id="8656768832129462377">පිරික්සන්න එපා</translation> <translation id="8688591111840995413">රහස් වචනය හොඳ නැත</translation> <translation id="8698464937041809063">Google ඇඳීම්</translation> +<translation id="8698877009525468705">මෙම ගොනුව රහස්ය වන අතර පරිපාලක ප්රතිපත්තිය මගින් සීමා කිරීම්වලට යටත් වේ.</translation> <translation id="8712637175834984815">එය ලැබුණා</translation> <translation id="8713112442029511308">මොල්ටීස්</translation> <translation id="8714406895390098252">බයිසිකල්</translation>
diff --git a/ui/file_manager/file_manager/background/js/BUILD.gn b/ui/file_manager/file_manager/background/js/BUILD.gn index 59ac3cb..bcad396 100644 --- a/ui/file_manager/file_manager/background/js/BUILD.gn +++ b/ui/file_manager/file_manager/background/js/BUILD.gn
@@ -47,7 +47,6 @@ ":file_operation_manager", ":file_operation_util", ":launcher", - ":metadata_proxy", ":metrics_start", ":mock_progress_center", ":progress_center", @@ -212,7 +211,6 @@ js_library("file_operation_handler") { deps = [ "//ui/file_manager/file_manager/common/js:api", - "//ui/file_manager/file_manager/common/js:file_operation_common", "//ui/file_manager/file_manager/common/js:progress_center_common", "//ui/file_manager/file_manager/common/js:util", "//ui/file_manager/file_manager/externs/background:file_operation_manager", @@ -227,10 +225,7 @@ ":mock_file_operation_manager", ":mock_progress_center", "//chrome/test/data/webui:chai_assert", - "//ui/file_manager/file_manager/common/js:file_operation_common", "//ui/file_manager/file_manager/common/js:mock_chrome", - "//ui/file_manager/file_manager/common/js:progress_center_common", - "//ui/file_manager/file_manager/common/js:util", ] } @@ -248,22 +243,12 @@ js_library("file_operation_manager") { deps = [ ":file_operation_util", - ":metadata_proxy", ":trash", - ":volume_manager_factory", - "//ui/file_manager/file_manager/common/js:api", - "//ui/file_manager/file_manager/common/js:async_util", - "//ui/file_manager/file_manager/common/js:file_operation_common", - "//ui/file_manager/file_manager/common/js:files_app_entry_types", - "//ui/file_manager/file_manager/common/js:trash", "//ui/file_manager/file_manager/common/js:util", - "//ui/file_manager/file_manager/common/js:volume_manager_types", - "//ui/file_manager/file_manager/common/js:xfm", "//ui/file_manager/file_manager/externs:entry_location", "//ui/file_manager/file_manager/externs:files_app_entry_interfaces", "//ui/file_manager/file_manager/externs:volume_manager", "//ui/file_manager/file_manager/externs/background:file_operation_manager", - "//ui/webui/resources/js:assert", ] } @@ -273,11 +258,9 @@ ":file_operation_util", ":volume_manager_factory", "//chrome/test/data/webui:chai_assert", - "//ui/file_manager/file_manager/common/js:file_operation_common", "//ui/file_manager/file_manager/common/js:mock_chrome", "//ui/file_manager/file_manager/common/js:mock_entry", "//ui/file_manager/file_manager/common/js:test_error_reporting", - "//ui/file_manager/file_manager/common/js:util", "//ui/file_manager/file_manager/externs:entry_location", "//ui/file_manager/file_manager/externs/background:file_operation_manager", "//ui/webui/resources/js:load_time_data.m", @@ -285,29 +268,7 @@ } js_library("file_operation_util") { - deps = [ - ":metadata_proxy", - "//ui/file_manager/file_manager/common/js:async_util", - "//ui/file_manager/file_manager/common/js:file_operation_common", - "//ui/file_manager/file_manager/common/js:metrics", - "//ui/file_manager/file_manager/common/js:trash", - "//ui/file_manager/file_manager/common/js:util", - "//ui/webui/resources/js:assert", - "//ui/webui/resources/js/cr:event_target", - ] -} - -js_library("metadata_proxy") { - deps = [ "//ui/file_manager/file_manager/common/js:lru_cache" ] -} - -js_unittest("metadata_proxy_unittest") { - deps = [ - ":metadata_proxy", - "//chrome/test/data/webui:chai_assert", - "//ui/file_manager/file_manager/common/js:mock_entry", - "//ui/file_manager/file_manager/common/js:test_error_reporting", - ] + deps = [ "//ui/file_manager/file_manager/common/js:util" ] } js_library("metrics_start") { @@ -502,7 +463,6 @@ ":drive_sync_handler_unittest", ":file_operation_handler_unittest", ":file_operation_manager_unittest", - ":metadata_proxy_unittest", ":trash_unittest", ":volume_manager_unittest", ]
diff --git a/ui/file_manager/file_manager/background/js/file_operation_handler.js b/ui/file_manager/file_manager/background/js/file_operation_handler.js index 7dd0314..f9e9f27 100644 --- a/ui/file_manager/file_manager/background/js/file_operation_handler.js +++ b/ui/file_manager/file_manager/background/js/file_operation_handler.js
@@ -5,7 +5,6 @@ import {assert} from 'chrome://resources/js/assert.js'; import {startIOTask} from '../../common/js/api.js'; -import {FileOperationProgressEvent} from '../../common/js/file_operation_common.js'; import {ProgressCenterItem, ProgressItemState, ProgressItemType} from '../../common/js/progress_center_common.js'; import {str, strf, util} from '../../common/js/util.js'; import {FileOperationManager} from '../../externs/background/file_operation_manager.js'; @@ -41,25 +40,6 @@ */ this.toast_ = null; - /** - * Pending items of delete operation. - * - * Delete operations are usually complete quickly. - * So we would not like to show the progress bar at first. - * If the operation takes more than FileOperationHandler.PENDING_TIME_MS_, - * we adds the item to the progress center. - * - * @type {Object<ProgressCenterItem>}} - * @private - */ - this.pendingItems_ = {}; - - // Register event. - this.fileOperationManager_.addEventListener( - 'copy-progress', this.onCopyProgress_.bind(this)); - this.fileOperationManager_.addEventListener( - 'delete', this.onDeleteProgress_.bind(this)); - chrome.fileManagerPrivate.onIOTaskProgressStatus.addListener( this.onIOTaskProgressStatus_.bind(this)); } @@ -194,300 +174,6 @@ }, }); } - - /** - * Handles the copy-progress event. - * @param {Event} event The copy-progress event. - * @private - */ - onCopyProgress_(event) { - const EventType = FileOperationProgressEvent.EventType; - event = /** @type {FileOperationProgressEvent} */ (event); - - // Update progress center. - const progressCenter = this.progressCenter_; - let item; - switch (event.reason) { - case EventType.BEGIN: - item = new ProgressCenterItem(); - item.id = event.taskId; - item.type = FileOperationHandler.getType_(event.status.operationType); - item.message = FileOperationHandler.getMessage_(event); - item.itemCount = event.status.numRemainingItems; - item.sourceMessage = event.status.processingEntryName; - item.destinationMessage = event.status.targetDirEntryName; - item.progressMax = event.status.totalBytes; - item.progressValue = event.status.processedBytes; - item.cancelCallback = this.fileOperationManager_.requestTaskCancel.bind( - this.fileOperationManager_, event.taskId); - item.remainingTime = event.status.remainingTime; - progressCenter.updateItem(item); - break; - - case EventType.PROGRESS: - item = progressCenter.getItemById(event.taskId); - if (!item) { - console.error('Cannot find copying item.'); - return; - } - item.message = FileOperationHandler.getMessage_(event); - item.progressMax = event.status.totalBytes; - item.progressValue = event.status.processedBytes; - item.remainingTime = event.status.remainingTime; - progressCenter.updateItem(item); - break; - - case EventType.SUCCESS: - case EventType.CANCELED: - case EventType.ERROR: - item = progressCenter.getItemById(event.taskId); - if (!item) { - // ERROR events can be dispatched before BEGIN events. - item = new ProgressCenterItem(); - item.type = FileOperationHandler.getType_(event.status.operationType); - item.id = event.taskId; - item.progressMax = 1; - } - if (event.reason === EventType.SUCCESS) { - item.message = ''; - item.state = ProgressItemState.COMPLETED; - item.progressValue = item.progressMax; - item.remainingTime = event.status.remainingTime; - } else if (event.reason === EventType.CANCELED) { - item.message = ''; - item.state = ProgressItemState.CANCELED; - } else { - item.message = FileOperationHandler.getMessage_(event); - item.state = ProgressItemState.ERROR; - } - progressCenter.updateItem(item); - break; - } - } - - /** - * Handles the delete event, and also the restore event which is similar to - * delete in that as items complete, they are removed from the containing - * directory. - * @param {Event} event The delete or restore event. - * @private - */ - onDeleteProgress_(event) { - const EventType = FileOperationProgressEvent.EventType; - event = /** @type {FileOperationProgressEvent} */ (event); - - // Update progress center. - const progressCenter = this.progressCenter_; - let item; - let pending; - switch (event.reason) { - case EventType.BEGIN: - item = new ProgressCenterItem(); - item.id = event.taskId; - item.type = ProgressItemType.DELETE; - item.message = FileOperationHandler.getMessage_(event); - item.itemCount = event.status.numRemainingItems; - item.progressMax = event.totalBytes; - item.progressValue = event.processedBytes; - item.cancelCallback = this.fileOperationManager_.requestTaskCancel.bind( - this.fileOperationManager_, event.taskId); - this.pendingItems_[item.id] = item; - setTimeout( - this.showPendingItem_.bind(this, item), - FileOperationHandler.PENDING_TIME_MS_); - break; - - case EventType.PROGRESS: - pending = event.taskId in this.pendingItems_; - item = this.pendingItems_[event.taskId] || - progressCenter.getItemById(event.taskId); - if (!item) { - console.error('Cannot find deleting item.'); - return; - } - item.message = FileOperationHandler.getMessage_(event); - item.progressMax = event.totalBytes; - item.progressValue = event.processedBytes; - if (!pending) { - progressCenter.updateItem(item); - } - break; - - case EventType.SUCCESS: - case EventType.CANCELED: - case EventType.ERROR: - // Obtain working variable. - pending = event.taskId in this.pendingItems_; - item = this.pendingItems_[event.taskId] || - progressCenter.getItemById(event.taskId); - if (!item) { - console.error('Cannot find deleting item.'); - return; - } - - // Update the item. - item.message = FileOperationHandler.getMessage_(event); - if (event.reason === EventType.SUCCESS) { - item.state = ProgressItemState.COMPLETED; - item.progressValue = item.progressMax; - } else if (event.reason === EventType.CANCELED) { - item.state = ProgressItemState.CANCELED; - } else { - item.state = ProgressItemState.ERROR; - } - - // Apply the change. - if (!pending || event.reason === EventType.ERROR) { - progressCenter.updateItem(item); - } - if (pending) { - delete this.pendingItems_[event.taskId]; - } - break; - } - } - - /** - * Shows the pending item. - * - * @param {ProgressCenterItem} item Pending item. - * @private - */ - showPendingItem_(item) { - // The item is already gone. - if (!this.pendingItems_[item.id]) { - return; - } - delete this.pendingItems_[item.id]; - this.progressCenter_.updateItem(item); - } - - /** - * Generate a progress message from the event. - * @param {FileOperationProgressEvent} event Progress event. - * @return {string} message. - * @private - */ - static getMessage_(event) { - if (event.reason === FileOperationProgressEvent.EventType.ERROR) { - switch (event.error.code) { - case util.FileOperationErrorType.TARGET_EXISTS: - let name = event.error.data.name; - if (event.error.data.isDirectory) { - name += '/'; - } - switch (event.status.operationType) { - case util.FileOperationType.COPY: - return strf('COPY_TARGET_EXISTS_ERROR', name); - case util.FileOperationType.MOVE: - return strf('MOVE_TARGET_EXISTS_ERROR', name); - case util.FileOperationType.ZIP: - return strf('ZIP_TARGET_EXISTS_ERROR', name); - default: - console.warn( - `Unexpected operation type: ${event.status.operationType}`); - return strf('FILE_ERROR_GENERIC'); - } - - case util.FileOperationErrorType.FILESYSTEM_ERROR: - const detail = util.getFileErrorString(event.error.data.name); - switch (event.status.operationType) { - case util.FileOperationType.COPY: - return strf('COPY_FILESYSTEM_ERROR', detail); - case util.FileOperationType.MOVE: - return strf('MOVE_FILESYSTEM_ERROR', detail); - case util.FileOperationType.ZIP: - return strf('ZIP_FILESYSTEM_ERROR', detail); - case util.FileOperationType.DELETE: - return str('DELETE_ERROR'); - case util.FileOperationType.RESTORE: - case util.FileOperationType.RESTORE_TO_DESTINATION: - return str('RESTORE_FROM_TRASH_ERROR'); - default: - console.warn( - `Unexpected operation type: ${event.status.operationType}`); - return strf('FILE_ERROR_GENERIC'); - } - - default: - switch (event.status.operationType) { - case util.FileOperationType.COPY: - return strf('COPY_UNEXPECTED_ERROR', event.error.code); - case util.FileOperationType.MOVE: - return strf('MOVE_UNEXPECTED_ERROR', event.error.code); - case util.FileOperationType.ZIP: - return strf('ZIP_UNEXPECTED_ERROR', event.error.code); - case util.FileOperationType.DELETE: - return str('DELETE_ERROR'); - case util.FileOperationType.RESTORE: - case util.FileOperationType.RESTORE_TO_DESTINATION: - return str('RESTORE_FROM_TRASH_ERROR'); - default: - console.warn( - `Unexpected operation type: ${event.status.operationType}`); - return strf('FILE_ERROR_GENERIC'); - } - } - } else if (event.status.numRemainingItems === 1) { - const name = event.status.processingEntryName; - switch (event.status.operationType) { - case util.FileOperationType.COPY: - return strf('COPY_FILE_NAME', name); - case util.FileOperationType.MOVE: - return strf('MOVE_FILE_NAME', name); - case util.FileOperationType.ZIP: - return strf('ZIP_FILE_NAME', name); - case util.FileOperationType.DELETE: - return strf('DELETE_FILE_NAME', name); - case util.FileOperationType.RESTORE: - case util.FileOperationType.RESTORE_TO_DESTINATION: - return strf('RESTORING_FROM_TRASH_FILE_NAME', name); - default: - console.warn( - `Unexpected operation type: ${event.status.operationType}`); - return strf('FILE_ERROR_GENERIC'); - } - } else { - const remainNumber = event.status.numRemainingItems; - switch (event.status.operationType) { - case util.FileOperationType.COPY: - return strf('COPY_ITEMS_REMAINING', remainNumber); - case util.FileOperationType.MOVE: - return strf('MOVE_ITEMS_REMAINING', remainNumber); - case util.FileOperationType.ZIP: - return strf('ZIP_ITEMS_REMAINING', remainNumber); - case util.FileOperationType.DELETE: - return strf('DELETE_ITEMS_REMAINING', remainNumber); - case util.FileOperationType.RESTORE: - case util.FileOperationType.RESTORE_TO_DESTINATION: - return strf('RESTORING_FROM_TRASH_ITEMS_REMAINING', remainNumber); - default: - console.warn( - `Unexpected operation type: ${event.status.operationType}`); - return strf('FILE_ERROR_GENERIC'); - } - } - } - - /** - * Obtains ProgressItemType from OperationType of FileTransferManager. - * @param {string} operationType OperationType of FileTransferManager. - * @return {ProgressItemType} corresponding to the specified operation type. - * @private - */ - static getType_(operationType) { - switch (operationType) { - case util.FileOperationType.COPY: - return ProgressItemType.COPY; - case util.FileOperationType.MOVE: - return ProgressItemType.MOVE; - case util.FileOperationType.ZIP: - return ProgressItemType.ZIP; - default: - console.error('Unknown operation type.'); - return ProgressItemType.TRANSFER; - } - } } /**
diff --git a/ui/file_manager/file_manager/background/js/file_operation_handler_unittest.js b/ui/file_manager/file_manager/background/js/file_operation_handler_unittest.js index c031105..38059f34 100644 --- a/ui/file_manager/file_manager/background/js/file_operation_handler_unittest.js +++ b/ui/file_manager/file_manager/background/js/file_operation_handler_unittest.js
@@ -2,12 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertArrayEquals, assertEquals, assertGT, assertLT, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {assertEquals, assertGT, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {FileOperationProgressEvent} from '../../common/js/file_operation_common.js'; import {installMockChrome} from '../../common/js/mock_chrome.js'; -import {ProgressItemState} from '../../common/js/progress_center_common.js'; -import {util} from '../../common/js/util.js'; import {FileOperationHandler} from './file_operation_handler.js'; import {fileOperationUtil} from './file_operation_util.js'; @@ -96,189 +93,6 @@ } /** - * Tests copy success. - */ -export function testCopySuccess() { - // Dispatch copy event. - fileOperationManager.dispatchEvent( - /** @type {!Event} */ (Object.assign(new Event('copy-progress'), { - taskId: 'TASK_ID', - reason: FileOperationProgressEvent.EventType.BEGIN, - status: { - operationType: 'COPY', - numRemainingItems: 1, - processingEntryName: 'sample.txt', - totalBytes: 200, - processedBytes: 0, - }, - }))); - - // Check the updated item. - let item = progressCenter.items['TASK_ID']; - assertEquals(ProgressItemState.PROGRESSING, item.state); - assertEquals('TASK_ID', item.id); - assertEquals('Copying sample.txt...', item.message); - assertEquals('copy', item.type); - assertEquals(true, item.single); - assertEquals(0, item.progressRateInPercent); - - // Dispatch success event. - fileOperationManager.dispatchEvent( - /** @type {!Event} */ (Object.assign(new Event('copy-progress'), { - taskId: 'TASK_ID', - reason: FileOperationProgressEvent.EventType.SUCCESS, - status: { - operationType: 'COPY', - }, - }))); - - // Check the item completed. - item = progressCenter.items['TASK_ID']; - assertEquals(ProgressItemState.COMPLETED, item.state); - assertEquals('TASK_ID', item.id); - assertEquals('', item.message); - assertEquals('copy', item.type); - assertEquals(true, item.single); - assertEquals(100, item.progressRateInPercent); -} - -/** - * Tests copy cancel. - */ -export function testCopyCancel() { - // Dispatch copy event. - fileOperationManager.dispatchEvent( - /** @type {!Event} */ (Object.assign(new Event('copy-progress'), { - taskId: 'TASK_ID', - reason: FileOperationProgressEvent.EventType.BEGIN, - status: { - operationType: 'COPY', - numRemainingItems: 1, - processingEntryName: 'sample.txt', - totalBytes: 200, - processedBytes: 0, - }, - }))); - - // Check the updated item. - let item = progressCenter.items['TASK_ID']; - assertEquals(ProgressItemState.PROGRESSING, item.state); - assertEquals('Copying sample.txt...', item.message); - assertEquals('copy', item.type); - assertEquals(true, item.single); - assertEquals(0, item.progressRateInPercent); - - // Setup cancel event. - fileOperationManager.cancelEvent = - /** @type {!Event} */ (Object.assign(new Event('copy-progress'), { - taskId: 'TASK_ID', - reason: FileOperationProgressEvent.EventType.CANCELED, - status: { - operationType: 'COPY', - }, - })); - - // Dispatch cancel event. - assertTrue(item.cancelable); - item.cancelCallback(); - - // Check the item cancelled. - item = progressCenter.items['TASK_ID']; - assertEquals(ProgressItemState.CANCELED, item.state); - assertEquals('', item.message); - assertEquals('copy', item.type); - assertEquals(true, item.single); - assertEquals(0, item.progressRateInPercent); -} - -/** - * Tests target already exists error. - */ -export function testCopyTargetExistsError() { - // Dispatch error event. - fileOperationManager.dispatchEvent( - /** @type {!Event} */ (Object.assign(new Event('copy-progress'), { - taskId: 'TASK_ID', - reason: FileOperationProgressEvent.EventType.ERROR, - status: { - operationType: 'COPY', - }, - error: { - code: util.FileOperationErrorType.TARGET_EXISTS, - data: { - name: 'sample.txt', - }, - }, - }))); - - // Check the item errored. - const item = progressCenter.items['TASK_ID']; - assertEquals(ProgressItemState.ERROR, item.state); - assertEquals('sample.txt is already exists.', item.message); - assertEquals('copy', item.type); - assertEquals(true, item.single); - assertEquals(0, item.progressRateInPercent); -} - -/** - * Tests file system error. - */ -export function testCopyFileSystemError() { - // Dispatch error event. - fileOperationManager.dispatchEvent( - /** @type {!Event} */ (Object.assign(new Event('copy-progress'), { - taskId: 'TASK_ID', - reason: FileOperationProgressEvent.EventType.ERROR, - status: { - operationType: 'COPY', - }, - error: { - code: util.FileOperationErrorType.FILESYSTEM_ERROR, - data: { - name: 'sample.txt', - }, - }, - }))); - - // Check the item errored. - const item = progressCenter.items['TASK_ID']; - assertEquals(ProgressItemState.ERROR, item.state); - assertEquals('Copy filesystem error: File error generic.', item.message); - assertEquals('copy', item.type); - assertEquals(true, item.single); - assertEquals(0, item.progressRateInPercent); -} - -/** - * Tests unexpected error. - */ -export function testCopyUnexpectedError() { - // Dispatch error event. - fileOperationManager.dispatchEvent( - /** @type {!Event} */ (Object.assign(new Event('copy-progress'), { - taskId: 'TASK_ID', - reason: FileOperationProgressEvent.EventType.ERROR, - status: { - operationType: 'COPY', - }, - error: { - code: 'Unexpected', - data: { - name: 'sample.txt', - }, - }, - }))); - - // Check the item errored. - const item = progressCenter.items['TASK_ID']; - assertEquals(ProgressItemState.ERROR, item.state); - assertEquals('Copy unexpected error: Unexpected', item.message); - assertEquals('copy', item.type); - assertEquals(true, item.single); - assertEquals(0, item.progressRateInPercent); -} - -/** * Tests Speedometer's speed calculations. */ export function testSpeedometerMovingAverage() {
diff --git a/ui/file_manager/file_manager/background/js/file_operation_manager.js b/ui/file_manager/file_manager/background/js/file_operation_manager.js index 61cfd14..01dce20 100644 --- a/ui/file_manager/file_manager/background/js/file_operation_manager.js +++ b/ui/file_manager/file_manager/background/js/file_operation_manager.js
@@ -2,24 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from 'chrome://resources/js/assert.js'; - -import {startIOTask} from '../../common/js/api.js'; -import {AsyncUtil} from '../../common/js/async_util.js'; -import {FileOperationError, FileOperationProgressEvent} from '../../common/js/file_operation_common.js'; -import {CombinedReaders} from '../../common/js/files_app_entry_types.js'; -import {createTrashReaders, TrashEntry} from '../../common/js/trash.js'; import {util} from '../../common/js/util.js'; -import {VolumeManagerCommon} from '../../common/js/volume_manager_types.js'; -import {xfm} from '../../common/js/xfm.js'; import {FileOperationManager} from '../../externs/background/file_operation_manager.js'; import {FakeEntry} from '../../externs/files_app_entry_interfaces.js'; import {VolumeManager} from '../../externs/volume_manager.js'; import {fileOperationUtil} from './file_operation_util.js'; -import {metadataProxy} from './metadata_proxy.js'; import {Trash} from './trash.js'; -import {volumeManagerFactory} from './volume_manager_factory.js'; /** * FileOperationManagerImpl: implementation of {FileOperationManager}. @@ -40,36 +29,11 @@ this.volumeManager_ = null; /** - * List of pending copy tasks. The manager can execute tasks in arbitrary - * order. - * @private {!Array<!fileOperationUtil.Task>} - */ - this.pendingCopyTasks_ = []; - - /** - * Map of volume id and running copy task. The key is a volume id and the - * value is a copy task. - * @private {!Object<!fileOperationUtil.Task>} - */ - this.runningCopyTasks_ = {}; - - /** - * @private {!Array<!fileOperationUtil.DeleteTask>} - */ - this.deleteTasks_ = []; - - /** * @private {number} */ this.taskIdCounter_ = 0; /** - * @private {!fileOperationUtil.EventRouter} - * @const - */ - this.eventRouter_ = new fileOperationUtil.EventRouter(); - - /** * @private {!Trash} * @const */ @@ -85,125 +49,6 @@ } /** - * Adds an event listener for the tasks. - * @param {string} type The name of the event. - * @param {EventListener|function(!Event):*} handler The handler for the - * event. This is called when the event is dispatched. - * @override - */ - addEventListener(type, handler) { - this.eventRouter_.addEventListener(type, handler); - } - - /** - * Removes an event listener for the tasks. - * @param {string} type The name of the event. - * @param {EventListener|function(!Event):*} handler The handler to be - * removed. - * @override - */ - removeEventListener(type, handler) { - this.eventRouter_.removeEventListener(type, handler); - } - - /** @override */ - dispatchEvent() { - // Not used. Just need this to satisfy the compiler @implements - // FileOperationManager interface. - } - - /** - * Checks if there are any tasks in the queue. - * @return {boolean} True, if there are any tasks. - */ - hasQueuedTasks() { - return Object.keys(this.runningCopyTasks_).length > 0 || - this.pendingCopyTasks_.length > 0 || this.deleteTasks_.length > 0; - } - - /** - * Returns pending copy tasks for testing. - * @return {!Array<!fileOperationUtil.Task>} Pending copy tasks. - */ - getPendingCopyTasksForTesting() { - return this.pendingCopyTasks_; - } - - /** - * Fetches the root label of a volume from the volume manager. - * @param {!Entry} entry The directory entry to get the volume label. - * @return {string} identifying label for the volume. - */ - getVolumeLabel_(entry) { - const destinationLocationInfo = this.volumeManager_.getLocationInfo(entry); - if (destinationLocationInfo) { - return util.getRootTypeLabel(destinationLocationInfo); - } - return ''; - } - - /** - * Returns status information for a running task. - * @param {fileOperationUtil.Task} task The task we use to retrieve status - * from. - * @return {!fileOperationUtil.Status} Status object with optional volume - * information. - */ - getTaskStatus(task) { - const status = task.getStatus(); - // If there's no target directory name, use the volume name for UI display. - if (status.targetDirEntryName === '' && task.targetDirEntry) { - const entry = /** {Entry} */ (task.targetDirEntry); - if (this.volumeManager_) { - status.targetDirEntryName = this.getVolumeLabel_(entry); - } - } - return status; - } - - /** - * Requests the specified task to be canceled. - * @param {string} taskId ID of task to be canceled. - */ - requestTaskCancel(taskId) { - let task = null; - - // If the task is not on progress, remove it immediately. - for (let i = 0; i < this.pendingCopyTasks_.length; i++) { - task = this.pendingCopyTasks_[i]; - if (task.taskId !== taskId) { - continue; - } - task.requestCancel(); - this.eventRouter_.sendProgressEvent( - FileOperationProgressEvent.EventType.CANCELED, - this.getTaskStatus(task), task.taskId); - this.pendingCopyTasks_.splice(i, 1); - } - - for (const volumeId in this.runningCopyTasks_) { - task = this.runningCopyTasks_[volumeId]; - if (task.taskId === taskId) { - task.requestCancel(); - } - } - - for (let i = 0; i < this.deleteTasks_.length; i++) { - task = this.deleteTasks_[i]; - if (task.taskId !== taskId) { - continue; - } - task.cancelRequested = true; - // If the task is not on progress, remove it immediately. - if (i !== 0) { - this.eventRouter_.sendDeleteEvent( - FileOperationProgressEvent.EventType.CANCELED, task); - this.deleteTasks_.splice(i, 1); - } - } - } - - /** * Filters the entry in the same directory * * @param {Array<Entry>} sourceEntries Entries of the source files. @@ -257,180 +102,6 @@ } /** - * Schedules the files deletion. - * - * @param {!Array<!Entry>} entries The entries. - * @param {boolean=} permanentlyDelete if true, entries will be deleted rather - * than moved to trash. - */ - deleteEntries(entries, permanentlyDelete = false) { - if (permanentlyDelete) { - startIOTask(chrome.fileManagerPrivate.IOTaskType.DELETE, entries, {}); - return; - } - this.deleteOrRestore_( - util.FileOperationType.DELETE, entries, permanentlyDelete); - } - - /** - * Schedule delete or restore. - * - * @param {!util.FileOperationType} operationType DELETE or RESTORE. - * @param {!Array<!Entry|!TrashEntry>} entries The entries. - * @param {boolean=} permanentlyDelete if true, entries will be deleted rather - * than moved to trash. Only applies to operationType DELETE. - * @private - */ - deleteOrRestore_(operationType, entries, permanentlyDelete = false) { - const task = - /** @type {!fileOperationUtil.DeleteTask} */ (Object.preventExtensions({ - operationType: operationType, - entries: entries, - taskId: this.generateTaskId(), - entrySize: {}, - totalBytes: 0, - processedBytes: 0, - cancelRequested: false, - trashedEntries: [], - permanentlyDelete, - })); - - // Obtains entry size and sum them up. - const group = new AsyncUtil.Group(); - for (let i = 0; i < task.entries.length; i++) { - group.add(function(entry, callback) { - metadataProxy.getEntryMetadata(entry).then( - metadata => { - task.entrySize[entry.toURL()] = metadata.size; - task.totalBytes += metadata.size; - callback(); - }, - () => { - // Fail to obtain the metadata. Use fake value 1. - task.entrySize[entry.toURL()] = 1; - task.totalBytes += 1; - callback(); - }); - }.bind(this, task.entries[i])); - } - - // Add a delete task. - group.run(() => { - this.deleteTasks_.push(task); - this.eventRouter_.sendDeleteEvent( - FileOperationProgressEvent.EventType.BEGIN, task); - if (this.deleteTasks_.length === 1) { - this.serviceAllDeleteTasks_(); - } - }); - } - - /** - * Service all pending delete/restore tasks, as well as any that might appear - * during the deletion. - * - * Must not be called if there is an in-flight delete/restore task. - * - * @private - */ - serviceAllDeleteTasks_() { - if (!this.volumeManager_) { - volumeManagerFactory.getInstance().then(volumeManager => { - this.volumeManager_ = volumeManager; - this.serviceAllDeleteTasks_(); - }); - return; - } - - this.serviceDeleteTask_(this.deleteTasks_[0], () => { - this.deleteTasks_.shift(); - if (this.deleteTasks_.length) { - this.serviceAllDeleteTasks_(); - } - }); - } - - /** - * Performs the deletion or restore. - * - * @param {!Object} task The delete task (see deleteOrRestore_()). - * @param {function()} callback Callback run on task end. - * @private - */ - serviceDeleteTask_(task, callback) { - const queue = new AsyncUtil.Queue(); - - // Delete or restore each entry. - let error = null; - const deleteOneEntry = inCallback => { - if (!task.entries.length || task.cancelRequested || error) { - inCallback(); - return; - } - this.eventRouter_.sendDeleteEvent( - FileOperationProgressEvent.EventType.PROGRESS, task); - - // Operation will be either delete, or restore. - let operation; - switch (task.operationType) { - case util.FileOperationType.DELETE: - operation = this.trash_ - .removeFileOrDirectory( - assert(this.volumeManager_), task.entries[0], - task.permanentlyDelete) - .then(trashEntry => { - if (trashEntry) { - task.trashedEntries.push(trashEntry); - } - }); - break; - - case util.FileOperationType.RESTORE: - operation = - this.trash_.restore(assert(this.volumeManager_), task.entries[0]); - break; - - default: - operation = - Promise.reject('Unkonwn operation type ' + task.operationType); - } - - operation - .then(() => { - this.eventRouter_.sendEntryChangedEvent( - util.EntryChangedKind.DELETED, task.entries[0]); - task.processedBytes += task.entrySize[task.entries[0].toURL()]; - task.entries.shift(); - deleteOneEntry(inCallback); - }) - .catch(inError => { - error = inError.message; - inCallback(); - }); - }; - queue.run(deleteOneEntry); - - // Send an event and finish the async steps. - queue.run(inCallback => { - const EventType = FileOperationProgressEvent.EventType; - let reason; - if (error) { - reason = EventType.ERROR; - } else if (task.cancelRequested) { - reason = EventType.CANCELED; - } else { - reason = EventType.SUCCESS; - } - this.eventRouter_.sendDeleteEvent( - reason, task, - new FileOperationError( - util.FileOperationErrorType.FILESYSTEM_ERROR, error)); - inCallback(); - callback(); - }); - } - - /** * Notifies File Manager that an extraction operation has finished. * * @param {number} taskId The unique task id for the IO operation. @@ -484,13 +155,4 @@ }, reject); }); } - - /** - * Generates new task ID. - * - * @return {string} New task ID. - */ - generateTaskId() { - return 'file-operation-' + this.taskIdCounter_++; - } }
diff --git a/ui/file_manager/file_manager/background/js/file_operation_manager_unittest.js b/ui/file_manager/file_manager/background/js/file_operation_manager_unittest.js index 36f3056..b005a0a 100644 --- a/ui/file_manager/file_manager/background/js/file_operation_manager_unittest.js +++ b/ui/file_manager/file_manager/background/js/file_operation_manager_unittest.js
@@ -3,13 +3,11 @@ // found in the LICENSE file. import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {assertArrayEquals, assertEquals, assertFalse, assertLT, assertNotReached, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {assertArrayEquals, assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; -import {FileOperationError, FileOperationProgressEvent} from '../../common/js/file_operation_common.js'; import {installMockChrome} from '../../common/js/mock_chrome.js'; -import {joinPath, MockDirectoryEntry, MockEntry, MockFileEntry, MockFileSystem} from '../../common/js/mock_entry.js'; -import {reportPromise, waitUntil} from '../../common/js/test_error_reporting.js'; -import {util} from '../../common/js/util.js'; +import {MockDirectoryEntry, MockFileEntry, MockFileSystem} from '../../common/js/mock_entry.js'; +import {reportPromise} from '../../common/js/test_error_reporting.js'; import {FileOperationManager} from '../../externs/background/file_operation_manager.js'; import {EntryLocation} from '../../externs/entry_location.js'; @@ -27,129 +25,6 @@ lastError: null, }; -mockChrome.power = { - requestKeepAwake: function() { - mockChrome.power.keepAwakeRequested = true; - }, - releaseKeepAwake: function() { - mockChrome.power.keepAwakeRequested = false; - }, - keepAwakeRequested: false, -}; - -mockChrome.fileManagerPrivate = { - onCopyProgress: { - addListener: function(callback) { - mockChrome.fileManagerPrivate.onCopyProgress.listener_ = callback; - }, - removeListener: function() { - mockChrome.fileManagerPrivate.onCopyProgress.listener_ = null; - }, - listener_: null, - }, - -}; - -/** - * Logs copy-progress events from a file operation manager. - */ -class EventLogger { - /** - * @param {!FileOperationManager} fileOperationManager The target file - * operation manager. - */ - constructor(fileOperationManager) { - this.events = []; - this.numberOfBeginEvents = 0; - this.numberOfErrorEvents = 0; - this.numberOfSuccessEvents = 0; - fileOperationManager.addEventListener( - 'copy-progress', this.onCopyProgress_.bind(this)); - } - - /** - * Log file operation manager copy-progress event details. - * @param {Event} event An event. - * @private - */ - onCopyProgress_(event) { - event = /** @type {FileOperationProgressEvent} */ (event); - if (event.reason === 'BEGIN') { - this.events.push(event); - this.numberOfBeginEvents++; - } - if (event.reason === 'ERROR') { - this.events.push(event); - this.numberOfErrorEvents++; - } - if (event.reason === 'SUCCESS') { - this.events.push(event); - this.numberOfSuccessEvents++; - } - } -} - -/** - * Provides fake implementation of chrome.fileManagerPrivate.startCopy. - */ -class BlockableFakeStartCopy { - /** - * @param {string} blockedDestination Destination url of an entry whose - * request should be blocked. - * @param {!Entry} sourceEntry Source entry. Single source entry is supported. - * @param {!Array<!MockFileSystem>} fileSystems File systems array. - */ - constructor(blockedDestination, sourceEntry, fileSystems) { - this.resolveBlockedOperationCallback = null; - this.blockedDestination_ = blockedDestination; - this.sourceEntry_ = sourceEntry; - this.fileSystems_ = fileSystems; - this.startCopyId_ = 0; - } - - /** - * Fake implementation of startCopy function. - * @param {!Entry} source - * @param {!Entry} destination - * @param {string} newName - * @param {function(number)} callback - */ - startCopyFunc(source, destination, newName, callback) { - const makeStatus = type => { - return { - type: type, - sourceUrl: source.toURL(), - destinationUrl: destination.toURL(), - }; - }; - - const completeCopyOperation = copyId => { - const newPath = joinPath('/', newName); - const fileSystem = - getFileSystemForURL(this.fileSystems_, destination.toURL()); - const mockEntry = /** @type {!MockEntry} */ (this.sourceEntry_); - fileSystem.entries[newPath] = - /** @type {!MockEntry} */ (mockEntry.clone(newPath)); - listener(copyId, makeStatus('end_copy')); - listener(copyId, makeStatus('success')); - }; - - this.startCopyId_++; - - callback(this.startCopyId_); - const listener = mockChrome.fileManagerPrivate.onCopyProgress.listener_; - listener(this.startCopyId_, makeStatus('begin')); - listener(this.startCopyId_, makeStatus('progress')); - - if (destination.toURL() === this.blockedDestination_) { - this.resolveBlockedOperationCallback = - completeCopyOperation.bind(this, this.startCopyId_); - } else { - completeCopyOperation(this.startCopyId_); - } - } -} - /** * Fake volume manager. */ @@ -221,56 +96,6 @@ } /** - * Resolves URL on the file system. - * @param {!MockFileSystem} fileSystem File system. - * @param {string} url URL. - * @param {function(!Entry)} success Success callback. - * @param {function(!FileError)=} opt_failure Failure callback. - */ -function resolveTestFileSystemURL(fileSystem, url, success, opt_failure) { - for (const name in fileSystem.entries) { - const entry = fileSystem.entries[name]; - if (entry.toURL() == url) { - success(entry); - return; - } - } - - if (opt_failure) { - opt_failure(new FileError()); - } -} - -/** - * Waits for events until 'success' or 'error'. - * @param {FileOperationManager} fileOperationManager File operation manager. - * @return {Promise} Promise to be fulfilled with an event list. - */ -function waitForEvents(fileOperationManager) { - return new Promise(fulfill => { - const events = []; - fileOperationManager.addEventListener('copy-progress', event => { - event = /** @type {FileOperationProgressEvent} */ (event); - events.push(event); - if (event.reason === 'SUCCESS' || event.reason === 'ERROR') { - fulfill(events); - } - }); - fileOperationManager.addEventListener('entries-changed', event => { - event = /** @type {FileOperationProgressEvent} */ (event); - events.push(event); - }); - fileOperationManager.addEventListener('delete', event => { - event = /** @type {FileOperationProgressEvent} */ (event); - events.push(event); - if (event.reason === 'SUCCESS' || event.reason === 'ERROR') { - fulfill(events); - } - }); - }); -} - -/** * Placeholder for mocked volume manager. * @type {(FakeVolumeManager|{getVolumeInfo: function()}?)} */ @@ -353,111 +178,6 @@ } /** - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export function testFindEntriesRecursively(callback) { - const fileSystem = createTestFileSystem('testVolume', { - '/': DIRECTORY_SIZE, - '/file.txt': 10, - '/file (1).txt': 10, - '/file (2).txt': 10, - '/file (3).txt': 10, - '/file (4).txt': 10, - '/file (5).txt': 10, - '/DCIM/': DIRECTORY_SIZE, - '/DCIM/IMG_1232.txt': 10, - '/DCIM/IMG_1233 (7).txt': 10, - '/DCIM/IMG_1234 (8).txt': 10, - '/DCIM/IMG_1235 (9).txt': 10, - }); - - const foundFiles = []; - fileOperationUtil - .findEntriesRecursively( - fileSystem.root, - fileEntry => { - foundFiles.push(fileEntry); - }) - .then(() => { - assertEquals(12, foundFiles.length); - callback(false); - }) - .catch(() => { - const error = true; - callback(error); - }); -} - -/** - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export function testFindFilesRecursively(callback) { - const fileSystem = createTestFileSystem('testVolume', { - '/': DIRECTORY_SIZE, - '/file.txt': 10, - '/file (1).txt': 10, - '/file (2).txt': 10, - '/file (3).txt': 10, - '/file (4).txt': 10, - '/file (5).txt': 10, - '/DCIM/': DIRECTORY_SIZE, - '/DCIM/IMG_1232.txt': 10, - '/DCIM/IMG_1233 (7).txt': 10, - '/DCIM/IMG_1234 (8).txt': 10, - '/DCIM/IMG_1235 (9).txt': 10, - }); - - const foundFiles = []; - fileOperationUtil - .findFilesRecursively( - fileSystem.root, - fileEntry => { - foundFiles.push(fileEntry); - }) - .then(() => { - assertEquals(10, foundFiles.length); - foundFiles.forEach(entry => { - assertTrue(entry.isFile); - }); - callback(false); - }) - .catch(() => { - const error = true; - callback(error); - }); -} - -/** - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export function testGatherEntriesRecursively(callback) { - const fileSystem = createTestFileSystem('testVolume', { - '/': DIRECTORY_SIZE, - '/file.txt': 10, - '/file (1).txt': 10, - '/file (2).txt': 10, - '/file (3).txt': 10, - '/file (4).txt': 10, - '/file (5).txt': 10, - '/DCIM/': DIRECTORY_SIZE, - '/DCIM/IMG_1232.txt': 10, - '/DCIM/IMG_1233 (7).txt': 10, - '/DCIM/IMG_1234 (8).txt': 10, - '/DCIM/IMG_1235 (9).txt': 10, - }); - - fileOperationUtil.gatherEntriesRecursively(fileSystem.root) - .then(gatheredFiles => { - assertEquals(12, gatheredFiles.length); - callback(false); - }) - .catch(() => { - const error = true; - callback(error); - }); -} - -/** * Tests the fileOperationUtil.deduplicatePath * @param {function(boolean)} callback Callback to be passed true on error. */ @@ -506,484 +226,6 @@ } /** - * Tests fileOperationManager.deleteEntries. - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export function testDelete(callback) { - // Prepare entries and their resolver. - const fileSystem = createTestFileSystem('testVolume', { - '/': DIRECTORY_SIZE, - '/test.txt': 10, - }); - window.webkitResolveLocalFileSystemURL = (url, success, failure) => { - resolveTestFileSystemURL(fileSystem, url, success, failure); - }; - - // Observing manager's events. - reportPromise( - waitForEvents(fileOperationManager).then(events => { - assertEquals('delete', events[0].type); - assertEquals('DELETE', events[0].status.operationType); - assertEquals('BEGIN', events[0].reason); - assertEquals(10, events[0].status.totalBytes); - assertEquals(0, events[0].status.processedBytes); - - const lastEvent = events[events.length - 1]; - assertEquals('delete', lastEvent.type); - assertEquals('DELETE', lastEvent.status.operationType); - assertEquals('SUCCESS', lastEvent.reason); - assertEquals(10, lastEvent.status.totalBytes); - assertEquals(10, lastEvent.status.processedBytes); - - assertFalse(events.some(e => e.type === 'copy-progress')); - }), - callback); - - fileOperationManager.deleteEntries([fileSystem.entries['/test.txt']]); -} - -/** - * Tests ZipTask initialization. - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export async function testZipTaskInit(callback) { - try { - const taskId = 'file-operation-23460982'; - const fileSystem = createTestFileSystem('testVolume', { - '/out': DIRECTORY_SIZE, - '/in': DIRECTORY_SIZE, - '/in/input 1.txt': 10, - '/in/input 2.txt': 20, - }); - - const sourceEntries = [ - fileSystem.entries['/in/input 1.txt'], - fileSystem.entries['/in/input 2.txt'], - ]; - const baseEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/in']); - const targetEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/out']); - - const task = new fileOperationUtil.ZipTask( - taskId, sourceEntries, targetEntry, baseEntry); - - assertEquals(util.FileOperationType.ZIP, task.operationType); - assertEquals(taskId, task.taskId); - assertEquals(baseEntry, task.zipBaseDirEntry); - assertEquals(targetEntry, task.targetDirEntry); - assertArrayEquals(sourceEntries, task.sourceEntries); - - await new Promise(resolve => task.initialize(resolve)); - - // The real number of bytes is computed in task.run(). - assertEquals(1, task.totalBytes); - - callback(false); - } catch (error) { - console.error(error); - callback(true); - } -} - -/** - * Tests ZipTask progress in normal circumstances. - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export async function testZipTaskRun(callback) { - try { - const taskId = 'file-operation-23460982'; - const fileSystem = createTestFileSystem('testVolume', { - '/out': DIRECTORY_SIZE, - '/in': DIRECTORY_SIZE, - '/in/input 1.txt': 10, - '/in/input 2.txt': 20, - }); - - const sourceEntries = [ - fileSystem.entries['/in/input 1.txt'], - fileSystem.entries['/in/input 2.txt'], - ]; - const baseEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/in']); - const targetEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/out']); - - const task = new fileOperationUtil.ZipTask( - taskId, sourceEntries, targetEntry, baseEntry); - - await new Promise(resolve => task.initialize(resolve)); - - const entryChangedCallback = () => assertNotReached(); - - let progressCount = 0; - const progressCallback = () => void ++progressCount; - - const destSize = 9876; - const wantZipId = 42; - const maxSteps = 5; - let step = 0; - - let zipSelectionCount = 0; - mockChrome.fileManagerPrivate.zipSelection = - (sources, parent, newName, callback) => { - assertEquals(0, zipSelectionCount++); - assertEquals(0, step); - assertArrayEquals(sourceEntries, sources); - const newPath = joinPath('/out', newName); - const newEntry = MockFileEntry.create( - fileSystem, newPath, /** @type {!Metadata} */ ({size: destSize})); - fileSystem.entries[newPath] = newEntry; - setTimeout(callback, 100, wantZipId, destSize); - }; - - mockChrome.fileManagerPrivate.getZipProgress = (zipId, callback) => { - assertEquals(wantZipId, zipId); - // By now, task.totalBytes should be set to the expected value. - assertEquals(destSize, task.totalBytes); - assertLT(step, maxSteps); - assertEquals(step, progressCount); - ++step; - const result = step < maxSteps ? -1 : 0; - const bytes = Math.round(destSize * step / maxSteps); - setTimeout(callback, 100, result, bytes); - }; - - mockChrome.fileManagerPrivate.cancelZip = (zipId) => assertNotReached(); - - await new Promise( - (resolve, reject) => - task.run(entryChangedCallback, progressCallback, resolve, reject)); - - assertEquals(maxSteps, progressCount); - assertEquals(maxSteps, step); - - callback(false); - } catch (error) { - console.error(error); - callback(true); - } -} - -/** - * Tests ZipTask cancellation before run() is called. - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export async function testZipTaskCancellationBeforeRun(callback) { - try { - const taskId = 'file-operation-23460982'; - const fileSystem = createTestFileSystem('testVolume', { - '/out': DIRECTORY_SIZE, - '/in': DIRECTORY_SIZE, - '/in/input 1.txt': 10, - '/in/input 2.txt': 20, - }); - - const sourceEntries = [ - fileSystem.entries['/in/input 1.txt'], - fileSystem.entries['/in/input 2.txt'], - ]; - const baseEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/in']); - const targetEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/out']); - - const task = new fileOperationUtil.ZipTask( - taskId, sourceEntries, targetEntry, baseEntry); - - await new Promise(resolve => task.initialize(resolve)); - - mockChrome.fileManagerPrivate.zipSelection = () => assertNotReached(); - mockChrome.fileManagerPrivate.getZipProgress = () => assertNotReached(); - mockChrome.fileManagerPrivate.cancelZip = () => assertNotReached(); - - // Request cancellation before running the task. - task.requestCancel(); - - const entryChangedCallback = () => assertNotReached(); - const progressCallback = () => assertNotReached(); - const successCallback = () => assertNotReached(); - await new Promise( - resolve => task.run( - entryChangedCallback, progressCallback, successCallback, error => { - assertTrue(error instanceof FileOperationError); - assertEquals( - util.FileOperationErrorType.FILESYSTEM_ERROR, error.code); - const domError = /** @type {!DOMError} */ (error.data); - assertTrue(domError instanceof DOMError); - assertEquals(util.FileError.ABORT_ERR, domError.name); - resolve(); - })); - - callback(false); - } catch (error) { - console.error(error); - callback(true); - } -} - -/** - * Tests ZipTask cancellation when it is requested while - * fileManagerPrivate.zipSelection() is running. - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export async function testZipTaskCancellationDuringRunStart(callback) { - try { - const taskId = 'file-operation-23460982'; - const fileSystem = createTestFileSystem('testVolume', { - '/out': DIRECTORY_SIZE, - '/in': DIRECTORY_SIZE, - '/in/input 1.txt': 10, - '/in/input 2.txt': 20, - }); - - const sourceEntries = [ - fileSystem.entries['/in/input 1.txt'], - fileSystem.entries['/in/input 2.txt'], - ]; - const baseEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/in']); - const targetEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/out']); - - const task = new fileOperationUtil.ZipTask( - taskId, sourceEntries, targetEntry, baseEntry); - - await new Promise(resolve => task.initialize(resolve)); - - const destSize = 9876; - const wantZipId = 42; - - let zipSelectionCount = 0; - let cancelZipCount = 0; - let getZipProgressCount = 0; - - mockChrome.fileManagerPrivate.zipSelection = - (sources, parent, newName, callback) => { - assertEquals(0, zipSelectionCount++); - assertEquals(0, cancelZipCount); - // Request cancellation during fileManagerPrivate.zipSelection(). - setTimeout(() => task.requestCancel(), 50); - setTimeout(callback, 100, wantZipId, destSize); - }; - - mockChrome.fileManagerPrivate.cancelZip = (zipId) => { - assertEquals(0, cancelZipCount++); - assertEquals(1, zipSelectionCount); - assertEquals(wantZipId, zipId); - }; - - mockChrome.fileManagerPrivate.getZipProgress = (zipId, callback) => { - assertEquals(0, getZipProgressCount++); - assertEquals(1, zipSelectionCount); - assertEquals(1, cancelZipCount); - assertEquals(wantZipId, zipId); - const result = +1; // Cancelled - const bytes = 0; - setTimeout(callback, 100, result, bytes); - }; - - const entryChangedCallback = () => assertNotReached(); - const progressCallback = () => assertNotReached(); - const successCallback = () => assertNotReached(); - await new Promise( - resolve => task.run( - entryChangedCallback, progressCallback, successCallback, error => { - assertTrue(error instanceof FileOperationError); - assertEquals( - util.FileOperationErrorType.FILESYSTEM_ERROR, error.code); - const domError = /** @type {!DOMError} */ (error.data); - assertTrue(domError instanceof DOMError); - assertEquals(util.FileError.ABORT_ERR, domError.name); - resolve(); - })); - - assertEquals(1, getZipProgressCount); - assertEquals(1, zipSelectionCount); - assertEquals(1, cancelZipCount); - - callback(false); - } catch (error) { - console.error(error); - callback(true); - } -} - -/** - * Tests ZipTask cancellation when it is requested while - * fileManagerPrivate.getZipProgress() is running. - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export async function testZipTaskCancellationDuringProgress(callback) { - try { - const taskId = 'file-operation-23460982'; - const fileSystem = createTestFileSystem('testVolume', { - '/out': DIRECTORY_SIZE, - '/in': DIRECTORY_SIZE, - '/in/input 1.txt': 10, - '/in/input 2.txt': 20, - }); - - const sourceEntries = [ - fileSystem.entries['/in/input 1.txt'], - fileSystem.entries['/in/input 2.txt'], - ]; - const baseEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/in']); - const targetEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/out']); - - const task = new fileOperationUtil.ZipTask( - taskId, sourceEntries, targetEntry, baseEntry); - - await new Promise(resolve => task.initialize(resolve)); - - const destSize = 9876; - const wantZipId = 42; - - let zipSelectionCount = 0; - let cancelZipCount = 0; - let getZipProgressCount = 0; - - mockChrome.fileManagerPrivate.zipSelection = - (sources, parent, newName, callback) => { - assertEquals(0, zipSelectionCount++); - assertEquals(0, cancelZipCount); - setTimeout(callback, 100, wantZipId, destSize); - }; - - mockChrome.fileManagerPrivate.cancelZip = (zipId) => { - assertEquals(0, cancelZipCount++); - assertEquals(1, zipSelectionCount); - assertEquals(1, getZipProgressCount); - assertEquals(wantZipId, zipId); - }; - - mockChrome.fileManagerPrivate.getZipProgress = (zipId, callback) => { - getZipProgressCount++; - assertEquals(1, zipSelectionCount); - assertEquals(wantZipId, zipId); - const bytes = 0; - if (getZipProgressCount == 1) { - assertEquals(0, cancelZipCount); - // Request cancellation during fileManagerPrivate.getZipProgress(). - setTimeout(() => task.requestCancel(), 50); - const result = -1; // In progress - setTimeout(callback, 100, result, bytes); - } else { - assertEquals(2, getZipProgressCount); - assertEquals(1, cancelZipCount); - const result = +1; // Cancelled - setTimeout(callback, 100, result, bytes); - } - }; - - let progressCallbackCount = 0; - const progressCallback = () => void ++progressCallbackCount; - const entryChangedCallback = () => assertNotReached(); - const successCallback = () => assertNotReached(); - await new Promise( - resolve => task.run( - entryChangedCallback, progressCallback, successCallback, error => { - assertTrue(error instanceof FileOperationError); - assertEquals( - util.FileOperationErrorType.FILESYSTEM_ERROR, error.code); - const domError = /** @type {!DOMError} */ (error.data); - assertTrue(domError instanceof DOMError); - assertEquals(util.FileError.ABORT_ERR, domError.name); - resolve(); - })); - - assertEquals(1, zipSelectionCount); - assertEquals(2, getZipProgressCount); - assertEquals(1, cancelZipCount); - assertEquals(1, progressCallbackCount); - - callback(false); - } catch (error) { - console.error(error); - callback(true); - } -} - -/** - * Tests ZipTask error during fileManagerPrivate.getZipProgress(). - * @param {function(boolean)} callback Callback to be passed true on error. - */ -export async function testZipTaskError(callback) { - try { - const taskId = 'file-operation-23460982'; - const fileSystem = createTestFileSystem('testVolume', { - '/out': DIRECTORY_SIZE, - '/in': DIRECTORY_SIZE, - '/in/input 1.txt': 10, - '/in/input 2.txt': 20, - }); - - const sourceEntries = [ - fileSystem.entries['/in/input 1.txt'], - fileSystem.entries['/in/input 2.txt'], - ]; - const baseEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/in']); - const targetEntry = - /** @type {!DirectoryEntry} */ (fileSystem.entries['/out']); - - const task = new fileOperationUtil.ZipTask( - taskId, sourceEntries, targetEntry, baseEntry); - - await new Promise(resolve => task.initialize(resolve)); - - const destSize = 9876; - const wantZipId = 42; - - let zipSelectionCount = 0; - let getZipProgressCount = 0; - - mockChrome.fileManagerPrivate.zipSelection = - (sources, parent, newName, callback) => { - assertEquals(0, zipSelectionCount++); - setTimeout(callback, 100, wantZipId, destSize); - }; - - mockChrome.fileManagerPrivate.cancelZip = () => assertNotReached(); - - mockChrome.fileManagerPrivate.getZipProgress = (zipId, callback) => { - assertEquals(0, getZipProgressCount++); - assertEquals(1, zipSelectionCount); - assertEquals(wantZipId, zipId); - const result = +2; // Error - const bytes = 0; - setTimeout(callback, 100, result, bytes); - }; - - const progressCallback = () => assertNotReached(); - const entryChangedCallback = () => assertNotReached(); - const successCallback = () => assertNotReached(); - await new Promise( - resolve => task.run( - entryChangedCallback, progressCallback, successCallback, error => { - assertTrue(error instanceof FileOperationError); - assertEquals( - util.FileOperationErrorType.FILESYSTEM_ERROR, error.code); - const domError = /** @type {!DOMError} */ (error.data); - assertTrue(domError instanceof DOMError); - assertEquals( - util.FileError.INVALID_MODIFICATION_ERR, domError.name); - resolve(); - })); - - assertEquals(1, zipSelectionCount); - assertEquals(1, getZipProgressCount); - - callback(false); - } catch (error) { - console.error(error); - callback(true); - } -} - -/** * Test writeFile() with file dragged from browser. */ export async function testWriteFile(done) {
diff --git a/ui/file_manager/file_manager/background/js/file_operation_util.js b/ui/file_manager/file_manager/background/js/file_operation_util.js index b67ec80..6704793 100644 --- a/ui/file_manager/file_manager/background/js/file_operation_util.js +++ b/ui/file_manager/file_manager/background/js/file_operation_util.js
@@ -2,24 +2,31 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assert} from 'chrome://resources/js/assert.js'; -import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.js'; - -import {AsyncUtil} from '../../common/js/async_util.js'; -import {createDOMError} from '../../common/js/dom_utils.js'; -import {FileOperationError, FileOperationProgressEvent} from '../../common/js/file_operation_common.js'; -import {metrics} from '../../common/js/metrics.js'; -import {TrashEntry} from '../../common/js/trash.js'; import {util} from '../../common/js/util.js'; -import {metadataProxy} from './metadata_proxy.js'; - /** * Utilities for file operations. */ const fileOperationUtil = {}; /** + * Error class used to report problems with a copy operation. + * If the code is UNEXPECTED_SOURCE_FILE, data should be a path of the file. + * If the code is TARGET_EXISTS, data should be the existing Entry. + * If the code is FILESYSTEM_ERROR, data should be the FileError. + */ +export class FileOperationError { + /** + * @param {util.FileOperationErrorType} code Error type. + * @param {string|Entry|DOMError} data Additional data. + */ + constructor(code, data) { + this.code = code; + this.data = data; + } +} + +/** * Resolves a path to either a DirectoryEntry or a FileEntry, regardless of * whether the path is a directory or file. * @@ -105,1303 +112,6 @@ }; /** - * Traverses files/subdirectories of the given entry, and returns them. - * In addition, this method annotate the size of each entry. The result will - * include the entry itself. - * - * @param {Entry} entry The root Entry for traversing. - * @param {function(Array<Entry>)} successCallback Called when the traverse - * is successfully done with the array of the entries. - * @param {function(DOMError)} errorCallback Called on error with the first - * occurred error (i.e. following errors will just be discarded). - * @private - */ -fileOperationUtil.resolveRecursively_ = - (entry, successCallback, errorCallback) => { - const result = []; - let error = null; - let numRunningTasks = 0; - - const maybeInvokeCallback = () => { - // If there still remain some running tasks, wait their finishing. - if (numRunningTasks > 0) { - return; - } - - if (error) { - errorCallback(error); - } else { - successCallback(result); - } - }; - - // The error handling can be shared. - const onError = fileError => { - // If this is the first error, remember it. - if (!error) { - error = fileError; - } - --numRunningTasks; - maybeInvokeCallback(); - }; - - // If this is recursing through a very large directory structure (1000's - // of files), this will flood the browser process with IPC because each - // getEntryMetadata call causes an IPC to the browser. This can cause the - // browser to become unresponsive, and may even be killed by a watchdog - // timer. To prevent this, limit the number of concurrent getEntryMetadata - // calls to a reasonable level. - const metadataFetchQueue = new AsyncUtil.ConcurrentQueue(64); - - const process = entry => { - numRunningTasks++; - result.push(entry); - if (entry.isDirectory) { - // The size of a directory is 1 bytes here, so that the progress bar - // will work smoother. - // TODO(hidehiko): Remove this hack. - entry.size = 1; - - // Recursively traverse children. - const reader = entry.createReader(); - reader.readEntries(function processSubEntries(subEntries) { - if (error || subEntries.length == 0) { - // If an error is found already, or this is the completion - // callback, then finish the process. - --numRunningTasks; - maybeInvokeCallback(); - return; - } - - for (let i = 0; i < subEntries.length; i++) { - process(subEntries[i]); - } - - // Continue to read remaining children. - reader.readEntries(processSubEntries, onError); - }, onError); - } else { - // For a file, annotate the file size. - metadataFetchQueue.run(done => { - metadataProxy.getEntryMetadata(entry) - .then( - metadata => { - entry.size = metadata.size; - --numRunningTasks; - maybeInvokeCallback(); - }, - onError) - .finally(done); - }); - } - }; - - process(entry); - }; - -/** - * Recursively gathers files from the given entry, resolving with - * the complete list of files when traversal is complete. - * - * <p>For real-time (as you scan) results use {@code findFilesRecursively}. - * - * @param {!DirectoryEntry} entry The DirectoryEntry to scan. - * @return {!Promise<!Array<!Entry>>} Resolves when scanning is complete. - */ -fileOperationUtil.gatherEntriesRecursively = entry => { - /** @type {!Array<!Entry>} */ - const gatheredFiles = []; - - return fileOperationUtil - .findEntriesRecursively( - entry, - /** @param {!Entry} entry */ - entry => { - gatheredFiles.push(entry); - }) - .then(() => { - return gatheredFiles; - }); -}; - -/** - * Recursively discovers files from the given entry, emitting individual - * results as they are found to {@code onResultCallback}. - * - * <p>For results gathered up in a tidy bundle, use - * {@code gatherFilesRecursively}. - * - * @param {!DirectoryEntry} entry The DirectoryEntry to scan. - * @param {function(!FileEntry)} onResultCallback called when - * a {@code FileEntry} is discovered. - * @return {!Promise} Resolves when scanning is complete. - */ -fileOperationUtil.findFilesRecursively = (entry, onResultCallback) => { - return fileOperationUtil.findEntriesRecursively( - entry, - /** @param {!Entry} entry */ - entry => { - if (entry.isFile) { - onResultCallback(/** @type {!FileEntry} */ (entry)); - } - }); -}; - -/** - * Recursively discovers files and directories beneath the given entry, - * emitting individual results as they are found to {@code onResultCallback}. - * - * <p>For results gathered up in a tidy bundle, use - * {@code gatherEntriesRecursively}. - * - * @param {!DirectoryEntry} entry The DirectoryEntry to scan. - * @param {function(!Entry)} onResultCallback called when - * an {@code Entry} is discovered. - * @return {!Promise} Resolves when scanning is complete. - */ -fileOperationUtil.findEntriesRecursively = (entry, onResultCallback) => { - return new Promise((resolve, reject) => { - let numRunningTasks = 0; - let scanError = null; - - /** - * @param {*=} opt_error If defined immediately - * terminates scanning. - */ - const maybeSettlePromise = opt_error => { - scanError = opt_error; - - if (scanError) { - // Closure compiler currently requires an argument to reject. - reject(undefined); - return; - } - - // If there still remain some running tasks, wait their finishing. - if (numRunningTasks === 0) { - // Closure compiler currently requires an argument to resolve. - resolve(undefined); - } - }; - - /** @param {!Entry} entry */ - const processEntry = entry => { - // All scanning stops when an error is encountered. - if (scanError) { - return; - } - - onResultCallback(entry); - if (entry.isDirectory) { - processDirectory(/** @type {!DirectoryEntry} */ (entry)); - } - }; - - /** @param {!DirectoryEntry} directory */ - const processDirectory = directory => { - // All scanning stops when an error is encountered. - if (scanError) { - return; - } - - numRunningTasks++; - - // Recursively traverse children. - // reader.readEntries chunksResults resulting in the need - // for us to call it multiple times. - const reader = directory.createReader(); - reader.readEntries(function processSubEntries(subEntries) { - if (subEntries.length === 0) { - // If an error is found already, or this is the completion - // callback, then finish the process. - --numRunningTasks; - maybeSettlePromise(); - return; - } - - subEntries.forEach(processEntry); - - // Continue to read remaining children. - reader.readEntries(processSubEntries, maybeSettlePromise); - }, maybeSettlePromise); - }; - - processEntry(entry); - }); -}; - -/** - * Calls {@code callback} for each child entry of {@code directory}. - * - * @param {!DirectoryEntry} directory - * @param {function(!Entry)} callback - * @return {!Promise} Resolves when listing is complete. - */ -fileOperationUtil.listEntries = (directory, callback) => { - return new Promise((resolve, reject) => { - const reader = directory.createReader(); - - const readEntries = () => { - reader.readEntries( - /** @param {!Array<!Entry>} entries */ - entries => { - if (entries.length === 0) { - resolve(undefined); - return; - } - entries.forEach(callback); - readEntries(); - }, - reject); - }; - - readEntries(); - }); -}; - -/** - * When set, forces all file operations to complete with an error. - * @type {boolean} - */ -fileOperationUtil.forceErrorForTest = false; - -/** - * Copies source to parent with the name newName recursively. - * This should work very similar to FileSystem API's copyTo. The difference is; - * - The progress callback is supported. - * - The cancellation is supported. - * - * @param {!Entry} source The entry to be copied. - * @param {!DirectoryEntry} parent The entry of the destination directory. - * @param {string} newName The name of copied file. - * @param {function(string, Entry)} entryChangedCallback - * Callback invoked when an entry is created with the source URL and - * the destination Entry. - * @param {function(string, number)} progressCallback Callback invoked - * periodically during the copying. It takes the source URL and the - * processed bytes of it. - * @param {function(Entry)} successCallback Callback invoked when the copy - * is successfully done with the Entry of the created entry. - * @param {function(DOMError)} errorCallback Callback invoked when an error - * is found. - * @return {function()} Callback to cancel the current file copy operation. - * When the cancel is done, errorCallback will be called. The returned - * callback must not be called more than once. - */ -fileOperationUtil.copyTo = - (source, parent, newName, entryChangedCallback, progressCallback, - successCallback, errorCallback) => { - /** @type {number|undefined} */ - let copyId; - const pendingCallbacks = []; - - // Makes the callback called in order they were invoked. - const callbackQueue = new AsyncUtil.Queue(); - - const onCopyProgress = (progressCopyId, status) => { - callbackQueue.run(callback => { - if (copyId === null) { - // If the copyId is not yet available, wait for it. - pendingCallbacks.push( - onCopyProgress.bind(null, progressCopyId, status)); - callback(); - return; - } - - // This is not what we're interested in. - if (progressCopyId != copyId) { - callback(); - return; - } - - if (window.IN_TEST && fileOperationUtil.forceErrorForTest) { - chrome.fileManagerPrivate.onCopyProgress.removeListener( - onCopyProgress); - const forceErrorForTest = util.FileError.INVALID_STATE_ERR; - errorCallback(createDOMError(forceErrorForTest)); - callback(); - return; - } - - switch (status.type) { - case 'begin': - callback(); - break; - - case 'progress': - progressCallback(status.sourceUrl, status.size); - callback(); - break; - - case 'end_copy': - // TODO(mtomasz): Convert URL to Entry in custom bindings. - (source.isFile ? parent.getFile : parent.getDirectory) - .call( - parent, newName, null, - entry => { - entryChangedCallback(status.sourceUrl, entry); - callback(); - }, - () => { - entryChangedCallback(status.sourceUrl, null); - callback(); - }); - break; - - case 'end_move': - console.error( - 'Unexpected event: ' + status.type + - ' (move not implemented yet)'); - callback(); - break; - - case 'end_remove_source': - console.error( - 'Unexpected event: ' + status.type + - ' (move not implemented yet)'); - callback(); - break; - - case 'success': - chrome.fileManagerPrivate.onCopyProgress.removeListener( - onCopyProgress); - // TODO(mtomasz): Convert URL to Entry in custom bindings. - util.URLsToEntries( - [status.destinationUrl], destinationEntries => { - successCallback(destinationEntries[0] || null); - callback(); - }); - break; - - case 'error': - console.error( - 'copy failed. sourceUrl: ' + source.toURL() + - ' error: ' + status.error); - chrome.fileManagerPrivate.onCopyProgress.removeListener( - onCopyProgress); - errorCallback(createDOMError(status.error)); - callback(); - break; - - default: - // Found unknown state. Cancel the task, and return an error. - console.error('Unknown progress type: ' + status.type); - chrome.fileManagerPrivate.onCopyProgress.removeListener( - onCopyProgress); - chrome.fileManagerPrivate.cancelCopy( - assert(copyId), util.checkAPIError); - errorCallback(createDOMError(util.FileError.INVALID_STATE_ERR)); - callback(); - } - }); - }; - - // Register the listener before calling startCopy. Otherwise some events - // would be lost. - chrome.fileManagerPrivate.onCopyProgress.addListener(onCopyProgress); - - // Then starts the copy. - chrome.fileManagerPrivate.startCopy( - source, parent, newName, startCopyId => { - // last error contains the FileError code on error. - if (chrome.runtime.lastError) { - // Unsubscribe the progress listener. - chrome.fileManagerPrivate.onCopyProgress.removeListener( - onCopyProgress); - errorCallback( - createDOMError(chrome.runtime.lastError.message || '')); - return; - } - - copyId = startCopyId; - for (let i = 0; i < pendingCallbacks.length; i++) { - pendingCallbacks[i](); - } - }); - - return () => { - // If copyId is not yet available, wait for it. - if (copyId === undefined) { - pendingCallbacks.push(() => { - chrome.fileManagerPrivate.cancelCopy( - assert(copyId), util.checkAPIError); - }); - return; - } - - chrome.fileManagerPrivate.cancelCopy(copyId, util.checkAPIError); - }; - }; - -/** - * A record of a queued copy operation. - * - * Multiple copy operations may be queued at any given time. Additional - * Tasks may be added while the queue is being serviced. Though a - * cancel operation cancels everything in the queue. - */ -fileOperationUtil.Task = class { - /** - * @param {string} taskId A unique ID for identifying this task. - * @param {util.FileOperationType} operationType The type of this operation. - * @param {Array<Entry>} sourceEntries Array of source entries. - * @param {DirectoryEntry} targetDirEntry Target directory. - */ - constructor(taskId, operationType, sourceEntries, targetDirEntry) { - /** @type {string} */ - this.taskId = taskId; - - /** @type {util.FileOperationType} */ - this.operationType = operationType; - - /** @type {Array<Entry>} */ - this.sourceEntries = sourceEntries; - - /** @type {DirectoryEntry} */ - this.targetDirEntry = targetDirEntry; - - /** - * An array of map from url to Entry being processed. - * @type {Array<Object<Entry>>} - */ - this.processingEntries = null; - - /** - * Total number of bytes to be processed. Filled in initialize() or run(). - * Use 1 as an initial value to indicate that the task is not completed. - * @type {number} - */ - this.totalBytes = 1; - - /** - * Total number of already processed bytes. Updated periodically. - * @type {number} - */ - this.processedBytes = 0; - - /** - * Total number of remaining items. Updated periodically. - * @type {number} - */ - this.numRemainingItems = this.sourceEntries.length; - - /** - * Index of the progressing entry in sourceEntries. - * @private {number} - */ - this.processingSourceIndex_ = 0; - - /** - * Set to true when cancel is requested. - * @private {boolean} - */ - this.cancelRequested_ = false; - - /** - * Callback to cancel the running process. - * @private {?function()} - */ - this.cancelCallback_ = null; - - // TODO(hidehiko): After we support recursive copy, we don't need this. - // If directory already exists, we try to make a copy named 'dir (X)', - // where X is a number. When we do this, all subsequent copies from - // inside the subtree should be mapped to the new directory name. - // For example, if 'dir' was copied as 'dir (1)', then 'dir/file.txt' should - // become 'dir (1)/file.txt'. - this.renamedDirectories_ = []; - - /** - * Number of progress item sequence used in calculating moving average - * speed of task. - * @private {number} - */ - this.SPEED_BUFFER_WINDOW_ = 20; - - /** - * Speedometer object used to calculate and track speed and remaining time. - * @protected {fileOperationUtil.Speedometer} - */ - this.speedometer_ = - new fileOperationUtil.Speedometer(this.SPEED_BUFFER_WINDOW_); - } - - - /** - * @param {function()} callback When entries resolved. - */ - initialize(callback) { - callback(); - } - - /** - * Requests cancellation of this task. - * When the cancellation is done, it is notified via callbacks of run(). - */ - requestCancel() { - this.cancelRequested_ = true; - if (this.cancelCallback_) { - const callback = this.cancelCallback_; - this.cancelCallback_ = null; - callback(); - } - } - - /** - * Runs the task. Sub classes must implement this method. - * - * @param {function(util.EntryChangedKind, Entry)} entryChangedCallback - * Callback invoked when an entry is changed. - * @param {function()} progressCallback Callback invoked periodically during - * the operation. - * @param {function()} successCallback Callback run on success. - * @param {function(FileOperationError)} errorCallback Callback - * run on error. - */ - run(entryChangedCallback, progressCallback, successCallback, errorCallback) {} - - /** - * Get states of the task. - * TODO(hirono): Removes this method and sets a task to progress events. - * @return {!fileOperationUtil.Status} Status object. - */ - getStatus() { - const processingEntry = this.sourceEntries[this.processingSourceIndex_]; - return { - operationType: this.operationType, - numRemainingItems: this.numRemainingItems, - totalBytes: this.totalBytes, - processedBytes: this.processedBytes, - processingEntryName: processingEntry ? processingEntry.name : '', - targetDirEntryName: this.targetDirEntry.name, - remainingTime: this.speedometer_.getRemainingTime(), - }; - } - - /** - * Obtains the number of total processed bytes. - * @return {number} Number of total processed bytes. - * @private - */ - calcProcessedBytes_() { - let bytes = 0; - for (let i = 0; i < this.processingSourceIndex_ + 1; i++) { - const entryMap = this.processingEntries[i]; - if (!entryMap) { - break; - } - for (const name in entryMap) { - bytes += i < this.processingSourceIndex_ ? - entryMap[name].size : - entryMap[name].processedBytes; - } - } - return bytes; - } - - /** - * Obtains the number of remaining items. - * @return {number} Number of remaining items. - * @private - */ - calcNumRemainingItems_() { - let numRemainingItems = 0; - - let resolvedEntryMap; - if (this.processingEntries && this.processingEntries.length > 0) { - resolvedEntryMap = this.processingEntries[this.processingSourceIndex_]; - } - - if (resolvedEntryMap) { - for (const key in resolvedEntryMap) { - if (resolvedEntryMap.hasOwnProperty(key) && - resolvedEntryMap[key].processedBytes === 0) { - numRemainingItems++; - } - } - for (let i = this.processingSourceIndex_ + 1; - i < this.processingEntries.length; i++) { - numRemainingItems += - Object.keys(this.processingEntries[i] || {}).length; - } - } else { - numRemainingItems = - this.sourceEntries.length - this.processingSourceIndex_; - } - - return numRemainingItems; - } -}; - -/** - * Task to copy entries. - */ -fileOperationUtil.CopyTask = class extends fileOperationUtil.Task { - /** - * @param {string} taskId A unique ID for identifying this task. - * @param {Array<Entry>} sourceEntries Array of source entries. - * @param {DirectoryEntry} targetDirEntry Target directory. - * @param {boolean} deleteAfterCopy Whether the delete original files after - * copy. - */ - constructor(taskId, sourceEntries, targetDirEntry, deleteAfterCopy) { - super( - taskId, - deleteAfterCopy ? util.FileOperationType.MOVE : - util.FileOperationType.COPY, - sourceEntries, targetDirEntry); - this.deleteAfterCopy = deleteAfterCopy; - - /** - * Rate limiter which is used to avoid sending update request for progress - * bar too frequently. - * @type {AsyncUtil.RateLimiter} - * @private - */ - this.updateProgressRateLimiter_ = null; - } - - /** - * Initializes the CopyTask. - * @param {function()} callback Called when the initialize is completed. - */ - initialize(callback) { - const group = new AsyncUtil.Group(); - // Correct all entries to be copied for status update. - this.processingEntries = []; - for (let i = 0; i < this.sourceEntries.length; i++) { - group.add(function(index, callback) { - fileOperationUtil.resolveRecursively_( - this.sourceEntries[index], - resolvedEntries => { - const resolvedEntryMap = {}; - for (let j = 0; j < resolvedEntries.length; ++j) { - const entry = resolvedEntries[j]; - entry.processedBytes = 0; - resolvedEntryMap[entry.toURL()] = entry; - } - this.processingEntries[index] = resolvedEntryMap; - callback(); - }, - error => { - console.warn('Failed to resolve for copy: %s', error.name); - callback(); - }); - }.bind(this, i)); - } - - group.run(() => { - // Fill totalBytes. - this.totalBytes = 0; - for (let i = 0; i < this.processingEntries.length; i++) { - for (const entryURL in this.processingEntries[i]) { - this.totalBytes += this.processingEntries[i][entryURL].size; - } - } - this.speedometer_.setTotalBytes(this.totalBytes); - - callback(); - }); - } - - /** - * Copies all entries to the target directory. - * Note: this method contains also the operation of "Move" due to historical - * reason. - * - * @param {function(util.EntryChangedKind, Entry)} entryChangedCallback - * Callback invoked when an entry is changed. - * @param {function()} progressCallback Callback invoked periodically during - * the copying. - * @param {function()} successCallback On success. - * @param {function(FileOperationError)} errorCallback On error. - * @override - */ - run(entryChangedCallback, progressCallback, successCallback, errorCallback) { - // TODO(hidehiko): We should be able to share the code to iterate on entries - // with serviceMoveTask_(). - if (this.sourceEntries.length == 0) { - successCallback(); - return; - } - - // TODO(hidehiko): Delete after copy is the implementation of Move. - // Migrate the part into MoveTask.run(). - const deleteOriginals = () => { - let count = this.sourceEntries.length; - - const onEntryDeleted = entry => { - entryChangedCallback(util.EntryChangedKind.DELETED, entry); - count--; - if (!count) { - successCallback(); - } - }; - - const onFilesystemError = err => { - errorCallback(new FileOperationError( - util.FileOperationErrorType.FILESYSTEM_ERROR, err)); - }; - - for (let i = 0; i < this.sourceEntries.length; i++) { - const entry = this.sourceEntries[i]; - util.removeFileOrDirectory( - entry, onEntryDeleted.bind(null, entry), onFilesystemError); - } - }; - - /** - * Accumulates processed bytes and call |progressCallback| if needed. - * - * @param {number} index The index of processing source. - * @param {string} sourceEntryUrl URL of the entry which has been processed. - * @param {number=} opt_size Processed bytes of the |sourceEntry|. If it is - * dropped, all bytes of the entry are considered to be processed. - */ - let updateProgress = function(index, sourceEntryUrl, opt_size) { - if (!sourceEntryUrl) { - return; - } - - const processedEntry = this.processingEntries[index][sourceEntryUrl]; - if (!processedEntry) { - return; - } - - const alreadyCompleted = - processedEntry.processedBytes === processedEntry.size; - - // Accumulates newly processed bytes. - const size = opt_size !== undefined ? opt_size : processedEntry.size; - this.processedBytes += size - processedEntry.processedBytes; - processedEntry.processedBytes = size; - this.speedometer_.update(this.processedBytes); - - // updateProgress can be called multiple times for a single file copy, and - // it might not be called for a small file. - // The following prevents multiple call for a single file to decrement - // numRemainingItems multiple times. - // For small files, it will be decremented by next - // calcNumRemainingItems_(). - if (!alreadyCompleted && - processedEntry.processedBytes === processedEntry.size) { - this.numRemainingItems--; - } - - // Updates progress bar in limited frequency so that intervals between - // updates have at least one second. - this.updateProgressRateLimiter_.run(); - }; - updateProgress = updateProgress.bind(this); - - this.updateProgressRateLimiter_ = - new AsyncUtil.RateLimiter(progressCallback, 1000); - - this.numRemainingItems = this.calcNumRemainingItems_(); - - // Number of consecutive errors. Increases while failing and resets to zero - // when one of them succeeds. - let errorCount = 0; - let lastError; - - AsyncUtil.forEach( - this.sourceEntries, - (callback, entry, index) => { - if (this.cancelRequested_) { - errorCallback(new FileOperationError( - util.FileOperationErrorType.FILESYSTEM_ERROR, - createDOMError(util.FileError.ABORT_ERR))); - return; - } - progressCallback(); - this.processEntry_( - assert(entry), assert(this.targetDirEntry), - (sourceEntryUrl, destinationEntry) => { - updateProgress(index, sourceEntryUrl); - // The destination entry may be null, if the copied file got - // deleted just after copying. - if (destinationEntry) { - entryChangedCallback( - util.EntryChangedKind.CREATED, destinationEntry); - } - }, - (sourceEntryUrl, size) => { - updateProgress(index, sourceEntryUrl, size); - }, - () => { - // Finishes off delayed updates if necessary. - this.updateProgressRateLimiter_.runImmediately(); - // Update current source index and processing bytes. - this.processingSourceIndex_ = index + 1; - this.processedBytes = this.calcProcessedBytes_(); - this.numRemainingItems = this.calcNumRemainingItems_(); - this.speedometer_.update(this.processedBytes); - errorCount = 0; - callback(); - }, - error => { - // Finishes off delayed updates if necessary. - this.updateProgressRateLimiter_.runImmediately(); - // Update current source index and processing bytes. - this.processingSourceIndex_ = index + 1; - this.processedBytes = this.calcProcessedBytes_(); - this.numRemainingItems = this.calcNumRemainingItems_(); - this.speedometer_.update(this.processedBytes); - errorCount++; - lastError = error; - if (errorCount < - fileOperationUtil.CopyTask.CONSECUTIVE_ERROR_LIMIT_) { - callback(); - } else { - errorCallback(error); - } - }); - }, - () => { - if (lastError) { - errorCallback(lastError); - } else if (this.deleteAfterCopy) { - deleteOriginals(); - } else { - successCallback(); - } - }); - } - - /** - * Copies the source entry to the target directory. - * - * @param {!Entry} sourceEntry An entry to be copied. - * @param {!DirectoryEntry} destinationEntry The entry which will contain the - * copied entry. - * @param {function(string, Entry)} entryChangedCallback - * Callback invoked when an entry is created with the source URL and - * the destination Entry. - * @param {function(string, number)} progressCallback Callback invoked - * periodically during the copying. - * @param {function()} successCallback On success. - * @param {function(FileOperationError)} errorCallback On error. - * @private - */ - processEntry_( - sourceEntry, destinationEntry, entryChangedCallback, progressCallback, - successCallback, errorCallback) { - fileOperationUtil.deduplicatePath( - destinationEntry, sourceEntry.name, destinationName => { - if (this.cancelRequested_) { - errorCallback(new FileOperationError( - util.FileOperationErrorType.FILESYSTEM_ERROR, - createDOMError(util.FileError.ABORT_ERR))); - return; - } - this.cancelCallback_ = fileOperationUtil.copyTo( - sourceEntry, destinationEntry, destinationName, - entryChangedCallback, progressCallback, - entry => { - this.cancelCallback_ = null; - successCallback(); - }, - error => { - this.cancelCallback_ = null; - errorCallback(new FileOperationError( - util.FileOperationErrorType.FILESYSTEM_ERROR, error)); - }); - }, errorCallback); - } -}; - -/** - * Number of consecutive errors to stop CopyTask. - * @const {number} - * @private - */ -fileOperationUtil.CopyTask.CONSECUTIVE_ERROR_LIMIT_ = 100; - -/** - * Task to move entries. - */ -fileOperationUtil.MoveTask = class extends fileOperationUtil.Task { - /** - * @param {string} taskId A unique ID for identifying this task. - * @param {Array<Entry>} sourceEntries Array of source entries. - * @param {DirectoryEntry} targetDirEntry Target directory. - */ - constructor(taskId, sourceEntries, targetDirEntry) { - super(taskId, util.FileOperationType.MOVE, sourceEntries, targetDirEntry); - } - - /** - * Initializes the MoveTask. - * @param {function()} callback Called when the initialize is completed. - */ - initialize(callback) { - // This may be moving from search results, where it fails if we - // move parent entries earlier than child entries. We should - // process the deepest entry first. Since move of each entry is - // done by a single moveTo() call, we don't need to care about the - // recursive traversal order. - this.sourceEntries.sort((entry1, entry2) => { - return entry2.toURL().length - entry1.toURL().length; - }); - - this.processingEntries = []; - for (let i = 0; i < this.sourceEntries.length; i++) { - const processingEntryMap = {}; - const entry = this.sourceEntries[i]; - - // The move should be done with updating the metadata. So here we assume - // all the file size is 1 byte. (Avoiding 0, so that progress bar can - // move smoothly). - // TODO(hidehiko): Remove this hack. - entry.size = 1; - processingEntryMap[entry.toURL()] = entry; - this.processingEntries[i] = processingEntryMap; - } - - callback(); - } - - /** - * Moves all entries in the task. - * - * @param {function(util.EntryChangedKind, Entry)} entryChangedCallback - * Callback invoked when an entry is changed. - * @param {function()} progressCallback Callback invoked periodically during - * the moving. - * @param {function()} successCallback On success. - * @param {function(FileOperationError)} errorCallback On error. - * @override - */ - run(entryChangedCallback, progressCallback, successCallback, errorCallback) { - if (this.sourceEntries.length == 0) { - successCallback(); - return; - } - - AsyncUtil.forEach( - this.sourceEntries, - (callback, entry, index) => { - if (this.cancelRequested_) { - errorCallback(new FileOperationError( - util.FileOperationErrorType.FILESYSTEM_ERROR, - createDOMError(util.FileError.ABORT_ERR))); - return; - } - progressCallback(); - fileOperationUtil.MoveTask.processEntry_( - assert(entry), assert(this.targetDirEntry), - entryChangedCallback, () => { - // Update current source index. - this.processingSourceIndex_ = index + 1; - this.processedBytes = this.calcProcessedBytes_(); - this.numRemainingItems = this.calcNumRemainingItems_(); - callback(); - }, errorCallback); - }, - () => { - successCallback(); - }); - } - - /** - * Moves the sourceEntry to the targetDirEntry in this task. - * - * @param {Entry} sourceEntry An entry to be moved. - * @param {!DirectoryEntry} destinationEntry The entry of the destination - * directory. - * @param {function(util.EntryChangedKind, Entry)} entryChangedCallback - * Callback invoked when an entry is changed. - * @param {function()} successCallback On success. - * @param {function(FileOperationError)} errorCallback On error. - * @private - */ - static processEntry_( - sourceEntry, destinationEntry, entryChangedCallback, successCallback, - errorCallback) { - const destination = - /** @type{!DirectoryEntry} */ ( - assert(util.unwrapEntry(destinationEntry))); - fileOperationUtil.deduplicatePath( - destination, sourceEntry.name, destinationName => { - sourceEntry.moveTo( - destination, destinationName, - movedEntry => { - entryChangedCallback(util.EntryChangedKind.CREATED, movedEntry); - entryChangedCallback( - util.EntryChangedKind.DELETED, sourceEntry); - successCallback(); - }, - error => { - errorCallback(new FileOperationError( - util.FileOperationErrorType.FILESYSTEM_ERROR, error)); - }); - }, errorCallback); - } -}; - -/** - * Task to create a zip archive. - */ -fileOperationUtil.ZipTask = class extends fileOperationUtil.Task { - /** - * @param {string} taskId A unique ID for identifying this task. - * @param {!Array<!Entry>} sourceEntries Array of source entries. - * @param {!DirectoryEntry} targetDirEntry Target directory. - * @param {!DirectoryEntry} zipBaseDirEntry Base directory dealt as a root - * in ZIP archive. - */ - constructor(taskId, sourceEntries, targetDirEntry, zipBaseDirEntry) { - super(taskId, util.FileOperationType.ZIP, sourceEntries, targetDirEntry); - this.zipBaseDirEntry = zipBaseDirEntry; - } - - /** - * Runs a zip file creation task. - * - * @param {function(util.EntryChangedKind, Entry)} entryChangedCallback - * Callback invoked when an entry is changed. - * @param {function()} progressCallback Callback invoked periodically during - * the moving. - * @param {function()} successCallback On complete. - * @param {function(FileOperationError)} errorCallback On error. - * @override - */ - run(entryChangedCallback, progressCallback, successCallback, errorCallback) { - const f = async () => { - try { - // TODO(crbug.com/1238237) Localize the name. - let destName = 'Archive'; - - // If there is only one entry to zip, use this entry's name for the ZIP - // filename. - if (this.sourceEntries.length == 1) { - const entryName = this.sourceEntries[0].name; - const i = entryName.lastIndexOf('.'); - destName = ((i < 0) ? entryName : entryName.substr(0, i)); - } - - const destPath = await fileOperationUtil.deduplicatePath( - this.targetDirEntry, destName + '.zip'); - - if (this.cancelRequested_) { - throw createDOMError(util.FileError.ABORT_ERR); - } - - // Start ZIP operation. - const startTime = Date.now(); - const {zipId, totalBytes} = await new Promise( - (resolve, reject) => chrome.fileManagerPrivate.zipSelection( - assert(this.sourceEntries), this.zipBaseDirEntry, destPath, - (zipId, totalBytes) => chrome.runtime.lastError ? - reject(chrome.runtime.lastError) : - resolve({zipId, totalBytes}))); - - this.totalBytes = totalBytes; - this.speedometer_.setTotalBytes(this.totalBytes); - - if (this.cancelRequested_) { - // Cancellation was requested while fileManagerPrivate.zipSelection() - // was running. - chrome.fileManagerPrivate.cancelZip(zipId); - } else { - // Set up cancellation callback. - this.cancelCallback_ = () => - chrome.fileManagerPrivate.cancelZip(zipId); - } - - // Monitor progress. - while (true) { - const {result, bytes} = await new Promise( - (resolve, reject) => chrome.fileManagerPrivate.getZipProgress( - zipId, (result, bytes) => { - if (chrome.runtime.lastError) { - reject(chrome.runtime.lastError); - } else { - resolve({result, bytes}); - } - })); - - // Check for error. - if (result > 0) { - throw this.cancelRequested_ ? - createDOMError(util.FileError.ABORT_ERR) : - createDOMError(util.FileError.INVALID_MODIFICATION_ERR); - } - - // Report progress. - this.processedBytes = bytes; - this.speedometer_.update(this.processedBytes); - progressCallback(); - - // Check for success. - if (result == 0) { - // On success, record zip time UMA. - metrics.recordTime(`ZipTask.Time`, Date.now() - startTime); - successCallback(); - return; - } - } - } catch (error) { - errorCallback(new FileOperationError( - util.FileOperationErrorType.FILESYSTEM_ERROR, - /** @type DOMError */ (error))); - } - }; - - f(); - } -}; - -/** - * @typedef {{ - * operationType: !util.FileOperationType, - * numRemainingItems: number, - * totalBytes: number, - * processedBytes: number, - * processingEntryName: string, - * targetDirEntryName: string, - * remainingTime: number, - * }} - */ -fileOperationUtil.Status; - -/** - * @typedef {{ - * operationType: !util.FileOperationType, - * entries: Array<Entry>, - * taskId: string, - * entrySize: Object, - * totalBytes: number, - * processedBytes: number, - * cancelRequested: boolean, - * trashedEntries: Array<!TrashEntry>, - * }} - */ -fileOperationUtil.DeleteTask; - - -/** - * Manages Event dispatching. - * Currently this can send three types of events: "copy-progress", - * "copy-operation-completed" and "delete". - * - * TODO(hidehiko): Reorganize the event dispatching mechanism. - */ -fileOperationUtil.EventRouter = class extends EventTarget { - constructor() { - super(); - this.pendingDeletedEntries_ = {}; - this.pendingCreatedEntries_ = {}; - this.entryChangedEventRateLimiter_ = new AsyncUtil.RateLimiter( - this.dispatchEntryChangedEvent_.bind(this), 500); - } - - /** - * Dispatches a simple "copy-progress" event with reason and current - * FileOperationManager status. If it is an ERROR event, error should be set. - * - * @param {FileOperationProgressEvent.EventType} type Event type. - * @param {!fileOperationUtil.Status} status Current FileOperationManager's - * status. See also FileOperationManager.Task.getStatus(). - * @param {string} taskId ID of task related with the event. - * @param {FileOperationError=} opt_error The info for the - * error. This should be set iff the reason is "ERROR". - */ - sendProgressEvent(type, status, taskId, opt_error) { - const EventType = FileOperationProgressEvent.EventType; - // Before finishing operation, dispatch pending entries-changed events. - if (type === EventType.SUCCESS || type === EventType.CANCELED) { - this.entryChangedEventRateLimiter_.runImmediately(); - } - - const event = /** @type {FileOperationProgressEvent} */ - (new Event('copy-progress')); - event.reason = type; - event.status = status; - event.taskId = taskId; - if (opt_error) { - event.error = opt_error; - } - this.dispatchEvent(event); - } - - /** - * Stores changed (created or deleted) entry temporarily, and maybe dispatch - * entries-changed event with stored entries. - * @param {util.EntryChangedKind} kind The enum to represent if the entry is - * created or deleted. - * @param {Entry} entry The changed entry. - */ - sendEntryChangedEvent(kind, entry) { - if (kind === util.EntryChangedKind.DELETED) { - this.pendingDeletedEntries_[entry.toURL()] = entry; - } - if (kind === util.EntryChangedKind.CREATED) { - this.pendingCreatedEntries_[entry.toURL()] = entry; - } - - this.entryChangedEventRateLimiter_.run(); - } - - /** - * Dispatches an event to notify that entries are changed (created or - * deleted). - * @private - */ - dispatchEntryChangedEvent_() { - const deletedEntries = []; - const createdEntries = []; - for (const url in this.pendingDeletedEntries_) { - deletedEntries.push(this.pendingDeletedEntries_[url]); - } - for (const url in this.pendingCreatedEntries_) { - createdEntries.push(this.pendingCreatedEntries_[url]); - } - if (deletedEntries.length > 0) { - const event = new Event('entries-changed'); - event.kind = util.EntryChangedKind.DELETED; - event.entries = deletedEntries; - this.dispatchEvent(event); - this.pendingDeletedEntries_ = {}; - } - if (createdEntries.length > 0) { - const event = new Event('entries-changed'); - event.kind = util.EntryChangedKind.CREATED; - event.entries = createdEntries; - this.dispatchEvent(event); - this.pendingCreatedEntries_ = {}; - } - } - - /** - * Dispatches an event to notify entries are changed for delete task. - * - * @param {FileOperationProgressEvent.EventType} reason Event type. - * @param {!Object} task Delete task related with the event. - * @param {FileOperationError=} error - */ - sendDeleteEvent(reason, task, error) { - const event = - /** @type {FileOperationProgressEvent} */ (new Event('delete')); - event.reason = reason; - event.error = error; - event.taskId = task.taskId; - event.entries = task.entries; - event.status = { - operationType: task.operationType, - numRemainingItems: task.entries.length, - totalBytes: task.totalBytes, - processedBytes: task.processedBytes, - processingEntryName: task.entries.length > 0 ? task.entries[0].name : '', - targetDirEntryName: '', - remainingTime: 0, - }; - event.trashedEntries = task.trashedEntries; - this.dispatchEvent(event); - } -}; - -/** * Class to calculate transfer speed and remaining time. * * Each update from the transfer task stores a sample in a queue.
diff --git a/ui/file_manager/file_manager/background/js/metadata_proxy.js b/ui/file_manager/file_manager/background/js/metadata_proxy.js deleted file mode 100644 index a222367..0000000 --- a/ui/file_manager/file_manager/background/js/metadata_proxy.js +++ /dev/null
@@ -1,82 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {LRUCache} from '../../common/js/lru_cache.js'; - -// Namespace -const metadataProxy = {}; - -/** - * Maximum number of entries whose metadata can be cached. - * @const {number} - * @private - */ -metadataProxy.MAX_CACHED_METADATA_ = 10000; - -/** - * Maximum time for entry to not be considered stale. - * @const {number} - * @private - */ -metadataProxy.MAX_TTL_SECONDS_ = 60; - -/** - * @type {number} - * @private - */ -metadataProxy.cache_ttl_seconds_ = metadataProxy.MAX_TTL_SECONDS_; - -/** - * Cached metadata element with a timestamp when it was fetched. - */ -class CachedMetadata { - /** - * @param {!Metadata} metadata - */ - constructor(metadata) { - /** @type {!Metadata} */ - this.metadata = metadata; - - /** @type {!Date}} */ - this.mtime = new Date(); - } -} - -/** - * @private {!LRUCache<!CachedMetadata>} - */ -metadataProxy.cache_ = new LRUCache(metadataProxy.MAX_CACHED_METADATA_); - -/** - * Returns metadata for the given FileEntry. Uses cached metadata if possible. - * - * @param {!FileEntry} entry - * @return {!Promise<!Metadata>} - */ -metadataProxy.getEntryMetadata = entry => { - const expiryCutoffTime = Date.now() - metadataProxy.cache_ttl_seconds_ * 1000; - const entryURL = entry.toURL(); - const cachedData = metadataProxy.cache_.get(entryURL); - if (cachedData && cachedData.mtime.getTime() >= expiryCutoffTime) { - return Promise.resolve(cachedData.metadata); - } else { - return new Promise((resolve, reject) => { - entry.getMetadata(metadata => { - metadataProxy.cache_.put(entryURL, new CachedMetadata(metadata)); - resolve(metadata); - }, reject); - }); - } -}; - -/** - * Override cache TTL for testing. - * - * @param {number=} ttl - */ -metadataProxy.overrideCacheTtlForTesting = ttl => { - metadataProxy.cache_ttl_seconds_ = ttl ? ttl : metadataProxy.MAX_TTL_SECONDS_; -}; - -export {metadataProxy};
diff --git a/ui/file_manager/file_manager/background/js/metadata_proxy_unittest.js b/ui/file_manager/file_manager/background/js/metadata_proxy_unittest.js deleted file mode 100644 index d618361..0000000 --- a/ui/file_manager/file_manager/background/js/metadata_proxy_unittest.js +++ /dev/null
@@ -1,72 +0,0 @@ -// Copyright 2019 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {assertEquals} from 'chrome://webui-test/chai_assert.js'; - -import {MockFileSystem} from '../../common/js/mock_entry.js'; -import {reportPromise} from '../../common/js/test_error_reporting.js'; - -import {metadataProxy} from './metadata_proxy.js'; - -export function testMetadataCaching(doneCallback) { - reportPromise( - (async function() { - const mockFileSystem = new MockFileSystem('volumeId'); - mockFileSystem.populate(['/testMetadataCaching']); - const entry = /** @type {FileEntry} */ ( - mockFileSystem.entries['/testMetadataCaching']); - - // Make sure getMetadata is called only once. - let called = 0; - entry.getMetadata = - /** - * @this {Entry} - * @param {function(!Metadata)} onSuccess - * @param {function(!FileError)=} onError - */ - function(onSuccess, onError) { - called++; - onSuccess(/** @type {!Metadata} */ ({})); - }; - - await metadataProxy.getEntryMetadata(entry); - await metadataProxy.getEntryMetadata(entry); - assertEquals(1, called); - })(), - doneCallback); -} - -export function testMetadataCacheExpiry(doneCallback) { - reportPromise( - (async function() { - const mockFileSystem = new MockFileSystem('volumeId'); - mockFileSystem.populate(['/testMetadataCacheExpiry']); - const entry = /** @type {FileEntry} */ ( - mockFileSystem.entries['/testMetadataCacheExpiry']); - - // Make sure getMetadata is called twice. - let called = 0; - entry.getMetadata = - /** - * @this {Entry} - * @param {function(!Metadata)} onSuccess - * @param {function(!FileError)=} onError - */ - function(onSuccess, onError) { - called++; - onSuccess(/** @type {!Metadata} */ ({})); - }; - - metadataProxy.overrideCacheTtlForTesting(1); - - await metadataProxy.getEntryMetadata(entry); - await new Promise((resolve) => setTimeout(resolve, 1200)); - await metadataProxy.getEntryMetadata(entry); - - metadataProxy.overrideCacheTtlForTesting(); - - assertEquals(2, called); - })(), - doneCallback); -}
diff --git a/ui/file_manager/file_manager/background/js/mock_volume_manager.js b/ui/file_manager/file_manager/background/js/mock_volume_manager.js index e081b54..dce303c 100644 --- a/ui/file_manager/file_manager/background/js/mock_volume_manager.js +++ b/ui/file_manager/file_manager/background/js/mock_volume_manager.js
@@ -272,6 +272,20 @@ dispatchEvent(event) { throw new Error('Not implemented'); } + + /** + * @return {boolean} + */ + hasDisabledVolumes() { + return false; + } + + /** + * @return {boolean} + */ + isDisabled(volume) { + return false; + } } /** @private {?VolumeManager} */
diff --git a/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js b/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js index 718ab0f..4bfad27 100644 --- a/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js +++ b/ui/file_manager/file_manager/background/js/runtime_loaded_test_util.js
@@ -1140,16 +1140,6 @@ }); }; -/** - * Sets/Resets a flag that causes file copy operations to always fail in test. - * @param {boolean} enable True to force errors. - * @suppress {checkTypes} Remove suppress when migrating Files app. This is only - * used for Files app. - */ -test.util.sync.forceErrorsOnFileOperations = (contentWindow, enable) => { - window.background.forceFileOperationErrorForTest(enable); - return enable; -}; /** * Updates the preferences.
diff --git a/ui/file_manager/file_manager/background/js/volume_manager_impl.js b/ui/file_manager/file_manager/background/js/volume_manager_impl.js index 17e61cc..6861d41 100644 --- a/ui/file_manager/file_manager/background/js/volume_manager_impl.js +++ b/ui/file_manager/file_manager/background/js/volume_manager_impl.js
@@ -642,4 +642,14 @@ callEach(request.errorCallbacks, this, [status]); } } + + /** @override */ + hasDisabledVolumes() { + return false; + } + + /** @override */ + isDisabled(volume) { + return false; + } }
diff --git a/ui/file_manager/file_manager/common/js/BUILD.gn b/ui/file_manager/file_manager/common/js/BUILD.gn index ab1771c..79d9e3c 100644 --- a/ui/file_manager/file_manager/common/js/BUILD.gn +++ b/ui/file_manager/file_manager/common/js/BUILD.gn
@@ -28,7 +28,6 @@ ":async_util", ":dialog_type", ":error_counter", - ":file_operation_common", ":file_type", ":file_types_data", ":files_app_entry_types", @@ -57,7 +56,6 @@ ":array_data_model", ":async_util", ":error_counter", - ":file_operation_common", ":file_type", ":file_types_data", ":files_app_entry_types", @@ -196,13 +194,6 @@ ] } -js_library("file_operation_common") { - deps = [ - ":util", - "//ui/file_manager/file_manager/externs:files_app_entry_interfaces", - ] -} - js_library("filtered_volume_manager") { deps = [ ":array_data_model",
diff --git a/ui/file_manager/file_manager/common/js/file_operation_common.js b/ui/file_manager/file_manager/common/js/file_operation_common.js deleted file mode 100644 index c1d07b0..0000000 --- a/ui/file_manager/file_manager/common/js/file_operation_common.js +++ /dev/null
@@ -1,67 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {FilesAppEntry} from '../../externs/files_app_entry_interfaces.js'; - -import {util} from './util.js'; - -export class FileOperationProgressEvent extends Event { - /** @param {string} eventName */ - constructor(eventName) { - super(eventName); - - /** @type {FileOperationProgressEvent.EventType} */ - this.reason; - - /** @type {(FileOperationError|undefined)} */ - this.error; - - /** @public {string} */ - this.taskId; - - /** @public {?Array<!Entry>} */ - this.entries; - - /** @public {?Object} */ - this.status; - - /** @public {number} */ - this.totalBytes; - - /** @public {number} */ - this.processedBytes; - - /** @public {?Array<!FilesAppEntry>} */ - this.trashedEntries; - } -} - -/** - * Types of events emitted by the EventRouter. - * @enum {string} - */ -FileOperationProgressEvent.EventType = { - BEGIN: 'BEGIN', - CANCELED: 'CANCELED', - ERROR: 'ERROR', - PROGRESS: 'PROGRESS', - SUCCESS: 'SUCCESS', -}; - -/** - * Error class used to report problems with a copy operation. - * If the code is UNEXPECTED_SOURCE_FILE, data should be a path of the file. - * If the code is TARGET_EXISTS, data should be the existing Entry. - * If the code is FILESYSTEM_ERROR, data should be the FileError. - */ -export class FileOperationError { - /** - * @param {util.FileOperationErrorType} code Error type. - * @param {string|Entry|DOMError} data Additional data. - */ - constructor(code, data) { - this.code = code; - this.data = data; - } -}
diff --git a/ui/file_manager/file_manager/common/js/filtered_volume_manager.js b/ui/file_manager/file_manager/common/js/filtered_volume_manager.js index caa2431..70712929 100644 --- a/ui/file_manager/file_manager/common/js/filtered_volume_manager.js +++ b/ui/file_manager/file_manager/common/js/filtered_volume_manager.js
@@ -93,8 +93,12 @@ * when the VolumeManager has been initialized. * @param {!Array<string>} volumeFilter Array of Files app mode dependent * volume filter names from Files app launch params, [] typically. + * @param {!Array<!VolumeManagerCommon.VolumeType>} disabledVolumes List of + * volumes that should be visible but can't be selected. */ - constructor(allowedPaths, writableOnly, volumeManagerGetter, volumeFilter) { + constructor( + allowedPaths, writableOnly, volumeManagerGetter, volumeFilter, + disabledVolumes) { super(); this.allowedPaths_ = allowedPaths; @@ -139,6 +143,12 @@ this.isFuseBoxDebugEnabled_ = util.isFuseBoxDebugEnabled(); /** + * List of disabled volumes. + * @private @const {!Array<!VolumeManagerCommon.VolumeType>} + */ + this.disabledVolumes_ = disabledVolumes; + + /** * Tracks async initialization of volume manager. * @private @const {!Promise<void> } */ @@ -156,6 +166,13 @@ } /** + * @return {!Array<!VolumeManagerCommon.VolumeType>} + */ + get disabledVolumes() { + return this.disabledVolumes_; + } + + /** * Checks if a volume type is allowed. * * Note that even if a volume type is allowed, a volume of that type might be @@ -530,4 +547,14 @@ return null; } } + + /** @override */ + hasDisabledVolumes() { + return this.disabledVolumes_.length > 0; + } + + /** @override */ + isDisabled(volume) { + return this.disabledVolumes_.includes(volume); + } }
diff --git a/ui/file_manager/file_manager/common/js/filtered_volume_manager_unittest.js b/ui/file_manager/file_manager/common/js/filtered_volume_manager_unittest.js index f16907d..1f0b2fae 100644 --- a/ui/file_manager/file_manager/common/js/filtered_volume_manager_unittest.js +++ b/ui/file_manager/file_manager/common/js/filtered_volume_manager_unittest.js
@@ -85,9 +85,13 @@ * volumes from the files app UI. */ const filteredVolumeManager = new FilteredVolumeManager( - AllowedPaths.ANY_PATH_OR_URL, false, Promise.resolve(volumeManager), []); + AllowedPaths.ANY_PATH_OR_URL, false, Promise.resolve(volumeManager), [], + []); filteredVolumeManager.ensureInitialized(() => { + // Check: hasDisabledVolumes() should return false. + assertFalse(filteredVolumeManager.hasDisabledVolumes()); + // Check: getFuseBoxOnlyFilterEnabled should return false. assertFalse(filteredVolumeManager.getFuseBoxOnlyFilterEnabled()); @@ -174,9 +178,12 @@ */ const filteredVolumeManager = new FilteredVolumeManager( AllowedPaths.ANY_PATH_OR_URL, false, Promise.resolve(volumeManager), - ['fusebox-only']); + ['fusebox-only'], []); filteredVolumeManager.ensureInitialized(() => { + // Check: hasDisabledVolumes() should return false. + assertFalse(filteredVolumeManager.hasDisabledVolumes()); + // Check: getFuseBoxOnlyFilterEnabled should return true. assertTrue(filteredVolumeManager.getFuseBoxOnlyFilterEnabled()); @@ -284,9 +291,12 @@ */ const filteredVolumeManager = new FilteredVolumeManager( AllowedPaths.ANY_PATH_OR_URL, false, Promise.resolve(volumeManager), - ['media-store-files-only']); + ['media-store-files-only'], []); filteredVolumeManager.ensureInitialized(() => { + // Check: hasDisabledVolumes() should return false. + assertFalse(filteredVolumeManager.hasDisabledVolumes()); + // Check: getFuseBoxOnlyFilterEnabled should return false. assertFalse(filteredVolumeManager.getFuseBoxOnlyFilterEnabled()); @@ -309,3 +319,61 @@ done(); }); } + +/** + * Tests the disabled volume related functions. + */ +export function testDisabledVolumes(done) { + // Create mock volume manager. + const volumeManager = createMockVolumeManager(); + + // Get `DRIVE` volume. + const driveVolumeInfo = volumeManager.getCurrentProfileVolumeInfo( + VolumeManagerCommon.VolumeType.DRIVE); + assert(driveVolumeInfo); + + // Get `DOWNLOADS` volume. + const downloadsVolumeInfo = volumeManager.getCurrentProfileVolumeInfo( + VolumeManagerCommon.VolumeType.DOWNLOADS); + assert(downloadsVolumeInfo); + + // Add `MTP` volume. + const mtpVolumeInfo = MockVolumeManager.createMockVolumeInfo( + VolumeManagerCommon.VolumeType.MTP, 'mtpNormalVolumeId', + 'MTP normal volume', 'mtp-path'); + volumeManager.volumeInfoList.add(mtpVolumeInfo); + + // Add `MTP` fusebox volume. + const mtpFuseBoxVolumeInfo = MockVolumeManager.createMockVolumeInfo( + VolumeManagerCommon.VolumeType.MTP, 'mtpFuseBoxVolumeId', + 'MTP fusebox volume', 'fusebox/mtp-path'); + volumeManager.volumeInfoList.add(mtpFuseBoxVolumeInfo); + + // Add `DOCUMENTS_PROVIDER` volume. + const documentsProviderVolumeInfo = MockVolumeManager.createMockVolumeInfo( + VolumeManagerCommon.VolumeType.DOCUMENTS_PROVIDER, 'adpNormalVolumeId', + 'Documents provider normal volume', 'documents-provider-path'); + volumeManager.volumeInfoList.add(documentsProviderVolumeInfo); + + // Check: volumeManager.volumeInfoList should have 5 volumes. + assertEquals(5, volumeManager.volumeInfoList.length); + + const filteredVolumeManager = new FilteredVolumeManager( + AllowedPaths.ANY_PATH_OR_URL, false, Promise.resolve(volumeManager), [], + [VolumeManagerCommon.VolumeType.DRIVE]); + + filteredVolumeManager.ensureInitialized(() => { + // Check: hasDisabledVolumes() should return true. + assertTrue(filteredVolumeManager.hasDisabledVolumes()); + + // Check: isDisabled() should return true for DRIVE. + assertTrue( + filteredVolumeManager.isDisabled(VolumeManagerCommon.VolumeType.DRIVE)); + + // Check: isDisabled() should return false for REMOVABLE. + assertFalse(filteredVolumeManager.isDisabled( + VolumeManagerCommon.VolumeType.REMOVABLE)); + + done(); + }); +}
diff --git a/ui/file_manager/file_manager/common/js/util.js b/ui/file_manager/file_manager/common/js/util.js index e76d7b3..1f733d1 100644 --- a/ui/file_manager/file_manager/common/js/util.js +++ b/ui/file_manager/file_manager/common/js/util.js
@@ -1034,20 +1034,6 @@ }; /** - * Adds a foreground listener to the background page components. - * The listener will be removed when the foreground window is closed. - * @param {!EventTarget} target - * @param {string} type - * @param {Function} handler - */ -util.addEventListenerToBackgroundComponent = (target, type, handler) => { - target.addEventListener(type, handler); - window.addEventListener('pagehide', () => { - target.removeEventListener(type, handler); - }); -}; - -/** * Checks if an API call returned an error, and if yes then prints it. */ util.checkAPIError = () => {
diff --git a/ui/file_manager/file_manager/externs/background/file_operation_manager.js b/ui/file_manager/file_manager/externs/background/file_operation_manager.js index 94d7409..a0754288 100644 --- a/ui/file_manager/file_manager/externs/background/file_operation_manager.js +++ b/ui/file_manager/file_manager/externs/background/file_operation_manager.js
@@ -6,13 +6,10 @@ import {VolumeManager} from '../volume_manager.js'; /** - * FileOperationManager: manager of file operations. Implementations of this - * interface must @extends {cr.EventTarget} or implement the EventTarget API on - * their own. - * + * FileOperationManager: manager of file operations. * @interface */ -export class FileOperationManager extends EventTarget { +export class FileOperationManager { /** * Store a reference to our owning File Manager. * @param {Object} fileManager reference to the 'foreground' app. @@ -20,18 +17,6 @@ setFileManager(fileManager) {} /** - * Says if there are any tasks in the queue. - * @return {boolean} True, if there are any tasks. - */ - hasQueuedTasks() {} - - /** - * Requests the specified task to be canceled. - * @param {string} taskId ID of task to be canceled. - */ - requestTaskCancel(taskId) {} - - /** * Filters the entry in the same directory * * @param {Array<Entry>} sourceEntries Entries of the source files. @@ -54,15 +39,6 @@ willUseTrash(volumeManager, entries) {} /** - * Schedules the files deletion. - * - * @param {!Array<!Entry>} entries The entries. - * @param {boolean=} permanentlyDelete if true, entries will be deleted rather - * than moved to trash. - */ - deleteEntries(entries, permanentlyDelete = false) {} - - /** * Notifies File Manager that an extraction operation has finished. * * @param {number} taskId The unique task id for the IO operation. @@ -85,11 +61,4 @@ * @return {!Promise<!FileEntry>} */ async writeFile(file, destination) {} - - /** - * Generates new task ID. - * - * @return {string} New task ID. - */ - generateTaskId() {} }
diff --git a/ui/file_manager/file_manager/externs/volume_manager.js b/ui/file_manager/file_manager/externs/volume_manager.js index 458e322a..8df0786 100644 --- a/ui/file_manager/file_manager/externs/volume_manager.js +++ b/ui/file_manager/file_manager/externs/volume_manager.js
@@ -155,6 +155,19 @@ * Callback passed the default display root. */ getDefaultDisplayRoot(callback) {} + + /** + * Checks if any volumes are disabled for selection. + * @return {boolean} Whether any volumes are disabled for selection. + */ + hasDisabledVolumes() {} + + /** + * Checks whether the given volume is disabled for selection. + * @param {!VolumeManagerCommon.VolumeType} volume Volume to check. + * @return {boolean} Whether the volume is disabled or not. + */ + isDisabled(volume) {} } /**
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css index dd7c89c..3e1e94b1 100644 --- a/ui/file_manager/file_manager/foreground/css/file_manager.css +++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -177,7 +177,8 @@ width: 20px; } -#directory-tree .tree-row[active] > .file-row > .item-icon { +#directory-tree .tree-item:not([disabled]) + .tree-row[active] > .file-row > .item-icon { background-color: var(--cros-icon-color-selection); } @@ -246,12 +247,12 @@ display: block; } -html:not(.col-resize) #directory-tree +html:not(.col-resize) #directory-tree .tree-item:not([disabled]) .tree-row:not([active]):not([selected]):hover > .file-row { background-color: var(--cros-ripple-color); } -html.pointer-active #directory-tree +html.pointer-active #directory-tree .tree-item:not([disabled]) .tree-row:not([active]):not([selected]) > .file-row:active { background-color: var(--cros-ripple-color); } @@ -277,11 +278,16 @@ border: 2px solid var(--cros-focus-ring-color); } -#directory-tree .tree-row[active] > .file-row { +#directory-tree .tree-item:not([disabled]) .tree-row[active] > .file-row { background-color: var(--cros-highlight-color); color: var(--cros-text-color-selection); } +#directory-tree .tree-item[disabled] > .tree-row { + cursor: default; + opacity: var(--cros-disabled-opacity); +} + #directory-tree .tree-row > .align-right-icon { --iron-icon-height: 16px; --iron-icon-width: 16px;
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css b/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css index 4a4d3894..5a64ded 100644 --- a/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css +++ b/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
@@ -177,7 +177,8 @@ width: 20px; } -#directory-tree .tree-row[active] > .file-row > .item-icon { +#directory-tree .tree-item:not([disabled]) + .tree-row[active] > .file-row > .item-icon { background-color: var(--cros-icon-color-selection); } @@ -246,12 +247,12 @@ display: block; } -html:not(.col-resize) #directory-tree +html:not(.col-resize) #directory-tree .tree-item:not([disabled]) .tree-row:not([active]):not([selected]):hover > .file-row { background-color: var(--cros-ripple-color); } -html.pointer-active #directory-tree +html.pointer-active #directory-tree .tree-item:not([disabled]) .tree-row:not([active]):not([selected]) > .file-row:active { background-color: var(--cros-ripple-color); } @@ -277,11 +278,16 @@ border: 2px solid var(--cros-focus-ring-color); } -#directory-tree .tree-row[active] > .file-row { +#directory-tree .tree-item:not([disabled]) .tree-row[active] > .file-row { background-color: var(--cros-highlight-color); color: var(--cros-text-color-selection); } +#directory-tree .tree-item[disabled] > .tree-row { + cursor: default; + opacity: var(--cros-disabled-opacity); +} + #directory-tree .tree-row > .align-right-icon { --iron-icon-height: 16px; --iron-icon-width: 16px;
diff --git a/ui/file_manager/file_manager/foreground/js/BUILD.gn b/ui/file_manager/file_manager/foreground/js/BUILD.gn index 24fcb919..0c0b9e0 100644 --- a/ui/file_manager/file_manager/foreground/js/BUILD.gn +++ b/ui/file_manager/file_manager/foreground/js/BUILD.gn
@@ -212,6 +212,7 @@ "ui/banners:trash_banner", "//ui/file_manager/file_manager/common/js:api", "//ui/file_manager/file_manager/common/js:async_util", + "//ui/file_manager/file_manager/common/js:dialog_type", "//ui/file_manager/file_manager/common/js:volume_manager_types", "//ui/file_manager/file_manager/common/js:xfm", "//ui/file_manager/file_manager/externs:banner", @@ -230,6 +231,7 @@ ":mock_directory_model", "//chrome/test/data/webui:chai_assert", "//ui/file_manager/file_manager/background/js:mock_volume_manager", + "//ui/file_manager/file_manager/common/js:dialog_type", "//ui/file_manager/file_manager/common/js:mock_chrome", "//ui/file_manager/file_manager/common/js:test_error_reporting", "//ui/file_manager/file_manager/common/js:volume_manager_types", @@ -671,7 +673,6 @@ "ui:list", "//ui/file_manager/file_manager/common/js:api", "//ui/file_manager/file_manager/common/js:dialog_type", - "//ui/file_manager/file_manager/common/js:file_operation_common", "//ui/file_manager/file_manager/common/js:file_type", "//ui/file_manager/file_manager/common/js:files_app_entry_types", "//ui/file_manager/file_manager/common/js:metrics",
diff --git a/ui/file_manager/file_manager/foreground/js/banner_controller.js b/ui/file_manager/file_manager/foreground/js/banner_controller.js index 6aad45a..c41ddb5c 100644 --- a/ui/file_manager/file_manager/foreground/js/banner_controller.js +++ b/ui/file_manager/file_manager/foreground/js/banner_controller.js
@@ -6,6 +6,7 @@ import {getDriveQuotaMetadata, getSizeStats} from '../../common/js/api.js'; import {AsyncUtil} from '../../common/js/async_util.js'; +import {DialogType} from '../../common/js/dialog_type.js'; import {util} from '../../common/js/util.js'; import {VolumeManagerCommon} from '../../common/js/volume_manager_types.js'; import {xfm} from '../../common/js/xfm.js'; @@ -17,6 +18,7 @@ import {constants} from './constants.js'; import {DirectoryModel} from './directory_model.js'; +import {TAG_NAME as DlpRestrictedBannerName} from './ui/banners/dlp_restricted_banner.js'; import {TAG_NAME as DriveLowIndividualSpaceBanner} from './ui/banners/drive_low_individual_space_banner.js'; import {TAG_NAME as DriveOfflinePinningBannerTagName} from './ui/banners/drive_offline_pinning_banner.js'; import {TAG_NAME as DriveOutOfIndividualSpaceBanner} from './ui/banners/drive_out_of_individual_space_banner.js'; @@ -84,8 +86,9 @@ * @param {!DirectoryModel} directoryModel * @param {!VolumeManager} volumeManager * @param {!Crostini} crostini + * @param {!DialogType} dialogType */ - constructor(directoryModel, volumeManager, crostini) { + constructor(directoryModel, volumeManager, crostini, dialogType) { super(); /** @@ -180,6 +183,13 @@ this.volumeManager_ = volumeManager; /** + * The dialog type, used to determine whether certain banners should be + * shown or not. + * @private {!DialogType} + */ + this.dialogType_ = dialogType; + + /** * The container where all the banners will be appended to. * @private {?Element} */ @@ -192,7 +202,7 @@ this.disableBannerLoading_ = false; /** - * Whether banners should be completely disable, useful to remove banners + * Whether banners should be completely disabled, useful to remove banners * during integration tests or tast tests. * @private {boolean} */ @@ -282,6 +292,7 @@ PhotosWelcomeBannerTagName, ]); this.setStateBannersInOrder([ + DlpRestrictedBannerName, InvalidUSBFileSystemBanner, SharedWithCrostiniPluginVmBanner, TrashBannerTagName, @@ -342,6 +353,14 @@ shouldShow: () => !!(this.currentVolume_ && this.currentVolume_.error), context: () => ({error: this.currentVolume_.error}), }); + + // Register a custom filter that checks if DLP restricted banner should + // be shown. + this.registerCustomBannerFilter_(DlpRestrictedBannerName, { + // TODO(crbug.com/1358062): Correctly handle file open dialogs. + shouldShow: () => (this.volumeManager_.hasDisabledVolumes()), + context: () => ({type: this.dialogType_}), + }); } for (const banner of this.warningBanners_) {
diff --git a/ui/file_manager/file_manager/foreground/js/banner_controller_unittest.js b/ui/file_manager/file_manager/foreground/js/banner_controller_unittest.js index 1b9bfbc..d6359964 100644 --- a/ui/file_manager/file_manager/foreground/js/banner_controller_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/banner_controller_unittest.js
@@ -4,6 +4,7 @@ import {assertDeepEquals, assertEquals} from 'chrome://webui-test/chai_assert.js'; +import {DialogType} from '../../common/js/dialog_type.js'; import {installMockChrome, MockChromeFileManagerPrivateDirectoryChanged, MockChromeStorageAPI} from '../../common/js/mock_chrome.js'; import {waitUntil} from '../../common/js/test_error_reporting.js'; import {VolumeManagerCommon} from '../../common/js/volume_manager_types.js'; @@ -393,7 +394,8 @@ }, }); const crostini = /** @type {!Crostini} */ ({}); - controller = new BannerController(directoryModel, volumeManager, crostini); + controller = new BannerController( + directoryModel, volumeManager, crostini, DialogType.SELECT_SAVEAS_FILE); controller.disableBannerLoadingForTesting(); mockDate = mockDateNow();
diff --git a/ui/file_manager/file_manager/foreground/js/crostini_controller.js b/ui/file_manager/file_manager/foreground/js/crostini_controller.js index 8b09d1c..2c4b00e 100644 --- a/ui/file_manager/file_manager/foreground/js/crostini_controller.js +++ b/ui/file_manager/file_manager/foreground/js/crostini_controller.js
@@ -24,8 +24,10 @@ * @param {!Crostini} crostini Crostini background object. * @param {!DirectoryModel} directoryModel DirectoryModel. * @param {!DirectoryTree} directoryTree DirectoryTree. + * @param {boolean} disabled Whether the Crostini item should be disabled. + * Defaults to false. */ - constructor(crostini, directoryModel, directoryTree) { + constructor(crostini, directoryModel, directoryTree, disabled = false) { /** @private @const */ this.crostini_ = crostini; @@ -40,6 +42,11 @@ /** @private */ this.entrySharedWithPluginVm_ = false; + + /** + * @private @const {boolean} + */ + this.disabled_ = disabled; } /** @@ -47,14 +54,18 @@ */ async redraw() { // Setup Linux files fake root. - this.directoryTree_.dataModel.linuxFilesItem = - this.crostini_.isEnabled(constants.DEFAULT_CROSTINI_VM) ? - new NavigationModelFakeItem( - str('LINUX_FILES_ROOT_LABEL'), NavigationModelItemType.CROSTINI, - new FakeEntryImpl( - str('LINUX_FILES_ROOT_LABEL'), - VolumeManagerCommon.RootType.CROSTINI)) : - null; + let crostiniNavigationModelItem; + if (this.crostini_.isEnabled(constants.DEFAULT_CROSTINI_VM)) { + crostiniNavigationModelItem = new NavigationModelFakeItem( + str('LINUX_FILES_ROOT_LABEL'), NavigationModelItemType.CROSTINI, + new FakeEntryImpl( + str('LINUX_FILES_ROOT_LABEL'), + VolumeManagerCommon.RootType.CROSTINI)); + crostiniNavigationModelItem.disabled = this.disabled_; + } else { + crostiniNavigationModelItem = null; + } + this.directoryTree_.dataModel.linuxFilesItem = crostiniNavigationModelItem; // Redraw the tree to ensure 'Linux files' is added/removed. this.directoryTree_.redraw(false); }
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.js b/ui/file_manager/file_manager/foreground/js/directory_model.js index 2f7497d5..c6fd4bc 100644 --- a/ui/file_manager/file_manager/foreground/js/directory_model.js +++ b/ui/file_manager/file_manager/foreground/js/directory_model.js
@@ -122,9 +122,6 @@ chrome.fileManagerPrivate.onIOTaskProgressStatus.addListener( this.updateFileListAfterIOTask_.bind(this)); } - util.addEventListenerToBackgroundComponent( - fileOperationManager, 'entries-changed', - this.onEntriesChanged_.bind(this)); /** @private {string} */ this.lastSearchQuery_ = ''; @@ -980,66 +977,6 @@ } /** - * Callback when an entry is changed. - * @param {EntriesChangedEvent} event Entry change event. - * @private - */ - async onEntriesChanged_(event) { - const kind = event.kind; - const entries = event.entries; - // TODO(hidehiko): We should update directory model even the search result - // is shown. - const rootType = this.getCurrentRootType(); - if ((rootType === VolumeManagerCommon.RootType.DRIVE || - rootType === VolumeManagerCommon.RootType.DRIVE_SHARED_WITH_ME || - rootType === VolumeManagerCommon.RootType.DRIVE_RECENT || - rootType === VolumeManagerCommon.RootType.DRIVE_OFFLINE) && - this.isSearching()) { - return; - } - - switch (kind) { - case util.EntryChangedKind.CREATED: - try { - const parentPromises = - entries.map(entry => new Promise((resolve, reject) => { - entry.getParent(resolve, reject); - })); - const parents = await Promise.all(parentPromises); - const entriesToAdd = []; - - for (let i = 0; i < parents.length; i++) { - if (!util.isSameEntry(parents[i], this.getCurrentDirEntry())) { - continue; - } - - const index = this.findIndexByEntry_(entries[i]); - if (index >= 0) { - this.getFileList().replaceItem( - this.getFileList().item(index), entries[i]); - } else { - entriesToAdd.push(entries[i]); - } - } - - this.partialUpdate_(entriesToAdd, []); - } catch (error) { - console.warn(error.stack || error); - } - break; - - case util.EntryChangedKind.DELETED: - // This is the delete event. - this.partialUpdate_([], util.entriesToURLs(entries)); - break; - - default: - console.error('Invalid EntryChangedKind: ' + kind); - break; - } - } - - /** * @param {Entry} entry The entry to be searched. * @return {number} The index in the fileList, or -1 if not found. * @private
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager.js b/ui/file_manager/file_manager/foreground/js/file_manager.js index ef44bc1..60e313b 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager.js
@@ -7,7 +7,7 @@ import {NativeEventTarget as EventTarget} from 'chrome://resources/js/cr/event_target.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; -import {getPreferences} from '../../common/js/api.js'; +import {getDialogCaller, getDlpBlockedComponents, getPreferences} from '../../common/js/api.js'; import {ArrayDataModel} from '../../common/js/array_data_model.js'; import {DialogType} from '../../common/js/dialog_type.js'; import {getKeyModifiers, queryDecoratedElement, queryRequiredElement} from '../../common/js/dom_utils.js'; @@ -726,7 +726,8 @@ this.ui_.listContainer.endBatchUpdates(); const bannerController = new BannerController( - this.directoryModel_, this.volumeManager_, assert(this.crostini_)); + this.directoryModel_, this.volumeManager_, assert(this.crostini_), + this.dialogType); this.ui_.initBanners(bannerController); bannerController.initialize(); @@ -848,8 +849,8 @@ initializeCore() { this.initGeneral_(); this.initSettingsPromise_ = this.startInitSettings_(); - this.initBackgroundPagePromise_ = this.startInitBackgroundPage_(); - this.initBackgroundPagePromise_.then(() => this.initVolumeManager_()); + this.initBackgroundPagePromise_ = + this.startInitBackgroundPage_().then(() => this.initVolumeManager_()); window.addEventListener('pagehide', this.onUnload_.bind(this)); } @@ -958,10 +959,13 @@ * Initializes the VolumeManager instance. * @private */ - initVolumeManager_() { + async initVolumeManager_() { const allowedPaths = this.getAllowedPaths_(); const writableOnly = this.launchParams_.type === DialogType.SELECT_SAVEAS_FILE; + const disabledVolumes = + /** @type {!Array<!VolumeManagerCommon.VolumeType>} */ ( + await this.getDisabledVolumes_()); // FilteredVolumeManager hides virtual file system related event and data // even depends on the value of |supportVirtualPath|. If it is @@ -975,7 +979,7 @@ this.volumeManager_ = new FilteredVolumeManager( allowedPaths, writableOnly, this.fileBrowserBackground_.getVolumeManager(), - this.launchParams_.volumeFilter); + this.launchParams_.volumeFilter, disabledVolumes); } /** @@ -1175,6 +1179,29 @@ } /** + * Based on the dialog type and dialog caller, sets the list of volumes + * that should be disabled according to Data Leak Prevention rules. + * @return {Promise<!Array<!VolumeManagerCommon.VolumeType>>} + */ + async getDisabledVolumes_() { + if (this.dialogType !== DialogType.SELECT_SAVEAS_FILE || + !util.isDlpEnabled()) { + return []; + } + const caller = await getDialogCaller(); + if (!caller.url) { + return []; + } + const dlpBlockedComponents = await getDlpBlockedComponents(caller.url); + const disabledVolumes = []; + for (const c of dlpBlockedComponents) { + disabledVolumes.push( + /** @type {!VolumeManagerCommon.VolumeType }*/ (c)); + } + return disabledVolumes; + } + + /** * @return {!Promise<void>} * @private */ @@ -1231,7 +1258,9 @@ this.onCrostiniChanged_.bind(this)); this.crostiniController_ = new CrostiniController( assert(this.crostini_), this.directoryModel_, - assert(this.directoryTree)); + assert(this.directoryTree), + this.volumeManager_.isDisabled( + VolumeManagerCommon.VolumeType.CROSTINI)); await this.crostiniController_.redraw(); // Never show toast in an open-file dialog. const maybeShowToast = this.dialogType === DialogType.FULL_PAGE; @@ -1240,7 +1269,9 @@ if (util.isGuestOsEnabled()) { this.guestOsController_ = new GuestOsController( - this.directoryModel_, assert(this.directoryTree)); + this.directoryModel_, assert(this.directoryTree), + this.volumeManager_.isDisabled( + VolumeManagerCommon.VolumeType.GUEST_OS)); await this.guestOsController_.refresh(); } } @@ -1676,6 +1707,8 @@ new FakeEntryImpl( str('DRIVE_DIRECTORY_LABEL'), VolumeManagerCommon.RootType.DRIVE_FAKE_ROOT)); + this.fakeDriveItem_.disabled = this.volumeManager_.isDisabled( + VolumeManagerCommon.VolumeType.DRIVE); } this.directoryTree.dataModel.fakeDriveItem = this.fakeDriveItem_; return;
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js index affbe64e..7ea76c84 100644 --- a/ui/file_manager/file_manager/foreground/js/file_manager_commands.js +++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands.js
@@ -9,7 +9,6 @@ import {getDlpRestrictionDetails, getHoldingSpaceState, startIOTask} from '../../common/js/api.js'; import {DialogType} from '../../common/js/dialog_type.js'; -import {FileOperationProgressEvent} from '../../common/js/file_operation_common.js'; import {FileType} from '../../common/js/file_type.js'; import {EntryList} from '../../common/js/files_app_entry_types.js'; import {metrics} from '../../common/js/metrics.js'; @@ -1187,7 +1186,7 @@ fileManager.trashEnabled) { fileManager.ui.nudgeContainer.showNudge(NudgeType['TRASH_NUDGE']); - chrome.fileManagerPrivate.startIOTask( + startIOTask( chrome.fileManagerPrivate.IOTaskType.TRASH, entries, /*params=*/ {}); return; @@ -1210,8 +1209,9 @@ const deleteAction = () => { dialogDoneCallback(); - fileManager.fileOperationManager.deleteEntries( - entries, permanentlyDelete); + // Start the permanent delete. + startIOTask( + chrome.fileManagerPrivate.IOTaskType.DELETE, entries, /*params=*/ {}); }; const cancelAction = () => {
diff --git a/ui/file_manager/file_manager/foreground/js/file_selection.js b/ui/file_manager/file_manager/foreground/js/file_selection.js index fd7b196..baacf4f 100644 --- a/ui/file_manager/file_manager/foreground/js/file_selection.js +++ b/ui/file_manager/file_manager/foreground/js/file_selection.js
@@ -207,9 +207,6 @@ */ this.allowedPaths_ = allowedPaths; - util.addEventListenerToBackgroundComponent( - assert(fileOperationManager), 'entries-changed', - this.onFileSelectionChanged.bind(this)); // Register evnets to update file selections. directoryModel.addEventListener( 'directory-changed', this.onFileSelectionChanged.bind(this));
diff --git a/ui/file_manager/file_manager/foreground/js/guest_os_controller.js b/ui/file_manager/file_manager/foreground/js/guest_os_controller.js index e6a9f9d..d5f5118 100644 --- a/ui/file_manager/file_manager/foreground/js/guest_os_controller.js +++ b/ui/file_manager/file_manager/foreground/js/guest_os_controller.js
@@ -18,8 +18,10 @@ /** * @param {!DirectoryModel} directoryModel DirectoryModel. * @param {!DirectoryTree} directoryTree DirectoryTree. + * @param {boolean} disabled Whether the Guest OS item should be disabled. + * Defaults to false. */ - constructor(directoryModel, directoryTree) { + constructor(directoryModel, directoryTree, disabled = false) { if (!util.isGuestOsEnabled()) { console.warn('Created a guest os controller when it\'s not enabled'); } @@ -29,6 +31,9 @@ /** @private @const */ this.directoryTree_ = directoryTree; + /** @private @const {boolean} */ + this.disabled_ = disabled; + chrome.fileManagerPrivate.onMountableGuestsChanged.addListener( this.onMountableGuestsChanged.bind(this)); } @@ -50,9 +55,11 @@ */ async onMountableGuestsChanged(guests) { this.directoryTree_.dataModel.guestOsPlaceholders = guests.map(guest => { - return new NavigationModelFakeItem( + const navigationModelItem = new NavigationModelFakeItem( guest.displayName, NavigationModelItemType.GUEST_OS, new GuestOsPlaceholder(guest.displayName, guest.id, guest.vmType)); + navigationModelItem.disabled = this.disabled_; + return navigationModelItem; }); // Redraw the tree to ensure any newly added/removed roots are updated.
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js index 95495c7..b101280 100644 --- a/ui/file_manager/file_manager/foreground/js/navigation_list_model.js +++ b/ui/file_manager/file_manager/foreground/js/navigation_list_model.js
@@ -65,6 +65,11 @@ this.type_ = type; /** + * @type {boolean} whether this item is disabled for selection. + */ + this.disabled_ = false; + + /** * @type {NavigationSection} section which this item belongs to. */ this.section_ = NavigationSection.TOP; @@ -81,6 +86,16 @@ return this.type_; } + /** @return {boolean} */ + get disabled() { + return this.disabled_; + } + + /** @param {boolean} disabled */ + set disabled(disabled) { + this.disabled_ = disabled; + } + /** @return {NavigationSection} */ get section() { return this.section_; @@ -715,6 +730,8 @@ // Add Drive. let hasDrive = false; for (const driveItem of getVolumes(VolumeManagerCommon.VolumeType.DRIVE)) { + driveItem.disabled = + this.volumeManager_.isDisabled(VolumeManagerCommon.VolumeType.DRIVE); this.navigationItems_.push(driveItem); driveItem.section = NavigationSection.CLOUD; hasDrive = true; @@ -758,12 +775,15 @@ // Add REMOVABLE volumes and partitions. const removableModels = new Map(); + const disableRemovables = this.volumeManager_.isDisabled( + VolumeManagerCommon.VolumeType.REMOVABLE); for (const [devicePath, removableGroup] of groupRemovables().entries()) { if (removableGroup.length == 1 && !util.isSinglePartitionFormatEnabled()) { // Add unpartitioned removable device as a regular volume. this.navigationItems_.push(removableGroup[0]); removableGroup[0].section = NavigationSection.REMOVABLE; + removableGroup[0].disabled = disableRemovables; continue; } @@ -773,6 +793,7 @@ if (this.removableModels_.has(devicePath)) { // Removable model has been seen before. Use the same reference. removableModel = this.removableModels_.get(devicePath); + removableModel.disabled = disableRemovables; removableEntry = removableModel.entry; } else { // Create an EntryList for new removable group. @@ -785,6 +806,7 @@ removableModel = new NavigationModelFakeItem( removableEntry.label, NavigationModelItemType.ENTRY_LIST, removableEntry); + removableModel.disabled = disableRemovables; removableModel.section = NavigationSection.REMOVABLE; }
diff --git a/ui/file_manager/file_manager/foreground/js/navigation_list_model_unittest.js b/ui/file_manager/file_manager/foreground/js/navigation_list_model_unittest.js index 5dd381e..8a418516 100644 --- a/ui/file_manager/file_manager/foreground/js/navigation_list_model_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/navigation_list_model_unittest.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {MockVolumeManager} from '../../background/js/mock_volume_manager.js'; import {VolumeInfoImpl} from '../../background/js/volume_info_impl.js'; @@ -181,9 +181,37 @@ '/root/shortcut', /** @type {!NavigationModelShortcutItem} */ (model.item(0)).entry.fullPath); assertEquals('My files', model.item(1).label); + const driveItem = /** @type {!NavigationModelVolumeItem} */ (model.item(2)); + assertEquals('drive', driveItem.volumeInfo.volumeId); + assertFalse(driveItem.disabled); +} + +/** + * Tests model with a disabled Drive volume. + */ +export function testDisabledVolumes() { + const volumeManager = new MockVolumeManager(); + volumeManager.isDisabled = (volume) => { + return (volume === VolumeManagerCommon.VolumeType.DRIVE); + }; + + const shortcutListModel = new MockFolderShortcutDataModel( + [MockFileEntry.create(drive, '/root/shortcut')]); + const recentItem = null; + + const model = new NavigationListModel( + volumeManager, shortcutListModel.asFolderShortcutsDataModel(), recentItem, + directoryModel, androidAppListModel, DialogType.FULL_PAGE); + + assertEquals(3, model.length); assertEquals( - 'drive', /** @type {!NavigationModelVolumeItem} */ - (model.item(2)).volumeInfo.volumeId); + '/root/shortcut', /** @type {!NavigationModelShortcutItem} */ + (model.item(0)).entry.fullPath); + assertEquals('My files', model.item(1).label); + + const driveItem = /** @type {!NavigationModelVolumeItem} */ (model.item(2)); + assertEquals('drive', driveItem.volumeInfo.volumeId); + assertTrue(driveItem.disabled); } /**
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js index 9d16fe7..fecbb918 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js +++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -863,6 +863,7 @@ this.dirEntry_ = dirEntry; this.entry = dirEntry; + this.disabled = parentDirItem.disabled; this.delayExpansion = parentDirItem.delayExpansion; if (this.delayExpansion) { @@ -974,6 +975,7 @@ this.dirEntry_ = modelItem.entry; this.modelItem_ = modelItem; this.rootType_ = rootType; + this.disabled = modelItem.disabled; if (rootType === VolumeManagerCommon.RootType.REMOVABLE) { this.setupEjectButton_(this.rowElement); @@ -1112,6 +1114,7 @@ this.modelItem_ = modelItem; this.volumeInfo_ = modelItem.volumeInfo; + this.disabled = modelItem.disabled; // Provided volumes should delay the expansion of child nodes // for performance reasons. @@ -1646,6 +1649,7 @@ this.dirEntry_ = modelItem.entry; this.modelItem_ = modelItem; + this.disabled = modelItem.disabled; const icon = this.querySelector('.icon'); icon.classList.add('item-icon'); @@ -1772,6 +1776,7 @@ } this.modelItem_ = modelItem; + this.disabled = modelItem.disabled; const icon = this.querySelector('.icon'); icon.classList.add('item-icon'); @@ -1851,6 +1856,7 @@ this.dirEntry_ = modelItem.entry; this.modelItem_ = modelItem; this.rootType_ = rootType; + this.disabled = modelItem.disabled; const icon = this.querySelector('.icon'); icon.classList.add('item-icon'); @@ -2002,10 +2008,6 @@ this.directoryModel_.addEventListener( 'directory-changed', this.onCurrentDirectoryChanged_.bind(this)); - util.addEventListenerToBackgroundComponent( - fileOperationManager, 'entries-changed', - this.onEntriesChanged_.bind(this)); - this.addEventListener( 'scroll', this.onTreeScrollEvent_.bind(this), {passive: true}); @@ -2191,39 +2193,6 @@ } /** - * Handles entries changed event. - * @param {!Event} event - * @private - */ - onEntriesChanged_(event) { - const directories = event.entries.filter((entry) => entry.isDirectory); - - if (directories.length === 0) { - return; - } - - switch (event.kind) { - case util.EntryChangedKind.CREATED: - // Handle as change event of parent entry. - Promise - .all(directories.map( - (directory) => - new Promise(directory.getParent.bind(directory)))) - .then((parentDirectories) => { - parentDirectories.forEach( - (parentDirectory) => - this.updateTreeByEntry_(parentDirectory)); - }); - break; - case util.EntryChangedKind.DELETED: - directories.forEach((directory) => this.updateTreeByEntry_(directory)); - break; - default: - assertNotReached(); - } - } - - /** * Select the item corresponding to the given entry. * @param {!DirectoryEntry|!FilesAppDirEntry} entry The directory entry to be * selected. Can be a fake.
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.js index 91a4bcd7..72d8828 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.js +++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.js
@@ -1102,3 +1102,45 @@ }), callback); } + +/** Test that clicking on disabled items is ignored. */ +export function testDisabledVolumes(callback) { + // Setup My Drive and Downloads and one folder inside each of them. + fakeFileSystemURLEntries['filesystem:drive/root/folder1'] = + MockDirectoryEntry.create(driveFileSystem, '/root/folder1'); + const downloadsFileSystem = volumeManager.volumeInfoList.item(1).fileSystem; + fakeFileSystemURLEntries['filesystem:downloads/folder1'] = + MockDirectoryEntry.create(downloadsFileSystem, '/folder1'); + + // Populate the directory tree with the mock filesystem. + let directoryTree = createElements(); + directoryTree.metadataModel = createMockMetadataModel(); + const mockMetadata = createMockMetadataModel(); + DirectoryTree.decorate( + directoryTree, directoryModel, volumeManager, mockMetadata, + fileOperationManager, true); + directoryTree.dataModel = new MockNavigationListModel(volumeManager); + + // Coerce to DirectoryTree type and draw the tree. + directoryTree = /** @type {!DirectoryTree} */ (directoryTree); + directoryTree.redraw(true); + + const driveItem = directoryTree.items[0]; + driveItem.disabled = true; + + reportPromise( + waitUntil(() => { + driveItem.click(); + return !driveItem.selected; + }).then(() => { + let ariaExpanded = driveItem.getAttribute('aria-expanded'); + assertTrue(ariaExpanded === 'false' || ariaExpanded === null); + + driveItem.querySelector('.expand-icon').click(); + // After clicking on expand-icon, aria-expanded should be still be set + // to false. + ariaExpanded = driveItem.getAttribute('aria-expanded'); + assertTrue(ariaExpanded === 'false' || ariaExpanded === null); + }), + callback); +}
diff --git a/ui/file_manager/file_manager/foreground/js/ui/tree.js b/ui/file_manager/file_manager/foreground/js/ui/tree.js index 244f1d33..bcfcf77 100644 --- a/ui/file_manager/file_manager/foreground/js/ui/tree.js +++ b/ui/file_manager/file_manager/foreground/js/ui/tree.js
@@ -146,7 +146,7 @@ */ handleClick(e) { const treeItem = findTreeItem(/** @type {!Node} */ (e.target)); - if (treeItem) { + if (treeItem && !treeItem.disabled) { treeItem.handleClick(e); } }, @@ -163,7 +163,7 @@ */ handleDblClick(e) { const treeItem = findTreeItem(/** @type {!Node} */ (e.target)); - if (treeItem) { + if (treeItem && !treeItem.disabled) { treeItem.expanded = !treeItem.expanded; } }, @@ -186,13 +186,23 @@ const rtl = getComputedStyle(item).direction === 'rtl'; + const selectableItems = []; + for (const item of this.items) { + if (!item.disabled) { + selectableItems.push(item); + } + } + if (selectableItems.length === 0) { + return; + } + switch (e.key) { case 'ArrowUp': - itemToSelect = - item ? getPrevious(item) : this.items[this.items.length - 1]; + itemToSelect = item ? getPrevious(item) : + selectableItems[selectableItems.length - 1]; break; case 'ArrowDown': - itemToSelect = item ? getNext(item) : this.items[0]; + itemToSelect = item ? getNext(item) : selectableItems[0]; break; case 'ArrowLeft': case 'ArrowRight': @@ -216,10 +226,10 @@ } break; case 'Home': - itemToSelect = this.items[0]; + itemToSelect = selectableItems[0]; break; case 'End': - itemToSelect = this.items[this.items.length - 1]; + itemToSelect = selectableItems[selectableItems.length - 1]; break; } @@ -377,6 +387,17 @@ }, /** + * Whether this tree item is disabled for selection. + * @type {boolean} + */ + get disabled() { + return this.hasAttribute('disabled'); + }, + set disabled(b) { + this.toggleAttribute('disabled', b); + }, + + /** * Adds a tree item as a child. * @param {!TreeItem} child The child to add. */ @@ -700,7 +721,7 @@ }; /** - * Helper function that returns the next visible tree item. + * Helper function that returns the next visible and not disabled tree item. * @param {TreeItem} item The tree item. * @return {TreeItem} The found item or null. */ @@ -716,7 +737,8 @@ } /** - * Another helper function that returns the next visible tree item. + * Another helper function that returns the next visible and not disabled tree + * item. * @param {TreeItem} item The tree item. * @return {TreeItem} The found item or null. */ @@ -727,18 +749,24 @@ const nextSibling = item.nextElementSibling; if (nextSibling) { + if (nextSibling.disabled) { + return getNextHelper(assertInstanceof(nextSibling, TreeItem)); + } return assertInstanceof(nextSibling, TreeItem); } return getNextHelper(item.parentItem); } /** - * Helper function that returns the previous visible tree item. + * Helper function that returns the previous visible and not disabled tree item. * @param {TreeItem} item The tree item. * @return {TreeItem} The found item or null. */ function getPrevious(item) { - const previousSibling = item.previousElementSibling; + let previousSibling = item.previousElementSibling; + while (previousSibling && previousSibling.disabled) { + previousSibling = previousSibling.previousElementSibling; + } if (previousSibling) { return getLastHelper(assertInstanceof(previousSibling, TreeItem)); } @@ -746,7 +774,8 @@ } /** - * Helper function that returns the last visible tree item in the subtree. + * Helper function that returns the last visible and not disabled tree item in + * the subtree. * @param {TreeItem} item The item to find the last visible item for. * @return {TreeItem} The found item or null. */
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni index c2afddb..9d3ce804 100644 --- a/ui/file_manager/file_names.gni +++ b/ui/file_manager/file_names.gni
@@ -23,7 +23,6 @@ "file_manager/background/js/file_operation_manager.js", "file_manager/background/js/file_operation_util.js", "file_manager/background/js/launcher.js", - "file_manager/background/js/metadata_proxy.js", "file_manager/background/js/metrics_start.js", # TODO(lucmult): Check if we can move those mocks to the test files section. @@ -51,7 +50,6 @@ "file_manager/common/js/dialog_type.js", "file_manager/common/js/error_counter.js", "file_manager/common/js/glitch.js", - "file_manager/common/js/file_operation_common.js", "file_manager/common/js/file_type.js", "file_manager/common/js/files_app_entry_types.js", "file_manager/common/js/files_app_state.js", @@ -365,7 +363,6 @@ "file_manager/background/js/file_operation_manager_unittest.js", "file_manager/background/js/trash_unittest.js", "file_manager/background/js/volume_manager_unittest.js", - "file_manager/background/js/metadata_proxy_unittest.js", "file_manager/background/js/crostini_unittest.js", # Foreground:
diff --git a/ui/message_center/views/message_view.cc b/ui/message_center/views/message_view.cc index 1982de8..681de7b 100644 --- a/ui/message_center/views/message_view.cc +++ b/ui/message_center/views/message_view.cc
@@ -47,31 +47,6 @@ namespace { -// Creates a text for spoken feedback from the data contained in the -// notification. -std::u16string CreateAccessibleName(const Notification& notification) { - if (!notification.accessible_name().empty()) - return notification.accessible_name(); - - // Fall back to a text constructed from the notification. - // Add non-empty elements. - - std::vector<std::u16string> accessible_lines; - if (!notification.title().empty()) - accessible_lines.push_back(notification.title()); - - if (!notification.message().empty()) - accessible_lines.push_back(notification.message()); - - if (!notification.context_message().empty()) - accessible_lines.push_back(notification.context_message()); - std::vector<NotificationItem> items = notification.items(); - for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) { - accessible_lines.push_back(items[i].title + u" " + items[i].message); - } - return base::JoinString(accessible_lines, u"\n"); -} - bool ShouldShowAeroShadowBorder() { #if BUILDFLAG(IS_WIN) return ui::win::IsAeroGlassEnabled(); @@ -131,6 +106,32 @@ return nullptr; } +// Creates text for spoken feedback from the data contained in the +// notification. +std::u16string MessageView::CreateAccessibleName( + const Notification& notification) { + if (!notification.accessible_name().empty()) + return notification.accessible_name(); + + // Fall back to text constructed from the notification. + // Add non-empty elements. + + std::vector<std::u16string> accessible_lines; + if (!notification.title().empty()) + accessible_lines.push_back(notification.title()); + + if (!notification.message().empty()) + accessible_lines.push_back(notification.message()); + + if (!notification.context_message().empty()) + accessible_lines.push_back(notification.context_message()); + std::vector<NotificationItem> items = notification.items(); + for (size_t i = 0; i < items.size() && i < kNotificationMaximumItems; ++i) { + accessible_lines.push_back(items[i].title + u" " + items[i].message); + } + return base::JoinString(accessible_lines, u"\n"); +} + void MessageView::UpdateWithNotification(const Notification& notification) { pinned_ = notification.pinned(); std::u16string new_accessible_name = CreateAccessibleName(notification); @@ -234,7 +235,7 @@ if (accessible_name_.empty()) node_data->SetNameFrom(ax::mojom::NameFrom::kAttributeExplicitlyEmpty); - node_data->SetName(accessible_name_); + node_data->SetNameChecked(accessible_name_); } bool MessageView::OnMousePressed(const ui::MouseEvent& event) {
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h index 50c7c5d..9bf2ba9 100644 --- a/ui/message_center/views/message_view.h +++ b/ui/message_center/views/message_view.h
@@ -109,6 +109,10 @@ virtual void RemoveGroupNotification(const std::string& notification_id) {} + // Creates text for spoken feedback from the data contained in the + // notification. + std::u16string CreateAccessibleName(const Notification& notification); + // Updates this view with the new data contained in the notification. virtual void UpdateWithNotification(const Notification& notification);
diff --git a/ui/ozone/platform/wayland/host/wayland_output.cc b/ui/ozone/platform/wayland/host/wayland_output.cc index 603bc1c..4719f2d 100644 --- a/ui/ozone/platform/wayland/host/wayland_output.cc +++ b/ui/ozone/platform/wayland/host/wayland_output.cc
@@ -141,21 +141,10 @@ return xdg_output_ ? xdg_output_->description() : description_; } -int64_t WaylandOutput::display_id() const { - return aura_output_ && aura_output_->display_id().has_value() - ? aura_output_->display_id().value() - : output_id_; -} - const std::string& WaylandOutput::name() const { return xdg_output_ ? xdg_output_->name() : name_; } -bool WaylandOutput::IsReady() const { - return !physical_size_.IsEmpty() && - (!aura_output_ || aura_output_->IsReady()); -} - zaura_output* WaylandOutput::get_zaura_output() { return aura_output_ ? aura_output_->wl_object() : nullptr; } @@ -178,15 +167,9 @@ scale_factor_ = max_physical_side / max_logical_side; } } - - // Wait until the aura output receives the display id. - if (aura_output_ && !aura_output_->IsReady()) - return; - - delegate_->OnOutputHandleMetrics(output_id_, display_id(), origin(), - logical_size(), physical_size_, insets(), - scale_factor_, panel_transform_, - logical_transform(), description()); + delegate_->OnOutputHandleMetrics( + output_id_, origin(), logical_size(), physical_size_, insets(), + scale_factor_, panel_transform_, logical_transform(), description()); } // static
diff --git a/ui/ozone/platform/wayland/host/wayland_output.h b/ui/ozone/platform/wayland/host/wayland_output.h index f5402c4..6264607 100644 --- a/ui/ozone/platform/wayland/host/wayland_output.h +++ b/ui/ozone/platform/wayland/host/wayland_output.h
@@ -28,12 +28,10 @@ class WaylandOutput : public wl::GlobalObjectRegistrar<WaylandOutput> { public: // Instances of this class are identified by an 32-bit unsigned int value, - // corresponding to its global wl_output object 'name' value. On - // wayland-linux, it is mostly used interchangeably with WaylandScreen's - // `display::Display::id1` property, which is an int64_t instead, though it is - // worth bearing in mind they are slightly different, under the hood. - // On lacros, the display id sent from ash-chrome is used for - // `display::Display::id`. + // corresponding to its global wl_output object 'name' value. It is mostly + // used interchangeably with WaylandScreen's display::Display::id property, + // which is an int64_t instead, though it is worth bearing in mind they are + // slightly different, under the hood. using Id = uint32_t; static constexpr char kInterfaceName[] = "wl_output"; @@ -47,7 +45,6 @@ class Delegate { public: virtual void OnOutputHandleMetrics(Id output_id, - int64_t display_id, const gfx::Point& origin, const gfx::Size& logical_size, const gfx::Size& physical_size, @@ -83,16 +80,15 @@ gfx::Size logical_size() const; gfx::Size physical_size() const { return physical_size_; } gfx::Insets insets() const; - int64_t display_id() const; const std::string& name() const; const std::string& description() const; WaylandZcrColorManagementOutput* color_management_output() const { return color_management_output_.get(); } - // Tells if the output has already received necessary screen informatoin such - // as physical screen dimensions in the global compositor space. - bool IsReady() const; + // Tells if the output has already received physical screen dimensions in the + // global compositor space. + bool is_ready() const { return !physical_size_.IsEmpty(); } wl_output* get_output() { return output_.get(); } zaura_output* get_zaura_output();
diff --git a/ui/ozone/platform/wayland/host/wayland_output_manager.cc b/ui/ozone/platform/wayland/host/wayland_output_manager.cc index 31ae8ef..ddf8c43 100644 --- a/ui/ozone/platform/wayland/host/wayland_output_manager.cc +++ b/ui/ozone/platform/wayland/host/wayland_output_manager.cc
@@ -25,7 +25,7 @@ // instantiate a valid WaylandScreen when requested by the upper layer. bool WaylandOutputManager::IsOutputReady() const { for (const auto& it : output_list_) { - if (it.second->IsReady()) + if (it.second->is_ready()) return true; } return false; @@ -54,7 +54,7 @@ wayland_output->InitializeColorManagementOutput( connection_->zcr_color_manager()); } - DCHECK(!wayland_output->IsReady()); + DCHECK(!wayland_output->is_ready()); output_list_[output_id] = std::move(wayland_output); } @@ -115,13 +115,13 @@ // automatically, and the |wayland_screen_| is notified immediately about the // changes. for (const auto& output : output_list_) { - if (output.second->IsReady()) { + if (output.second->is_ready()) { screen->OnOutputAddedOrUpdated( - output.second->output_id(), output.second->display_id(), - output.second->origin(), output.second->logical_size(), - output.second->physical_size(), output.second->insets(), - output.second->scale_factor(), output.second->panel_transform(), - output.second->logical_transform(), output.second->description()); + output.second->output_id(), output.second->origin(), + output.second->logical_size(), output.second->physical_size(), + output.second->insets(), output.second->scale_factor(), + output.second->panel_transform(), output.second->logical_transform(), + output.second->description()); } } } @@ -135,11 +135,8 @@ } WaylandOutput* WaylandOutputManager::GetPrimaryOutput() const { - if (wayland_screen_) { - auto output_id = wayland_screen_->GetOutputIdForDisplayId( - wayland_screen_->GetPrimaryDisplay().id()); - return GetOutput(output_id); - } + if (wayland_screen_) + return GetOutput(wayland_screen_->GetPrimaryDisplay().id()); return nullptr; } @@ -150,7 +147,6 @@ void WaylandOutputManager::OnOutputHandleMetrics( WaylandOutput::Id output_id, - int64_t display_id, const gfx::Point& origin, const gfx::Size& logical_size, const gfx::Size& physical_size, @@ -161,8 +157,8 @@ const std::string& description) { if (wayland_screen_) { wayland_screen_->OnOutputAddedOrUpdated( - output_id, display_id, origin, logical_size, physical_size, insets, - scale_factor, panel_transform, logical_transform, description); + output_id, origin, logical_size, physical_size, insets, scale_factor, + panel_transform, logical_transform, description); } // Update scale of the windows currently associated with |output_id|. i.e:
diff --git a/ui/ozone/platform/wayland/host/wayland_output_manager.h b/ui/ozone/platform/wayland/host/wayland_output_manager.h index 6741e72..123c45b 100644 --- a/ui/ozone/platform/wayland/host/wayland_output_manager.h +++ b/ui/ozone/platform/wayland/host/wayland_output_manager.h
@@ -60,7 +60,6 @@ private: // WaylandOutput::Delegate: void OnOutputHandleMetrics(WaylandOutput::Id output_id, - int64_t display_id, const gfx::Point& origin, const gfx::Size& logical_size, const gfx::Size& physical_size,
diff --git a/ui/ozone/platform/wayland/host/wayland_screen.cc b/ui/ozone/platform/wayland/host/wayland_screen.cc index 7701691d..f089c323 100644 --- a/ui/ozone/platform/wayland/host/wayland_screen.cc +++ b/ui/ozone/platform/wayland/host/wayland_screen.cc
@@ -126,7 +126,6 @@ WaylandScreen::~WaylandScreen() = default; void WaylandScreen::OnOutputAddedOrUpdated(WaylandOutput::Id output_id, - int64_t display_id, const gfx::Point& origin, const gfx::Size& logical_size, const gfx::Size& physical_size, @@ -135,31 +134,19 @@ int32_t panel_transform, int32_t logical_transform, const std::string& label) { - if (display_id == display::kInvalidDisplayId) { - DCHECK(display_id_map_.contains(output_id)); - display_id = display_id_map_[output_id]; - } - - AddOrUpdateDisplay(output_id, display_id, origin, logical_size, physical_size, - insets, scale, panel_transform, logical_transform, label); + AddOrUpdateDisplay(output_id, origin, logical_size, physical_size, insets, + scale, panel_transform, logical_transform, label); } void WaylandScreen::OnOutputRemoved(WaylandOutput::Id output_id) { - DCHECK(display_id_map_.contains(output_id)); - if (display_id_map_.find(output_id) == display_id_map_.end()) - return; - - int64_t display_id = display_id_map_[output_id]; - - if (display_id == GetPrimaryDisplay().id()) { + if (output_id == GetPrimaryDisplay().id()) { // First, set a new primary display as required by the |display_list_|. It's // safe to set any of the displays to be a primary one. Once the output is // completely removed, Wayland updates geometry of other displays. And a // display, which became the one to be nearest to the origin will become a // primary one. - // TODO(oshima): The server should send this info. for (const auto& display : display_list_.displays()) { - if (display.id() != display_id) { + if (display.id() != output_id) { display_list_.AddOrUpdateDisplay(display, display::DisplayList::Type::PRIMARY); break; @@ -168,17 +155,16 @@ } // TODO(https://crbug.com/1299403): Work around the symptoms of a common // crash. Unclear if this is the proper long term solution. - auto it = display_list_.FindDisplayById(display_id); + auto it = display_list_.FindDisplayById(output_id); DCHECK(it != display_list_.displays().end()); if (it != display_list_.displays().end()) { - display_list_.RemoveDisplay(display_id); + display_list_.RemoveDisplay(output_id); } else { LOG(ERROR) << "output_id is not associated with a Display."; } } void WaylandScreen::AddOrUpdateDisplay(WaylandOutput::Id output_id, - int64_t display_id, const gfx::Point& origin, const gfx::Size& logical_size, const gfx::Size& physical_size, @@ -187,8 +173,7 @@ int32_t panel_transform, int32_t logical_transform, const std::string& label) { - DCHECK_NE(display_id, display::kInvalidDisplayId); - display::Display changed_display(display_id); + display::Display changed_display(output_id); DCHECK_GE(panel_transform, WL_OUTPUT_TRANSFORM_NORMAL); DCHECK_LE(panel_transform, WL_OUTPUT_TRANSFORM_FLIPPED_270); @@ -263,14 +248,7 @@ } changed_display.set_label(label); - if (display_id_map_.find(output_id) == display_id_map_.end()) { - display_id_map_.emplace(output_id, display_id); - } else { - // TODO(oshima): Change to DCHECK if stabilized. - CHECK_EQ(display_id_map_[output_id], display_id); - } - display_id_map_[output_id] = display_id; display_list_.AddOrUpdateDisplay(changed_display, type); #if BUILDFLAG(IS_CHROMEOS_LACROS) @@ -279,15 +257,6 @@ #endif } -uint32_t WaylandScreen::GetOutputIdForDisplayId(int64_t display_id) { - auto iter = std::find_if( - display_id_map_.begin(), display_id_map_.end(), - [display_id](auto pair) { return pair.second == display_id; }); - if (iter != display_id_map_.end()) - return iter->first; - return 0; -} - void WaylandScreen::OnTabletStateChanged(display::TabletState tablet_state) { #if BUILDFLAG(IS_CHROMEOS_LACROS) tablet_state_ = tablet_state; @@ -332,17 +301,9 @@ if (!entered_output_id.has_value()) return GetPrimaryDisplay(); - if (display_id_map_.find(entered_output_id.value()) == - display_id_map_.end()) { - NOTREACHED(); - return GetPrimaryDisplay(); - } - - int64_t display_id = display_id_map_.find(entered_output_id.value())->second; - DCHECK(!display_list_.displays().empty()); for (const auto& display : display_list_.displays()) { - if (display.id() == display_id) + if (display.id() == entered_output_id.value()) return display; }
diff --git a/ui/ozone/platform/wayland/host/wayland_screen.h b/ui/ozone/platform/wayland/host/wayland_screen.h index 79a826b..3b2f385 100644 --- a/ui/ozone/platform/wayland/host/wayland_screen.h +++ b/ui/ozone/platform/wayland/host/wayland_screen.h
@@ -8,7 +8,6 @@ #include <set> #include <vector> -#include "base/containers/flat_map.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" @@ -20,7 +19,6 @@ #include "ui/gfx/buffer_types.h" #include "ui/gfx/geometry/point.h" #include "ui/ozone/platform/wayland/common/wayland_object.h" -#include "ui/ozone/platform/wayland/host/wayland_output.h" #include "ui/ozone/public/platform_screen.h" namespace gfx { @@ -44,7 +42,6 @@ ~WaylandScreen() override; void OnOutputAddedOrUpdated(uint32_t output_id, - int64_t display_id, const gfx::Point& origin, const gfx::Size& logical_size, const gfx::Size& physical_size, @@ -55,8 +52,6 @@ const std::string& label); void OnOutputRemoved(uint32_t output_id); - uint32_t GetOutputIdForDisplayId(int64_t display_id); - void OnTabletStateChanged(display::TabletState tablet_state); base::WeakPtr<WaylandScreen> GetWeakPtr(); @@ -118,7 +113,6 @@ // All parameters are in DIP screen coordinates/units except |physical_size|, // which is in physical pixels. void AddOrUpdateDisplay(uint32_t output_id, - int64_t display_id, const gfx::Point& origin, const gfx::Size& logical_size, const gfx::Size& physical_size, @@ -130,7 +124,6 @@ raw_ptr<WaylandConnection> connection_ = nullptr; - base::flat_map<WaylandOutput::Id, int64_t> display_id_map_; display::DisplayList display_list_; base::ObserverList<display::DisplayObserver> observers_;
diff --git a/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc b/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc index ad0d948..62944faa 100644 --- a/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_screen_unittest.cc
@@ -310,8 +310,7 @@ TestDisplayObserver observer; platform_screen_->AddObserver(&observer); - const uint32_t output_id = 7; - const int64_t display_id = 1ll << 34; + const uint32_t display_id = 7; const gfx::Point origin(50, 70); const gfx::Size physical_size(1200, 1600); const wl_output_transform panel_transform = WL_OUTPUT_TRANSFORM_90; @@ -322,11 +321,10 @@ // Test with missing logical size. Should fall back to calculating from // physical size. platform_screen_->OnOutputAddedOrUpdated( - output_id, display_id, origin, gfx::Size(), physical_size, insets, scale, + display_id, origin, gfx::Size(), physical_size, insets, scale, panel_transform, logical_transform, "display"); const display::Display new_display(observer.GetDisplay()); - EXPECT_EQ(output_id, platform_screen_->GetOutputIdForDisplayId(display_id)); EXPECT_EQ(new_display.id(), display_id); EXPECT_EQ(new_display.bounds(), gfx::Rect(origin, gfx::Size(800, 600))); EXPECT_EQ(new_display.GetSizeInPixel(), gfx::Size(1600, 1200)); @@ -349,12 +347,12 @@ display::Display display2(2, gfx::Rect(800, 0, 700, 500)); platform_screen_->OnOutputAddedOrUpdated( - display1.id(), display1.id(), display1.bounds().origin(), display1.size(), + display1.id(), display1.bounds().origin(), display1.size(), display1.GetSizeInPixel(), display1.GetWorkAreaInsets(), display1.device_scale_factor(), WL_OUTPUT_TRANSFORM_NORMAL, WL_OUTPUT_TRANSFORM_NORMAL, std::string()); platform_screen_->OnOutputAddedOrUpdated( - display2.id(), display2.id(), display2.bounds().origin(), display2.size(), + display2.id(), display2.bounds().origin(), display2.size(), display2.GetSizeInPixel(), display2.GetWorkAreaInsets(), display2.device_scale_factor(), WL_OUTPUT_TRANSFORM_NORMAL, WL_OUTPUT_TRANSFORM_NORMAL, std::string()); @@ -368,12 +366,12 @@ // Purposely send the output metrics out of order. platform_screen_->OnOutputAddedOrUpdated( - display2.id(), display2.id(), display2.bounds().origin(), display2.size(), + display2.id(), display2.bounds().origin(), display2.size(), display2.GetSizeInPixel(), display2.GetWorkAreaInsets(), display2.device_scale_factor(), WL_OUTPUT_TRANSFORM_NORMAL, WL_OUTPUT_TRANSFORM_NORMAL, std::string()); platform_screen_->OnOutputAddedOrUpdated( - display1.id(), display1.id(), display1.bounds().origin(), display1.size(), + display1.id(), display1.bounds().origin(), display1.size(), display1.GetSizeInPixel(), display1.GetWorkAreaInsets(), display1.device_scale_factor(), WL_OUTPUT_TRANSFORM_NORMAL, WL_OUTPUT_TRANSFORM_NORMAL, std::string());
diff --git a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc index a723876..f5bd38fb 100644 --- a/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_toplevel_window.cc
@@ -101,6 +101,7 @@ zaura_surface_set_frame(aura_surface_.get(), ZAURA_SURFACE_FRAME_TYPE_SHADOW); } + if (screen_coordinates_enabled_) SetBoundsInDIP(GetBoundsInDIP());
diff --git a/ui/ozone/platform/wayland/host/wayland_zaura_output.cc b/ui/ozone/platform/wayland/host/wayland_zaura_output.cc index 9468535..91251e4 100644 --- a/ui/ozone/platform/wayland/host/wayland_zaura_output.cc +++ b/ui/ozone/platform/wayland/host/wayland_zaura_output.cc
@@ -7,7 +7,6 @@ #include <aura-shell-client-protocol.h> #include "base/check.h" -#include "base/logging.h" namespace ui { @@ -16,21 +15,13 @@ DCHECK(obj_); static constexpr zaura_output_listener kZAuraOutputListener = { - &OnScale, &OnConnection, &OnDeviceScaleFactor, - &OnInsets, &OnLogicalTransform, &OnDisplayId}; + &OnScale, &OnConnection, &OnDeviceScaleFactor, &OnInsets, + &OnLogicalTransform}; zaura_output_add_listener(obj_.get(), &kZAuraOutputListener, this); } -WaylandZAuraOutput::WaylandZAuraOutput() : obj_(nullptr) {} - WaylandZAuraOutput::~WaylandZAuraOutput() = default; -bool WaylandZAuraOutput::IsReady() const { - return wl::get_version_of_object(obj_.get()) < - ZAURA_OUTPUT_DISPLAY_ID_SINCE_VERSION || - display_id_.has_value(); -} - void WaylandZAuraOutput::OnScale(void* data, struct zaura_output* zaura_output, uint32_t flags, @@ -61,14 +52,4 @@ aura_output->logical_transform_ = transform; } -void WaylandZAuraOutput::OnDisplayId(void* data, - struct zaura_output* zaura_output, - uint32_t display_id_hi, - uint32_t display_id_lo) { - if (auto* aura_output = static_cast<WaylandZAuraOutput*>(data)) { - aura_output->display_id_ = static_cast<int64_t>(display_id_hi) << 32 | - static_cast<int64_t>(display_id_lo); - } -} - } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_zaura_output.h b/ui/ozone/platform/wayland/host/wayland_zaura_output.h index 3432fd2..8dc1c6b 100644 --- a/ui/ozone/platform/wayland/host/wayland_zaura_output.h +++ b/ui/ozone/platform/wayland/host/wayland_zaura_output.h
@@ -7,7 +7,6 @@ #include <cstdint> -#include "base/gtest_prod_util.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/gfx/geometry/insets.h" #include "ui/ozone/platform/wayland/common/wayland_object.h" @@ -28,17 +27,8 @@ absl::optional<int32_t> logical_transform() const { return logical_transform_; } - absl::optional<int64_t> display_id() const { return display_id_; } - - // Tells If the zuara output receives its display id information when - // supported. - bool IsReady() const; private: - FRIEND_TEST_ALL_PREFIXES(WaylandZAuraOutputTest, DisplayIdConversions); - // For unit test use only. - WaylandZAuraOutput(); - // zaura_output_listeners static void OnScale(void* data, struct zaura_output* zaura_output, @@ -59,15 +49,10 @@ static void OnLogicalTransform(void* data, struct zaura_output* zaura_output, int32_t transform); - static void OnDisplayId(void* data, - struct zaura_output* zaura_output, - uint32_t display_id_hi, - uint32_t display_id_lo); wl::Object<zaura_output> obj_; gfx::Insets insets_; - absl::optional<int32_t> logical_transform_ = absl::nullopt; - absl::optional<int64_t> display_id_ = absl::nullopt; + absl::optional<int32_t> logical_transform_; }; } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc b/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc index afb41a3..9c7ef9a 100644 --- a/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_zaura_output_unittest.cc
@@ -21,12 +21,11 @@ #include "ui/ozone/platform/wayland/test/test_wayland_server_thread.h" #include "ui/ozone/platform/wayland/test/test_zaura_output.h" -#include "base/logging.h" - namespace ui { +namespace { using ::testing::Values; -namespace { + class WaylandZAuraOutputTest : public ::testing::Test { public: WaylandZAuraOutputTest() @@ -77,12 +76,10 @@ std::unique_ptr<WaylandScreen> platform_screen_; }; -} // namespace - TEST_F(WaylandZAuraOutputTest, HandleInsets) { WaylandOutput* wayland_output = output_manager_->GetPrimaryOutput(); ASSERT_TRUE(wayland_output); - EXPECT_TRUE(wayland_output->IsReady()); + EXPECT_TRUE(wayland_output->is_ready()); EXPECT_EQ(wayland_output->physical_size(), gfx::Size(800, 600)); EXPECT_TRUE(wayland_output->insets().IsEmpty()); EXPECT_TRUE(wayland_output->get_zaura_output()); @@ -103,7 +100,7 @@ server_.Pause(); // Verify that insets is updated. - EXPECT_TRUE(wayland_output->IsReady()); + EXPECT_TRUE(wayland_output->is_ready()); EXPECT_EQ(wayland_output->physical_size(), gfx::Size(800, 600)); EXPECT_EQ(wayland_output->insets(), sent_insets); } @@ -111,7 +108,7 @@ TEST_F(WaylandZAuraOutputTest, HandleLogicalTransform) { WaylandOutput* wayland_output = output_manager_->GetPrimaryOutput(); ASSERT_TRUE(wayland_output); - EXPECT_TRUE(wayland_output->IsReady()); + EXPECT_TRUE(wayland_output->is_ready()); EXPECT_FALSE(wayland_output->logical_transform()); EXPECT_TRUE(wayland_output->get_zaura_output()); @@ -126,33 +123,9 @@ base::RunLoop().RunUntilIdle(); server_.Pause(); - EXPECT_TRUE(wayland_output->IsReady()); + EXPECT_TRUE(wayland_output->is_ready()); EXPECT_EQ(wayland_output->logical_transform(), WL_OUTPUT_TRANSFORM_270); } -// Test edge case display ids are converted correctly. -TEST_F(WaylandZAuraOutputTest, DisplayIdConversions) { - const int64_t kTestIds[] = { - std::numeric_limits<int64_t>::min(), - std::numeric_limits<int64_t>::min() + 1, - static_cast<int64_t>(std::numeric_limits<int32_t>::min()) - 1, - std::numeric_limits<int32_t>::min(), - std::numeric_limits<int32_t>::min() + 1, - 0, - std::numeric_limits<int32_t>::max() - 1, - std::numeric_limits<int32_t>::max(), - static_cast<int64_t>(std::numeric_limits<int32_t>::max()) + 1, - std::numeric_limits<int64_t>::max() - 1, - std::numeric_limits<int64_t>::max()}; - - for (int64_t id : kTestIds) { - uint32_t display_id_hi = static_cast<uint32_t>(id >> 32); - uint32_t display_id_lo = static_cast<uint32_t>(id); - WaylandZAuraOutput aura_output; - WaylandZAuraOutput::OnDisplayId(&aura_output, nullptr, display_id_hi, - display_id_lo); - EXPECT_EQ(id, aura_output.display_id().value()); - } -} - -} // namespace ui +} // namespace +} // namespace ui \ No newline at end of file
diff --git a/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc b/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc index 05481b1..f6bbf17 100644 --- a/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc +++ b/ui/ozone/platform/wayland/host/wayland_zaura_shell.cc
@@ -20,7 +20,7 @@ namespace { constexpr uint32_t kMinVersion = 1; -constexpr uint32_t kMaxVersion = 43; +constexpr uint32_t kMaxVersion = 42; } // static
diff --git a/ui/shell_dialogs/select_file_dialog_linux_kde.cc b/ui/shell_dialogs/select_file_dialog_linux_kde.cc index b4b7704..6ce6256 100644 --- a/ui/shell_dialogs/select_file_dialog_linux_kde.cc +++ b/ui/shell_dialogs/select_file_dialog_linux_kde.cc
@@ -200,7 +200,7 @@ return base::GetAppOutput(command_line, &kdialog_version); } -SelectFileDialogLinuxKde* NewSelectFileDialogLinuxKde( +SelectFileDialog* NewSelectFileDialogLinuxKde( SelectFileDialog::Listener* listener, std::unique_ptr<ui::SelectFilePolicy> policy, base::nix::DesktopEnvironment desktop,
diff --git a/ui/strings/translations/ui_strings_sr-Latn.xtb b/ui/strings/translations/ui_strings_sr-Latn.xtb index 6e941bc..b55ed476 100644 --- a/ui/strings/translations/ui_strings_sr-Latn.xtb +++ b/ui/strings/translations/ui_strings_sr-Latn.xtb
@@ -152,7 +152,7 @@ <translation id="6430678249303439055">Blokiraj sva obaveštenja iz ove aplikacije</translation> <translation id="6483402905448010557">{SECONDS,plural, =1{Pre 1 sekundu}one{Pre # sekundu}few{Pre # sekunde}other{Pre # sekundi}}</translation> <translation id="6503257047630241175">RTF sadržaj</translation> -<translation id="6539092367496845964">Nešto nije u redu. Probajte ponovo kasnije.</translation> +<translation id="6539092367496845964">Došlo je do greške. Probajte ponovo kasnije.</translation> <translation id="654149438358937226">Blokiraj sva obaveštenja</translation> <translation id="6612467943526193239">Da biste izašli iz kalibracije, pritisnite Esc.</translation> <translation id="6620110761915583480">Čuvanje datoteke</translation>
diff --git a/ui/strings/translations/ui_strings_sr.xtb b/ui/strings/translations/ui_strings_sr.xtb index 7828d6c..0c893786 100644 --- a/ui/strings/translations/ui_strings_sr.xtb +++ b/ui/strings/translations/ui_strings_sr.xtb
@@ -152,7 +152,7 @@ <translation id="6430678249303439055">Блокирај сва обавештења из ове апликације</translation> <translation id="6483402905448010557">{SECONDS,plural, =1{Пре 1 секунду}one{Пре # секунду}few{Пре # секунде}other{Пре # секунди}}</translation> <translation id="6503257047630241175">RTF садржај</translation> -<translation id="6539092367496845964">Нешто није у реду. Пробајте поново касније.</translation> +<translation id="6539092367496845964">Дошло је до грешке. Пробајте поново касније.</translation> <translation id="654149438358937226">Блокирај сва обавештења</translation> <translation id="6612467943526193239">Да бисте изашли из калибрације, притисните Esc.</translation> <translation id="6620110761915583480">Чување датотеке</translation>